From 4c5bffe0f5445bcc271df9fcee77f787c64a7422 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Jun 2019 16:07:35 +0200 Subject: [PATCH] Create room screen - WIP TODO: screen rotation - navigate to created room --- .../room/model/create/CreateRoomParams.kt | 2 +- .../session/room/create/CreateRoomTask.kt | 1 + .../features/form/FormEditTextItem.kt | 77 ++++++++++++ .../features/form/FormSwitchItem.kt | 77 ++++++++++++ .../roomdirectory/PublicRoomsFragment.kt | 5 +- .../roomdirectory/RoomDirectoryActivity.kt | 6 + .../roomdirectory/RoomDirectoryModule.kt | 11 +- .../createroom/CreateRoomController.kt | 112 ++++++++++++++++++ .../createroom/CreateRoomFragment.kt | 104 ++++++++++++++++ .../createroom/CreateRoomViewModel.kt | 80 +++++++++++++ .../createroom/CreateRoomViewState.kt | 28 +++++ vector/src/main/res/drawable/ic_x_18dp.xml | 14 +++ .../main/res/layout/fragment_create_room.xml | 71 +++++++++++ .../src/main/res/layout/item_form_switch.xml | 62 ++++++++++ .../main/res/layout/item_form_text_input.xml | 39 ++++++ .../main/res/menu/vector_room_creation.xml | 6 +- vector/src/main/res/values/dimens.xml | 3 + vector/src/main/res/values/strings_riotX.xml | 9 ++ 18 files changed, 698 insertions(+), 9 deletions(-) create mode 100644 vector/src/main/java/im/vector/riotredesign/features/form/FormEditTextItem.kt create mode 100644 vector/src/main/java/im/vector/riotredesign/features/form/FormSwitchItem.kt create mode 100644 vector/src/main/java/im/vector/riotredesign/features/roomdirectory/createroom/CreateRoomController.kt create mode 100644 vector/src/main/java/im/vector/riotredesign/features/roomdirectory/createroom/CreateRoomFragment.kt create mode 100644 vector/src/main/java/im/vector/riotredesign/features/roomdirectory/createroom/CreateRoomViewModel.kt create mode 100644 vector/src/main/java/im/vector/riotredesign/features/roomdirectory/createroom/CreateRoomViewState.kt create mode 100644 vector/src/main/res/drawable/ic_x_18dp.xml create mode 100644 vector/src/main/res/layout/fragment_create_room.xml create mode 100644 vector/src/main/res/layout/item_form_switch.xml create mode 100644 vector/src/main/res/layout/item_form_text_input.xml diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/create/CreateRoomParams.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/create/CreateRoomParams.kt index 8347d0af46..5f732d2b31 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/create/CreateRoomParams.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/create/CreateRoomParams.kt @@ -100,7 +100,7 @@ class CreateRoomParams { * private_chat => join_rules is set to invite. history_visibility is set to shared. * trusted_private_chat => join_rules is set to invite. history_visibility is set to shared. All invitees are given the same power level as the * room creator. - * public_chat: => join_rules is set to public. history_visibility is set to shared. One of: ["private_chat", "public_chat", "trusted_private_chat"] + * public_chat: => join_rules is set to public. history_visibility is set to shared. */ var preset: CreateRoomPreset? = null diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/create/CreateRoomTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/create/CreateRoomTask.kt index b3aa137a03..45c3c8b1ec 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/create/CreateRoomTask.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/create/CreateRoomTask.kt @@ -54,6 +54,7 @@ internal class DefaultCreateRoomTask(private val roomAPI: RoomAPI, handlerThread.start() val handler = Handler(handlerThread.looper) + // TODO Maybe do the same code for join room request ? handler.post { val realm = Realm.getInstance(realmConfiguration) diff --git a/vector/src/main/java/im/vector/riotredesign/features/form/FormEditTextItem.kt b/vector/src/main/java/im/vector/riotredesign/features/form/FormEditTextItem.kt new file mode 100644 index 0000000000..2d60a9c05d --- /dev/null +++ b/vector/src/main/java/im/vector/riotredesign/features/form/FormEditTextItem.kt @@ -0,0 +1,77 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotredesign.features.form + +import com.airbnb.epoxy.EpoxyAttribute +import com.airbnb.epoxy.EpoxyModelClass +import com.google.android.material.textfield.TextInputEditText +import com.google.android.material.textfield.TextInputLayout +import im.vector.riotredesign.R +import im.vector.riotredesign.core.epoxy.VectorEpoxyHolder +import im.vector.riotredesign.core.epoxy.VectorEpoxyModel +import im.vector.riotredesign.core.platform.SimpleTextWatcher + +@EpoxyModelClass(layout = R.layout.item_form_text_input) +abstract class FormEditTextItem : VectorEpoxyModel() { + + @EpoxyAttribute + var hint: String? = null + + @EpoxyAttribute + var value: String? = null + + @EpoxyAttribute + var enabled: Boolean = true + + @EpoxyAttribute + var onTextChange: ((String) -> Unit)? = null + + + override fun bind(holder: Holder) { + holder.textInputLayout.isEnabled = enabled + holder.textInputLayout.hint = hint + + // Update only if text is different + if (holder.textInputEditText.text.toString() != value) { + holder.textInputEditText.setText(value) + } + holder.textInputEditText.isEnabled = enabled + + holder.textInputEditText.addTextChangedListener(object : SimpleTextWatcher() { + override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { + onTextChange?.invoke(s.toString()) + } + }) + } + + override fun shouldSaveViewState(): Boolean { + return true + } + + override fun unbind(holder: Holder) { + super.unbind(holder) + + // TODO Remove onTextChanged? + + } + + class Holder : VectorEpoxyHolder() { + val textInputLayout by bind(R.id.formTextInputTextInputLayout) + val textInputEditText by bind(R.id.formTextInputTextInputEditText) + } +} + diff --git a/vector/src/main/java/im/vector/riotredesign/features/form/FormSwitchItem.kt b/vector/src/main/java/im/vector/riotredesign/features/form/FormSwitchItem.kt new file mode 100644 index 0000000000..96bb2e0703 --- /dev/null +++ b/vector/src/main/java/im/vector/riotredesign/features/form/FormSwitchItem.kt @@ -0,0 +1,77 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotredesign.features.form + +import android.widget.TextView +import com.airbnb.epoxy.EpoxyAttribute +import com.airbnb.epoxy.EpoxyModelClass +import com.google.android.material.switchmaterial.SwitchMaterial +import im.vector.riotredesign.R +import im.vector.riotredesign.core.epoxy.VectorEpoxyHolder +import im.vector.riotredesign.core.epoxy.VectorEpoxyModel +import im.vector.riotredesign.core.extensions.setTextOrHide + +@EpoxyModelClass(layout = R.layout.item_form_switch) +abstract class FormSwitchItem : VectorEpoxyModel() { + + @EpoxyAttribute + var listener: ((Boolean) -> Unit)? = null + + @EpoxyAttribute + var enabled: Boolean = true + + @EpoxyAttribute + var switchChecked: Boolean = false + + @EpoxyAttribute + var title: String? = null + + @EpoxyAttribute + var summary: String? = null + + override fun bind(holder: Holder) { + holder.titleView.text = title + holder.summaryView.setTextOrHide(summary) + + holder.switchView.isEnabled = enabled + + holder.switchView.isChecked = switchChecked + + holder.switchView.setOnCheckedChangeListener { _, isChecked -> + listener?.invoke(isChecked) + } + } + + override fun shouldSaveViewState(): Boolean { + return true + } + + override fun unbind(holder: Holder) { + super.unbind(holder) + + holder.switchView.setOnCheckedChangeListener(null) + } + + + class Holder : VectorEpoxyHolder() { + val titleView by bind(R.id.formSwitchTitle) + val summaryView by bind(R.id.formSwitchSummary) + val switchView by bind(R.id.formSwitchSwitch) + } + +} + diff --git a/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/PublicRoomsFragment.kt b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/PublicRoomsFragment.kt index 5deab028f2..7b8e88fffa 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/PublicRoomsFragment.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/PublicRoomsFragment.kt @@ -76,9 +76,8 @@ class PublicRoomsFragment : VectorBaseFragment(), PublicRoomsController.Callback .disposeOnDestroy() publicRoomsCreateNewRoom.setOnClickListener { - // TODO homeActivityViewModel.createRoom() - - vectorBaseActivity.notImplemented() + // TODO Not the best navigation pattern + (vectorBaseActivity as? RoomDirectoryActivity)?.gotoCreateRoom() } viewModel.joinRoomErrorLiveData.observe(this, Observer { diff --git a/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/RoomDirectoryActivity.kt b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/RoomDirectoryActivity.kt index c0ac91ee02..639076213f 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/RoomDirectoryActivity.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/RoomDirectoryActivity.kt @@ -19,7 +19,9 @@ package im.vector.riotredesign.features.roomdirectory import android.os.Bundle import im.vector.riotredesign.R import im.vector.riotredesign.core.extensions.addFragment +import im.vector.riotredesign.core.extensions.addFragmentToBackstack import im.vector.riotredesign.core.platform.VectorBaseActivity +import im.vector.riotredesign.features.roomdirectory.createroom.CreateRoomFragment import org.koin.android.scope.ext.android.bindScope import org.koin.android.scope.ext.android.getOrCreateScope @@ -40,4 +42,8 @@ class RoomDirectoryActivity : VectorBaseActivity() { } } + + fun gotoCreateRoom() { + addFragmentToBackstack(CreateRoomFragment(), R.id.simpleFragmentContainer) + } } \ No newline at end of file diff --git a/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/RoomDirectoryModule.kt b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/RoomDirectoryModule.kt index 6dcdb93277..2ac228640c 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/RoomDirectoryModule.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/RoomDirectoryModule.kt @@ -17,11 +17,11 @@ package im.vector.riotredesign.features.roomdirectory import im.vector.matrix.android.api.session.Session +import im.vector.riotredesign.features.roomdirectory.createroom.CreateRoomController import im.vector.riotredesign.features.roomdirectory.picker.RoomDirectoryListCreator import im.vector.riotredesign.features.roomdirectory.picker.RoomDirectoryPickerController import org.koin.dsl.module.module -// TODO Ganfra: When do we create a new module? class RoomDirectoryModule { companion object { @@ -41,5 +41,14 @@ class RoomDirectoryModule { scope(ROOM_DIRECTORY_SCOPE) { PublicRoomsController(get(), get()) } + + /* ========================================================================================== + * Create room + * ========================================================================================== */ + + scope(ROOM_DIRECTORY_SCOPE) { + CreateRoomController(get(), get()) + } + } } \ No newline at end of file diff --git a/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/createroom/CreateRoomController.kt b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/createroom/CreateRoomController.kt new file mode 100644 index 0000000000..6d925e08eb --- /dev/null +++ b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/createroom/CreateRoomController.kt @@ -0,0 +1,112 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotredesign.features.roomdirectory.createroom + +import com.airbnb.epoxy.TypedEpoxyController +import com.airbnb.mvrx.Fail +import com.airbnb.mvrx.Loading +import com.airbnb.mvrx.Success +import com.airbnb.mvrx.Uninitialized +import im.vector.riotredesign.R +import im.vector.riotredesign.core.epoxy.errorWithRetryItem +import im.vector.riotredesign.core.epoxy.loadingItem +import im.vector.riotredesign.core.error.ErrorFormatter +import im.vector.riotredesign.core.resources.StringProvider +import im.vector.riotredesign.features.form.formEditTextItem +import im.vector.riotredesign.features.form.formSwitchItem + +class CreateRoomController(private val stringProvider: StringProvider, + private val errorFormatter: ErrorFormatter +) : TypedEpoxyController() { + + var listener: Listener? = null + + var index = 0 + + override fun buildModels(viewState: CreateRoomViewState) { + val asyncCreateRoom = viewState.asyncCreateRoomRequest + + when (asyncCreateRoom) { + is Success -> { + // Nothing to display, the screen will be closed + } + is Loading -> { + // display the form + buildForm(viewState, false) + loadingItem { + id("loading") + } + } + is Uninitialized -> { + // display the form + buildForm(viewState, true) + } + is Fail -> { + // display the form + buildForm(viewState, true) + errorWithRetryItem { + id("error") + text(errorFormatter.toHumanReadable(asyncCreateRoom.error)) + listener { listener?.retry() } + } + } + } + } + + private fun buildForm(viewState: CreateRoomViewState, enableFormElement: Boolean) { + formEditTextItem { + id("name") + enabled(enableFormElement) + value(viewState.roomName) + hint(stringProvider.getString(R.string.create_room_name_hint)) + + onTextChange { text -> + listener?.onNameChange(text) + } + } + formSwitchItem { + id("public") + enabled(enableFormElement) + title(stringProvider.getString(R.string.create_room_public_title)) + summary(stringProvider.getString(R.string.create_room_public_description)) + switchChecked(viewState.isPublic) + + listener { value -> + listener?.setIsPublic(value) + } + } + formSwitchItem { + id("directory") + enabled(enableFormElement) + title(stringProvider.getString(R.string.create_room_directory_title)) + summary(stringProvider.getString(R.string.create_room_directory_description)) + switchChecked(viewState.isInRoomDirectory) + + listener { value -> + listener?.setIsInRoomDirectory(value) + } + } + } + + interface Listener { + fun onNameChange(newName: String) + fun setIsPublic(isPublic: Boolean) + fun setIsInRoomDirectory(isInRoomDirectory: Boolean) + fun retry() + } + +} diff --git a/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/createroom/CreateRoomFragment.kt b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/createroom/CreateRoomFragment.kt new file mode 100644 index 0000000000..58630118ed --- /dev/null +++ b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/createroom/CreateRoomFragment.kt @@ -0,0 +1,104 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotredesign.features.roomdirectory.createroom + +import android.os.Bundle +import android.view.MenuItem +import androidx.recyclerview.widget.LinearLayoutManager +import com.airbnb.mvrx.Success +import com.airbnb.mvrx.fragmentViewModel +import com.airbnb.mvrx.withState +import im.vector.riotredesign.R +import im.vector.riotredesign.core.platform.VectorBaseFragment +import im.vector.riotredesign.features.roomdirectory.RoomDirectoryModule +import kotlinx.android.synthetic.main.fragment_create_room.* +import org.koin.android.ext.android.inject +import org.koin.android.scope.ext.android.bindScope +import org.koin.android.scope.ext.android.getOrCreateScope +import timber.log.Timber + +class CreateRoomFragment : VectorBaseFragment(), CreateRoomController.Listener { + + private val viewModel: CreateRoomViewModel by fragmentViewModel() + private val createRoomController: CreateRoomController by inject() + + override fun getLayoutResId() = R.layout.fragment_create_room + + override fun getMenuRes() = R.menu.vector_room_creation + + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + bindScope(getOrCreateScope(RoomDirectoryModule.ROOM_DIRECTORY_SCOPE)) + + vectorBaseActivity.setSupportActionBar(createRoomToolbar) + + setupRecyclerView() + + createRoomClose.setOnClickListener { + // TODO Not the best way to manage Fragment Backstack... + vectorBaseActivity.onBackPressed() + } + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + return when (item.itemId) { + R.id.action_create_room -> { + viewModel.doCreateRoom() + true + } + else -> + super.onOptionsItemSelected(item) + } + } + + private fun setupRecyclerView() { + val layoutManager = LinearLayoutManager(context) + + createRoomForm.layoutManager = layoutManager + createRoomController.listener = this + + createRoomForm.setController(createRoomController) + } + + override fun onNameChange(newName: String) { + viewModel.setName(newName) + } + + override fun setIsPublic(isPublic: Boolean) { + viewModel.setIsPublic(isPublic) + } + + override fun setIsInRoomDirectory(isInRoomDirectory: Boolean) { + viewModel.setIsInRoomDirectory(isInRoomDirectory) + } + + override fun retry() { + Timber.v("Retry") + viewModel.doCreateRoom() + } + + override fun invalidate() = withState(viewModel) { state -> + if (state.asyncCreateRoomRequest is Success) { + vectorBaseActivity.notImplemented("navigate to freshly created room") + } else { + // Populate list with Epoxy + createRoomController.setData(state) + } + } + + +} diff --git a/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/createroom/CreateRoomViewModel.kt b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/createroom/CreateRoomViewModel.kt new file mode 100644 index 0000000000..125330db5d --- /dev/null +++ b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/createroom/CreateRoomViewModel.kt @@ -0,0 +1,80 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotredesign.features.roomdirectory.createroom + +import com.airbnb.mvrx.* +import im.vector.matrix.android.api.MatrixCallback +import im.vector.matrix.android.api.session.Session +import im.vector.matrix.android.api.session.room.model.RoomDirectoryVisibility +import im.vector.matrix.android.api.session.room.model.create.CreateRoomParams +import im.vector.matrix.android.api.session.room.model.create.CreateRoomPreset +import im.vector.riotredesign.core.platform.VectorViewModel +import org.koin.android.ext.android.get + +class CreateRoomViewModel(initialState: CreateRoomViewState, + private val session: Session) : VectorViewModel(initialState) { + + companion object : MvRxViewModelFactory { + + @JvmStatic + override fun create(viewModelContext: ViewModelContext, state: CreateRoomViewState): CreateRoomViewModel? { + val currentSession = viewModelContext.activity.get() + + return CreateRoomViewModel(state, currentSession) + } + } + + fun setName(newName: String) = setState { copy(roomName = newName) } + + fun setIsPublic(value: Boolean) = setState { copy(isPublic = value) } + + fun setIsInRoomDirectory(isInRoomDirectory: Boolean) = setState { copy(isInRoomDirectory = isInRoomDirectory) } + + fun doCreateRoom() = withState { state -> + if (state.asyncCreateRoomRequest is Loading || state.asyncCreateRoomRequest is Success) { + return@withState + } + + setState { + copy(asyncCreateRoomRequest = Loading()) + } + + val createRoomParams = CreateRoomParams().apply { + name = state.roomName.takeIf { it.isNotBlank() } + + // Directory visibility + visibility = if (state.isInRoomDirectory) RoomDirectoryVisibility.PUBLIC else RoomDirectoryVisibility.PRIVATE + + preset = if (state.isPublic) CreateRoomPreset.PRESET_PUBLIC_CHAT else CreateRoomPreset.PRESET_PRIVATE_CHAT + } + + session.createRoom(createRoomParams, object : MatrixCallback { + override fun onSuccess(data: String) { + setState { + copy(asyncCreateRoomRequest = Success(data)) + } + } + + override fun onFailure(failure: Throwable) { + setState { + copy(asyncCreateRoomRequest = Fail(failure)) + } + } + }) + } + +} \ No newline at end of file diff --git a/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/createroom/CreateRoomViewState.kt b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/createroom/CreateRoomViewState.kt new file mode 100644 index 0000000000..42d9d14473 --- /dev/null +++ b/vector/src/main/java/im/vector/riotredesign/features/roomdirectory/createroom/CreateRoomViewState.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotredesign.features.roomdirectory.createroom + +import com.airbnb.mvrx.Async +import com.airbnb.mvrx.MvRxState +import com.airbnb.mvrx.Uninitialized + +data class CreateRoomViewState( + val roomName: String = "", + val isPublic: Boolean = false, + val isInRoomDirectory: Boolean = false, + val asyncCreateRoomRequest: Async = Uninitialized +) : MvRxState \ No newline at end of file diff --git a/vector/src/main/res/drawable/ic_x_18dp.xml b/vector/src/main/res/drawable/ic_x_18dp.xml new file mode 100644 index 0000000000..3172da8cc2 --- /dev/null +++ b/vector/src/main/res/drawable/ic_x_18dp.xml @@ -0,0 +1,14 @@ + + + diff --git a/vector/src/main/res/layout/fragment_create_room.xml b/vector/src/main/res/layout/fragment_create_room.xml new file mode 100644 index 0000000000..f5eeeb31a0 --- /dev/null +++ b/vector/src/main/res/layout/fragment_create_room.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vector/src/main/res/layout/item_form_switch.xml b/vector/src/main/res/layout/item_form_switch.xml new file mode 100644 index 0000000000..5757c4b853 --- /dev/null +++ b/vector/src/main/res/layout/item_form_switch.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + diff --git a/vector/src/main/res/layout/item_form_text_input.xml b/vector/src/main/res/layout/item_form_text_input.xml new file mode 100644 index 0000000000..775489c5d9 --- /dev/null +++ b/vector/src/main/res/layout/item_form_text_input.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + diff --git a/vector/src/main/res/menu/vector_room_creation.xml b/vector/src/main/res/menu/vector_room_creation.xml index 5b02163055..42a21da9ab 100755 --- a/vector/src/main/res/menu/vector_room_creation.xml +++ b/vector/src/main/res/menu/vector_room_creation.xml @@ -2,13 +2,11 @@ + tools:context=".features.roomdirectory.RoomDirectoryActivity"> diff --git a/vector/src/main/res/values/dimens.xml b/vector/src/main/res/values/dimens.xml index 886cde2eab..ae85e35bda 100644 --- a/vector/src/main/res/values/dimens.xml +++ b/vector/src/main/res/values/dimens.xml @@ -27,4 +27,7 @@ 20dp 4dp + + 76dp + \ No newline at end of file diff --git a/vector/src/main/res/values/strings_riotX.xml b/vector/src/main/res/values/strings_riotX.xml index 8d39ffe774..7b47fd21c6 100644 --- a/vector/src/main/res/values/strings_riotX.xml +++ b/vector/src/main/res/values/strings_riotX.xml @@ -42,4 +42,13 @@ "Rooms" "Direct Messages" + + "New Room" + "CREATE" + "Room name" + "Public" + "Anyone will be able to join this room" + "Room Directory" + "Publish this room in the room directory" + \ No newline at end of file