From 1c57709d2d091a11d164553e477c06c3117ccae7 Mon Sep 17 00:00:00 2001
From: Taras Smakula <tarassmakula@gmail.com>
Date: Mon, 4 Mar 2024 15:13:11 +0200
Subject: [PATCH] <erge create room into one fragment

---
 .../create/CreateCircleDialogFragment.kt      |  54 ------
 .../create/CreateGroupDialogFragment.kt       |  50 ------
 .../layout/dialog_fragment_create_group.xml   | 162 ------------------
 .../main/res/navigation/circles_nav_graph.xml |  33 +++-
 .../main/res/navigation/groups_nav_graph.xml  |  22 ++-
 app/src/main/res/values/strings.xml           |   1 -
 .../room/create/CreateRoomDialogFragment.kt   |  93 ++++++++--
 .../layout/dialog_fragment_create_room.xml    |  36 +++-
 core/src/main/res/values/strings.xml          |   1 +
 .../create/CreateGalleryDialogFragment.kt     |  48 ------
 .../gallery/grid/GalleryGridFragment.kt       |   3 +-
 .../layout/dialog_fragment_create_gallery.xml | 107 ------------
 .../main/res/navigation/photos_nav_graph.xml  |  22 ++-
 13 files changed, 178 insertions(+), 454 deletions(-)
 delete mode 100644 app/src/main/java/org/futo/circles/feature/circles/create/CreateCircleDialogFragment.kt
 delete mode 100644 app/src/main/java/org/futo/circles/feature/groups/create/CreateGroupDialogFragment.kt
 delete mode 100644 app/src/main/res/layout/dialog_fragment_create_group.xml
 rename app/src/main/res/layout/dialog_fragment_create_circle.xml => core/src/main/res/layout/dialog_fragment_create_room.xml (83%)
 delete mode 100644 gallery/src/main/java/org/futo/circles/gallery/feature/create/CreateGalleryDialogFragment.kt
 delete mode 100644 gallery/src/main/res/layout/dialog_fragment_create_gallery.xml

diff --git a/app/src/main/java/org/futo/circles/feature/circles/create/CreateCircleDialogFragment.kt b/app/src/main/java/org/futo/circles/feature/circles/create/CreateCircleDialogFragment.kt
deleted file mode 100644
index 6e5449912..000000000
--- a/app/src/main/java/org/futo/circles/feature/circles/create/CreateCircleDialogFragment.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.futo.circles.feature.circles.create
-
-import android.net.Uri
-import android.os.Bundle
-import android.view.View
-import androidx.core.widget.doAfterTextChanged
-import androidx.fragment.app.Fragment
-import dagger.hilt.android.AndroidEntryPoint
-import org.futo.circles.R
-import org.futo.circles.core.extensions.getText
-import org.futo.circles.core.feature.picker.helper.MediaPickerHelper
-import org.futo.circles.core.feature.room.create.CreateRoomDialogFragment
-import org.futo.circles.core.model.CircleRoomTypeArg
-import org.futo.circles.databinding.DialogFragmentCreateCircleBinding
-
-@AndroidEntryPoint
-class CreateCircleDialogFragment :
-    CreateRoomDialogFragment(DialogFragmentCreateCircleBinding::inflate) {
-
-    override val fragment: Fragment = this
-    override val inviteContainerId: Int = R.id.lContainer
-    override val mediaPickerHelper = MediaPickerHelper(this)
-
-    private val binding by lazy {
-        getBinding() as DialogFragmentCreateCircleBinding
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-        setupViews()
-    }
-
-    override fun onCoverImageSelected(uri: Uri) {
-        binding.ivCover.setImageURI(uri)
-    }
-
-    private fun setupViews() {
-        with(binding) {
-            ivCover.setOnClickListener { changeCoverImage() }
-            tilName.editText?.doAfterTextChanged {
-                it?.let { btnCreate.isEnabled = it.isNotEmpty() }
-            }
-            btnCreate.setOnClickListener {
-                createRoom(
-                    CircleRoomTypeArg.Circle,
-                    tilName.getText(),
-                    null,
-                    binding.btnPublic.isChecked
-                )
-                startLoading(btnCreate)
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/org/futo/circles/feature/groups/create/CreateGroupDialogFragment.kt b/app/src/main/java/org/futo/circles/feature/groups/create/CreateGroupDialogFragment.kt
deleted file mode 100644
index 95b9332ed..000000000
--- a/app/src/main/java/org/futo/circles/feature/groups/create/CreateGroupDialogFragment.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.futo.circles.feature.groups.create
-
-
-import android.net.Uri
-import android.os.Bundle
-import android.view.View
-import androidx.core.widget.doAfterTextChanged
-import androidx.fragment.app.Fragment
-import dagger.hilt.android.AndroidEntryPoint
-import org.futo.circles.R
-import org.futo.circles.core.extensions.getText
-import org.futo.circles.core.feature.picker.helper.MediaPickerHelper
-import org.futo.circles.core.feature.room.create.CreateRoomDialogFragment
-import org.futo.circles.core.model.CircleRoomTypeArg
-import org.futo.circles.databinding.DialogFragmentCreateGroupBinding
-
-@AndroidEntryPoint
-class CreateGroupDialogFragment :
-    CreateRoomDialogFragment(DialogFragmentCreateGroupBinding::inflate) {
-
-    override val fragment: Fragment = this
-    override val inviteContainerId: Int = R.id.lContainer
-    override val mediaPickerHelper = MediaPickerHelper(this)
-
-    private val binding by lazy {
-        getBinding() as DialogFragmentCreateGroupBinding
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-        setupViews()
-    }
-
-    override fun onCoverImageSelected(uri: Uri) {
-        binding.ivCover.setImageURI(uri)
-    }
-
-    private fun setupViews() {
-        with(binding) {
-            ivCover.setOnClickListener { changeCoverImage() }
-            tilName.editText?.doAfterTextChanged {
-                it?.let { btnCreate.isEnabled = it.isNotEmpty() }
-            }
-            btnCreate.setOnClickListener {
-                createRoom(CircleRoomTypeArg.Group, tilName.getText(), tilTopic.getText())
-                startLoading(btnCreate)
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_fragment_create_group.xml b/app/src/main/res/layout/dialog_fragment_create_group.xml
deleted file mode 100644
index 328481c8a..000000000
--- a/app/src/main/res/layout/dialog_fragment_create_group.xml
+++ /dev/null
@@ -1,162 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-
-    <com.google.android.material.appbar.MaterialToolbar
-        android:id="@+id/toolbar"
-        android:layout_width="0dp"
-        android:layout_height="?attr/actionBarSize"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:navigationIcon="?attr/homeAsUpIndicator"
-        app:title="@string/create_new_group"
-        app:titleCentered="true"
-        app:titleMarginEnd="72dp">
-
-        <org.futo.circles.core.view.LoadingButton
-            android:id="@+id/btnCreate"
-            android:layout_width="56dp"
-            android:layout_height="match_parent"
-            android:layout_gravity="end"
-            android:layout_marginVertical="8dp"
-            android:layout_marginEnd="8dp"
-            android:enabled="false"
-            android:text="@string/create"
-            android:textSize="13sp"
-            app:textPadding="1dp" />
-
-    </com.google.android.material.appbar.MaterialToolbar>
-
-
-    <View
-        android:id="@+id/toolbarDivider"
-        android:layout_width="0dp"
-        android:layout_height="@dimen/divider_height"
-        android:background="@color/divider_color"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/toolbar" />
-
-
-    <androidx.constraintlayout.widget.Guideline
-        android:id="@+id/guidelineStart"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        app:layout_constraintGuide_begin="8dp" />
-
-    <androidx.constraintlayout.widget.Guideline
-        android:id="@+id/guidelineEnd"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        app:layout_constraintGuide_end="8dp" />
-
-    <com.google.android.material.imageview.ShapeableImageView
-        android:id="@+id/ivCover"
-        android:layout_width="@dimen/group_icon_size"
-        android:layout_height="@dimen/group_icon_size"
-        android:layout_marginTop="16dp"
-        android:clickable="true"
-        android:focusable="true"
-        android:scaleType="centerCrop"
-        android:src="@drawable/add_image_placeholder"
-        app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
-        app:layout_constraintStart_toStartOf="@id/guidelineStart"
-        app:layout_constraintTop_toBottomOf="@id/toolbarDivider"
-        app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.App.GroupIconRadius" />
-
-
-    <TextView
-        android:id="@+id/tvNameHeader"
-        style="@style/headline"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="16dp"
-        android:text="@string/group_name"
-        app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
-        app:layout_constraintStart_toStartOf="@id/guidelineStart"
-        app:layout_constraintTop_toBottomOf="@id/ivCover" />
-
-    <com.google.android.material.textfield.TextInputLayout
-        android:id="@+id/tilName"
-        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="8dp"
-        app:hintEnabled="false"
-        app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
-        app:layout_constraintStart_toStartOf="@id/guidelineStart"
-        app:layout_constraintTop_toBottomOf="@id/tvNameHeader">
-
-        <com.google.android.material.textfield.TextInputEditText
-            android:id="@+id/etName"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:imeOptions="actionNext"
-            android:inputType="textCapSentences"
-            android:maxLines="1"
-            android:padding="12dp" />
-
-    </com.google.android.material.textfield.TextInputLayout>
-
-    <TextView
-        android:id="@+id/tvTopicHeader"
-        style="@style/headline"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="16dp"
-        android:text="@string/group_topic_optional"
-        app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
-        app:layout_constraintStart_toStartOf="@id/guidelineStart"
-        app:layout_constraintTop_toBottomOf="@id/tilName" />
-
-    <com.google.android.material.textfield.TextInputLayout
-        android:id="@+id/tilTopic"
-        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="8dp"
-        app:hintEnabled="false"
-        app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
-        app:layout_constraintStart_toStartOf="@id/guidelineStart"
-        app:layout_constraintTop_toBottomOf="@id/tvTopicHeader">
-
-        <com.google.android.material.textfield.TextInputEditText
-            android:id="@+id/etTopic"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:imeOptions="actionDone"
-            android:inputType="text"
-            android:maxLines="1"
-            android:padding="12dp" />
-
-    </com.google.android.material.textfield.TextInputLayout>
-
-
-    <TextView
-        android:id="@+id/tvInviteUsers"
-        style="@style/headline"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="16dp"
-        android:text="@string/invite_members"
-        app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
-        app:layout_constraintStart_toStartOf="@id/guidelineStart"
-        app:layout_constraintTop_toBottomOf="@id/tilTopic" />
-
-
-    <FrameLayout
-        android:id="@+id/lContainer"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/tvInviteUsers" />
-
-</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/navigation/circles_nav_graph.xml b/app/src/main/res/navigation/circles_nav_graph.xml
index b374b8174..2d246ed74 100644
--- a/app/src/main/res/navigation/circles_nav_graph.xml
+++ b/app/src/main/res/navigation/circles_nav_graph.xml
@@ -29,7 +29,15 @@
 
         <action
             android:id="@+id/to_createCircleDialogFragment"
-            app:destination="@id/createCircleDialogFragment" />
+            app:destination="@id/createCircleDialogFragment">
+
+            <argument
+                android:name="type"
+                android:defaultValue="Circle"
+                app:argType="org.futo.circles.core.model.CircleRoomTypeArg"
+                app:nullable="false" />
+
+        </action>
         <action
             android:id="@+id/to_invites"
             app:destination="@id/invites_nav_graph">
@@ -47,9 +55,16 @@
 
     <dialog
         android:id="@+id/createCircleDialogFragment"
-        android:name="org.futo.circles.feature.circles.create.CreateCircleDialogFragment"
-        android:label="CreateCircleDialogFragment"
-        tools:layout="@layout/dialog_fragment_create_circle" />
+        android:name="org.futo.circles.core.feature.room.create.CreateRoomDialogFragment"
+        tools:layout="@layout/dialog_fragment_create_room">
+
+        <argument
+            android:name="type"
+            android:defaultValue="Circle"
+            app:argType="org.futo.circles.core.model.CircleRoomTypeArg"
+            app:nullable="false" />
+
+    </dialog>
     <dialog
         android:id="@+id/acceptCircleInviteDialogFragment"
         android:name="org.futo.circles.feature.circles.accept_invite.AcceptCircleInviteDialogFragment"
@@ -63,7 +78,15 @@
 
         <action
             android:id="@+id/to_createCircleDialogFragment"
-            app:destination="@id/createCircleDialogFragment" />
+            app:destination="@id/createCircleDialogFragment">
+
+            <argument
+                android:name="type"
+                android:defaultValue="Circle"
+                app:argType="org.futo.circles.core.model.CircleRoomTypeArg"
+                app:nullable="false" />
+
+        </action>
 
     </dialog>
 
diff --git a/app/src/main/res/navigation/groups_nav_graph.xml b/app/src/main/res/navigation/groups_nav_graph.xml
index d296c0ef5..36a64c55d 100644
--- a/app/src/main/res/navigation/groups_nav_graph.xml
+++ b/app/src/main/res/navigation/groups_nav_graph.xml
@@ -24,7 +24,15 @@
 
         <action
             android:id="@+id/to_createGroupDialogFragment"
-            app:destination="@id/createGroupDialogFragment" />
+            app:destination="@id/createGroupDialogFragment">
+
+            <argument
+                android:name="type"
+                android:defaultValue="Group"
+                app:argType="org.futo.circles.core.model.CircleRoomTypeArg"
+                app:nullable="false" />
+
+        </action>
 
         <action
             android:id="@+id/to_invites"
@@ -46,7 +54,15 @@
 
     <dialog
         android:id="@+id/createGroupDialogFragment"
-        android:name="org.futo.circles.feature.groups.create.CreateGroupDialogFragment"
-        tools:layout="@layout/dialog_fragment_create_group" />
+        android:name="org.futo.circles.core.feature.room.create.CreateRoomDialogFragment"
+        tools:layout="@layout/dialog_fragment_create_room">
+
+        <argument
+            android:name="type"
+            android:defaultValue="Group"
+            app:argType="org.futo.circles.core.model.CircleRoomTypeArg"
+            app:nullable="false" />
+
+    </dialog>
 
 </navigation>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b78a4fdad..51facd4c3 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -188,7 +188,6 @@
     <string name="circles_empty_message">Create your first Circle</string>
     <string name="people_category_empty_message">%s will be shown here</string>
     <string name="creating_timeline">Creating timeline</string>
-    <string name="group_topic_optional">Group topic (optional)</string>
     <string name="session">Session</string>
     <string name="help">Help</string>
     <string name="optional_request_message">Optional: Request message</string>
diff --git a/core/src/main/java/org/futo/circles/core/feature/room/create/CreateRoomDialogFragment.kt b/core/src/main/java/org/futo/circles/core/feature/room/create/CreateRoomDialogFragment.kt
index 7a7dd9fd6..67e625f1d 100644
--- a/core/src/main/java/org/futo/circles/core/feature/room/create/CreateRoomDialogFragment.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/room/create/CreateRoomDialogFragment.kt
@@ -1,44 +1,55 @@
 package org.futo.circles.core.feature.room.create
 
-import android.net.Uri
 import android.os.Bundle
-import android.view.LayoutInflater
+import android.util.Log
 import android.view.View
-import android.view.ViewGroup
+import androidx.core.os.BundleCompat.getParcelable
+import androidx.core.widget.doAfterTextChanged
+import androidx.fragment.app.Fragment
 import androidx.fragment.app.viewModels
-import androidx.viewbinding.ViewBinding
+import dagger.hilt.android.AndroidEntryPoint
+import org.futo.circles.core.R
+import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment
+import org.futo.circles.core.base.fragment.HasLoadingState
+import org.futo.circles.core.databinding.DialogFragmentCreateRoomBinding
+import org.futo.circles.core.extensions.getText
 import org.futo.circles.core.extensions.observeData
 import org.futo.circles.core.extensions.observeResponse
 import org.futo.circles.core.extensions.onBackPressed
-import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment
-import org.futo.circles.core.base.fragment.HasLoadingState
-import org.futo.circles.core.model.CircleRoomTypeArg
 import org.futo.circles.core.feature.picker.helper.MediaPickerHelper
 import org.futo.circles.core.feature.select_users.SelectUsersFragment
+import org.futo.circles.core.model.CircleRoomTypeArg
 
-abstract class CreateRoomDialogFragment(inflate: (LayoutInflater, ViewGroup?, Boolean) -> ViewBinding) :
-    BaseFullscreenDialogFragment(inflate), HasLoadingState {
+@AndroidEntryPoint
+class CreateRoomDialogFragment :
+    BaseFullscreenDialogFragment(DialogFragmentCreateRoomBinding::inflate), HasLoadingState {
 
-    abstract val inviteContainerId: Int?
-    abstract val mediaPickerHelper: MediaPickerHelper
+    override val fragment: Fragment = this
     private val viewModel by viewModels<CreateRoomViewModel>()
-    private var selectedUsersFragment: SelectUsersFragment? = null
+    private val binding by lazy {
+        getBinding() as DialogFragmentCreateRoomBinding
+    }
 
-    abstract fun onCoverImageSelected(uri: Uri)
+    private val mediaPickerHelper = MediaPickerHelper(this)
+    private val roomType: CircleRoomTypeArg by lazy {
+        getParcelable(requireArguments(), "type", CircleRoomTypeArg::class.java)
+            ?: CircleRoomTypeArg.Group
+    }
+    private var selectedUsersFragment: SelectUsersFragment? = null
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
-        inviteContainerId?.let { addSelectUsersFragment(it) }
+        if (savedInstanceState == null) addSelectUsersFragment()
         setupObservers()
     }
 
-    protected fun changeCoverImage() {
+    private fun changeCoverImage() {
         mediaPickerHelper.showMediaPickerDialog(onImageSelected = { _, uri ->
             viewModel.setImageUri(uri)
         })
     }
 
-    protected fun createRoom(
+    private fun createRoom(
         type: CircleRoomTypeArg,
         name: String,
         topic: String? = null,
@@ -55,18 +66,62 @@ abstract class CreateRoomDialogFragment(inflate: (LayoutInflater, ViewGroup?, Bo
 
     private fun setupObservers() {
         viewModel.selectedImageLiveData.observeData(this) {
-            onCoverImageSelected(it)
+            binding.ivCover.setImageURI(it)
         }
         viewModel.createRoomResponseLiveData.observeResponse(this,
             success = { onBackPressed() }
         )
     }
 
-    private fun addSelectUsersFragment(containerId: Int) {
+    private fun addSelectUsersFragment() {
         selectedUsersFragment = SelectUsersFragment.create(null).also {
             childFragmentManager.beginTransaction()
-                .replace(containerId, it)
+                .replace(R.id.lContainer, it)
                 .commitAllowingStateLoss()
         }
     }
+
+    private fun setupViewsCircle() {
+        with(binding) {
+            ivCover.setOnClickListener { changeCoverImage() }
+            tilName.editText?.doAfterTextChanged {
+                it?.let { btnCreate.isEnabled = it.isNotEmpty() }
+            }
+            btnCreate.setOnClickListener {
+                createRoom(
+                    CircleRoomTypeArg.Circle,
+                    tilName.getText(),
+                    null,
+                    binding.btnPublic.isChecked
+                )
+                startLoading(btnCreate)
+            }
+        }
+    }
+
+    private fun setupViewsGroup() {
+        with(binding) {
+            ivCover.setOnClickListener { changeCoverImage() }
+            tilName.editText?.doAfterTextChanged {
+                it?.let { btnCreate.isEnabled = it.isNotEmpty() }
+            }
+            btnCreate.setOnClickListener {
+                createRoom(CircleRoomTypeArg.Group, tilName.getText(), tilTopic.getText())
+                startLoading(btnCreate)
+            }
+        }
+    }
+
+    private fun setupViewsGallery() {
+        with(binding) {
+            ivCover.setOnClickListener { changeCoverImage() }
+            tilName.editText?.doAfterTextChanged {
+                it?.let { btnCreate.isEnabled = it.isNotEmpty() }
+            }
+            btnCreate.setOnClickListener {
+                createRoom(CircleRoomTypeArg.Photo, tilName.getText())
+                startLoading(btnCreate)
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_fragment_create_circle.xml b/core/src/main/res/layout/dialog_fragment_create_room.xml
similarity index 83%
rename from app/src/main/res/layout/dialog_fragment_create_circle.xml
rename to core/src/main/res/layout/dialog_fragment_create_room.xml
index 5a4f4cf85..9a98127d7 100644
--- a/app/src/main/res/layout/dialog_fragment_create_circle.xml
+++ b/core/src/main/res/layout/dialog_fragment_create_room.xml
@@ -104,6 +104,40 @@
 
     </com.google.android.material.textfield.TextInputLayout>
 
+    <TextView
+        android:id="@+id/tvTopicHeader"
+        style="@style/headline"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:text="@string/group_topic_optional"
+        app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
+        app:layout_constraintStart_toStartOf="@id/guidelineStart"
+        app:layout_constraintTop_toBottomOf="@id/tilName" />
+
+    <com.google.android.material.textfield.TextInputLayout
+        android:id="@+id/tilTopic"
+        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="8dp"
+        app:hintEnabled="false"
+        app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
+        app:layout_constraintStart_toStartOf="@id/guidelineStart"
+        app:layout_constraintTop_toBottomOf="@id/tvTopicHeader">
+
+        <com.google.android.material.textfield.TextInputEditText
+            android:id="@+id/etTopic"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:imeOptions="actionDone"
+            android:inputType="text"
+            android:maxLines="1"
+            android:padding="12dp" />
+
+    </com.google.android.material.textfield.TextInputLayout>
+
+
     <TextView
         android:id="@+id/tvTypeHeader"
         style="@style/headline"
@@ -113,7 +147,7 @@
         android:text="@string/circle_type"
         app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
         app:layout_constraintStart_toStartOf="@id/guidelineStart"
-        app:layout_constraintTop_toBottomOf="@+id/tilName" />
+        app:layout_constraintTop_toBottomOf="@+id/tilTopic" />
 
     <RadioGroup
         android:id="@+id/circleTypeGroup"
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index 771a28d27..c79f6eaee 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -129,6 +129,7 @@
     <string name="circle_name">Circle name</string>
     <string name="circle_type">Circle type</string>
     <string name="public_type">Public</string>
+    <string name="group_topic_optional">Group topic (optional)</string>
     <string name="public_circle_explanation">Other users can ask to join</string>
     <string name="private_type">Private</string>
     <string name="private_circle_explanation">Accessible only by your invitation</string>
diff --git a/gallery/src/main/java/org/futo/circles/gallery/feature/create/CreateGalleryDialogFragment.kt b/gallery/src/main/java/org/futo/circles/gallery/feature/create/CreateGalleryDialogFragment.kt
deleted file mode 100644
index 32ca176c1..000000000
--- a/gallery/src/main/java/org/futo/circles/gallery/feature/create/CreateGalleryDialogFragment.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.futo.circles.gallery.feature.create
-
-import android.net.Uri
-import android.os.Bundle
-import android.view.View
-import androidx.core.widget.doAfterTextChanged
-import androidx.fragment.app.Fragment
-import dagger.hilt.android.AndroidEntryPoint
-import org.futo.circles.core.extensions.getText
-import org.futo.circles.core.feature.picker.helper.MediaPickerHelper
-import org.futo.circles.core.feature.room.create.CreateRoomDialogFragment
-import org.futo.circles.core.model.CircleRoomTypeArg
-import org.futo.circles.gallery.databinding.DialogFragmentCreateGalleryBinding
-
-@AndroidEntryPoint
-class CreateGalleryDialogFragment :
-    CreateRoomDialogFragment(DialogFragmentCreateGalleryBinding::inflate) {
-
-    override val fragment: Fragment = this
-    override val inviteContainerId: Int? = null
-    override val mediaPickerHelper = MediaPickerHelper(this)
-
-    private val binding by lazy {
-        getBinding() as DialogFragmentCreateGalleryBinding
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-        setupViews()
-    }
-
-    override fun onCoverImageSelected(uri: Uri) {
-        binding.ivCover.setImageURI(uri)
-    }
-
-    private fun setupViews() {
-        with(binding) {
-            ivCover.setOnClickListener { changeCoverImage() }
-            tilName.editText?.doAfterTextChanged {
-                it?.let { btnCreate.isEnabled = it.isNotEmpty() }
-            }
-            btnCreate.setOnClickListener {
-                createRoom(CircleRoomTypeArg.Photo, tilName.getText())
-                startLoading(btnCreate)
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/gallery/src/main/java/org/futo/circles/gallery/feature/gallery/grid/GalleryGridFragment.kt b/gallery/src/main/java/org/futo/circles/gallery/feature/gallery/grid/GalleryGridFragment.kt
index c033d5e2f..4071678c4 100644
--- a/gallery/src/main/java/org/futo/circles/gallery/feature/gallery/grid/GalleryGridFragment.kt
+++ b/gallery/src/main/java/org/futo/circles/gallery/feature/gallery/grid/GalleryGridFragment.kt
@@ -73,7 +73,8 @@ class GalleryGridFragment : Fragment(R.layout.fragment_gallery_grid) {
                     binding.rvGallery.getRecyclerView()
                         .findViewHolderForAdapterPosition(returnViewPosition) ?: return
 
-                val t = selectedViewHolder.itemView.findViewById<View>(R.id.ivCover)
+                val t =
+                    selectedViewHolder.itemView.findViewById<View>(org.futo.circles.core.R.id.ivCover)
                 sharedElements[names[0]] = t
                 returnViewPosition = -1
             }
diff --git a/gallery/src/main/res/layout/dialog_fragment_create_gallery.xml b/gallery/src/main/res/layout/dialog_fragment_create_gallery.xml
deleted file mode 100644
index 9c81ccdf6..000000000
--- a/gallery/src/main/res/layout/dialog_fragment_create_gallery.xml
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-
-    <com.google.android.material.appbar.MaterialToolbar
-        android:id="@+id/toolbar"
-        android:layout_width="0dp"
-        android:layout_height="?attr/actionBarSize"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:navigationIcon="?attr/homeAsUpIndicator"
-        app:title="@string/create_new_gallery"
-        app:titleCentered="true"
-        app:titleMarginEnd="72dp">
-
-        <org.futo.circles.core.view.LoadingButton
-            android:id="@+id/btnCreate"
-            android:layout_width="56dp"
-            android:layout_height="match_parent"
-            android:layout_gravity="end"
-            android:layout_marginVertical="8dp"
-            android:layout_marginEnd="8dp"
-            android:enabled="false"
-            android:text="@string/create"
-            android:textSize="13sp"
-            app:textPadding="1dp" />
-
-    </com.google.android.material.appbar.MaterialToolbar>
-
-
-    <View
-        android:id="@+id/toolbarDivider"
-        android:layout_width="0dp"
-        android:layout_height="@dimen/divider_height"
-        android:background="@color/divider_color"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/toolbar" />
-
-
-    <androidx.constraintlayout.widget.Guideline
-        android:id="@+id/guidelineStart"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        app:layout_constraintGuide_begin="8dp" />
-
-    <androidx.constraintlayout.widget.Guideline
-        android:id="@+id/guidelineEnd"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        app:layout_constraintGuide_end="8dp" />
-
-    <com.google.android.material.imageview.ShapeableImageView
-        android:id="@+id/ivCover"
-        android:layout_width="@dimen/group_icon_size"
-        android:layout_height="@dimen/group_icon_size"
-        android:layout_marginTop="16dp"
-        android:clickable="true"
-        android:focusable="true"
-        android:scaleType="centerCrop"
-        android:src="@drawable/add_image_placeholder"
-        app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
-        app:layout_constraintStart_toStartOf="@id/guidelineStart"
-        app:layout_constraintTop_toBottomOf="@id/toolbarDivider"
-        app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.App.GroupIconRadius" />
-
-
-    <TextView
-        android:id="@+id/tvNameHeader"
-        style="@style/headline"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="16dp"
-        android:text="@string/gallery_name"
-        app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
-        app:layout_constraintStart_toStartOf="@id/guidelineStart"
-        app:layout_constraintTop_toBottomOf="@id/ivCover" />
-
-    <com.google.android.material.textfield.TextInputLayout
-        android:id="@+id/tilName"
-        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="8dp"
-        app:hintEnabled="false"
-        app:layout_constraintEnd_toEndOf="@id/guidelineEnd"
-        app:layout_constraintStart_toStartOf="@id/guidelineStart"
-        app:layout_constraintTop_toBottomOf="@id/tvNameHeader">
-
-        <com.google.android.material.textfield.TextInputEditText
-            android:id="@+id/etName"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:imeOptions="actionNext"
-            android:inputType="textCapSentences"
-            android:maxLines="1"
-            android:padding="12dp" />
-
-    </com.google.android.material.textfield.TextInputLayout>
-
-</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/gallery/src/main/res/navigation/photos_nav_graph.xml b/gallery/src/main/res/navigation/photos_nav_graph.xml
index eee66c918..287e1f7c9 100644
--- a/gallery/src/main/res/navigation/photos_nav_graph.xml
+++ b/gallery/src/main/res/navigation/photos_nav_graph.xml
@@ -13,7 +13,15 @@
 
         <action
             android:id="@+id/to_createGalleryDialogFragment"
-            app:destination="@id/createGalleryDialogFragment" />
+            app:destination="@id/createGalleryDialogFragment">
+
+            <argument
+                android:name="type"
+                android:defaultValue="Photo"
+                app:argType="org.futo.circles.core.model.CircleRoomTypeArg"
+                app:nullable="false" />
+
+        </action>
 
         <action
             android:id="@+id/to_galleryFragment"
@@ -43,8 +51,16 @@
 
     <dialog
         android:id="@+id/createGalleryDialogFragment"
-        android:name="org.futo.circles.gallery.feature.create.CreateGalleryDialogFragment"
-        tools:layout="@layout/dialog_fragment_create_gallery" />
+        android:name="org.futo.circles.core.feature.room.create.CreateRoomDialogFragment"
+        tools:layout="@layout/dialog_fragment_create_room">
+
+        <argument
+            android:name="type"
+            android:defaultValue="Photo"
+            app:argType="org.futo.circles.core.model.CircleRoomTypeArg"
+            app:nullable="false" />
+
+    </dialog>
     <dialog
         android:id="@+id/galleryFragment"
         android:name="org.futo.circles.gallery.feature.gallery.GalleryDialogFragment"
-- 
GitLab