Adding save button and view actions

This commit is contained in:
Maxime NATUREL 2022-09-19 17:27:06 +02:00
parent 33cf3d3032
commit b134d35dd6
4 changed files with 66 additions and 8 deletions

View File

@ -0,0 +1,24 @@
/*
* Copyright (c) 2020 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.app.features.settings.devices.v2.rename
import im.vector.app.core.platform.VectorViewModelAction
sealed class RenameSessionAction : VectorViewModelAction {
object SaveModifications : RenameSessionAction()
data class EditLocally(val editedName: String) : RenameSessionAction()
}

View File

@ -20,11 +20,10 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity import androidx.core.widget.doOnTextChanged
import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.fragmentViewModel
import com.airbnb.mvrx.withState import com.airbnb.mvrx.withState
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import im.vector.app.R
import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.databinding.FragmentSessionRenameBinding import im.vector.app.databinding.FragmentSessionRenameBinding
import javax.inject.Inject import javax.inject.Inject
@ -50,6 +49,8 @@ class RenameSessionFragment :
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
observeViewEvents() observeViewEvents()
initToolbar() initToolbar()
initEditText()
initSaveButton()
} }
private fun initToolbar() { private fun initToolbar() {
@ -57,6 +58,18 @@ class RenameSessionFragment :
.allowBack(useCross = true) .allowBack(useCross = true)
} }
private fun initEditText() {
views.renameSessionEditText.doOnTextChanged { text, _, _, _ ->
viewModel.handle(RenameSessionAction.EditLocally(text.toString()))
}
}
private fun initSaveButton() {
views.renameSessionSave.debouncedClicks {
viewModel.handle(RenameSessionAction.SaveModifications)
}
}
private fun observeViewEvents() { private fun observeViewEvents() {
viewModel.observeViewEvents { viewModel.observeViewEvents {
when (it) { when (it) {
@ -72,5 +85,6 @@ class RenameSessionFragment :
views.renameSessionEditText.setText(state.deviceName) views.renameSessionEditText.setText(state.deviceName)
renameEditTextInitialized = true renameEditTextInitialized = true
} }
views.renameSessionSave.isEnabled = state.deviceName.isNotEmpty()
} }
} }

View File

@ -22,7 +22,6 @@ import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject import dagger.assisted.AssistedInject
import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.MavericksAssistedViewModelFactory
import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory
import im.vector.app.core.platform.EmptyAction
import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModel
import im.vector.app.features.settings.devices.v2.overview.GetDeviceFullInfoUseCase import im.vector.app.features.settings.devices.v2.overview.GetDeviceFullInfoUseCase
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
@ -32,7 +31,7 @@ import kotlinx.coroutines.flow.onEach
class RenameSessionViewModel @AssistedInject constructor( class RenameSessionViewModel @AssistedInject constructor(
@Assisted val initialState: RenameSessionViewState, @Assisted val initialState: RenameSessionViewState,
private val getDeviceFullInfoUseCase: GetDeviceFullInfoUseCase, private val getDeviceFullInfoUseCase: GetDeviceFullInfoUseCase,
) : VectorViewModel<RenameSessionViewState, EmptyAction, RenameSessionViewEvent>(initialState) { ) : VectorViewModel<RenameSessionViewState, RenameSessionAction, RenameSessionViewEvent>(initialState) {
companion object : MavericksViewModelFactory<RenameSessionViewModel, RenameSessionViewState> by hiltMavericksViewModelFactory() companion object : MavericksViewModelFactory<RenameSessionViewModel, RenameSessionViewState> by hiltMavericksViewModelFactory()
@ -51,7 +50,19 @@ class RenameSessionViewModel @AssistedInject constructor(
.launchIn(viewModelScope) .launchIn(viewModelScope)
} }
override fun handle(action: EmptyAction) { override fun handle(action: RenameSessionAction) {
// do nothing when (action) {
is RenameSessionAction.EditLocally -> handleEditLocally(action.editedName)
is RenameSessionAction.SaveModifications -> handleSaveModifications()
}
}
private fun handleEditLocally(editedName: String) {
setState { copy(deviceName = editedName) }
}
private fun handleSaveModifications() {
// TODO call use case to save the modifications
_viewEvents.post(RenameSessionViewEvent.SessionRenamed)
} }
} }

View File

@ -14,8 +14,17 @@
android:id="@+id/renameSessionToolbar" android:id="@+id/renameSessionToolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?actionBarSize" android:layout_height="?actionBarSize"
app:title="@string/device_manager_session_rename"/> app:title="@string/device_manager_session_rename">
<Button
android:id="@+id/renameSessionSave"
style="@style/Widget.Vector.Button.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:text="@string/action_save" />
</com.google.android.material.appbar.MaterialToolbar>
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout