diff --git a/newsfragment/3485.feature b/newsfragment/3485.feature new file mode 100644 index 0000000000..68c78267be --- /dev/null +++ b/newsfragment/3485.feature @@ -0,0 +1 @@ +Add beta warning to private space creation flow \ No newline at end of file diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceCreationActivity.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceCreationActivity.kt index 57c6b40404..6bf31dd5ce 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceCreationActivity.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceCreationActivity.kt @@ -53,16 +53,15 @@ class SpaceCreationActivity : SimpleFragmentActivity(), CreateSpaceViewModel.Fac override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - if (isFirstCreation()) { when (withState(viewModel) { it.step }) { - CreateSpaceState.Step.ChooseType -> { + CreateSpaceState.Step.ChooseType -> { navigateToFragment(ChooseSpaceTypeFragment::class.java) } - CreateSpaceState.Step.SetDetails -> { + CreateSpaceState.Step.SetDetails -> { navigateToFragment(ChooseSpaceTypeFragment::class.java) } - CreateSpaceState.Step.AddRooms -> { + CreateSpaceState.Step.AddRooms -> { navigateToFragment(CreateSpaceDefaultRoomsFragment::class.java) } CreateSpaceState.Step.ChoosePrivateType -> { @@ -81,29 +80,29 @@ class SpaceCreationActivity : SimpleFragmentActivity(), CreateSpaceViewModel.Fac viewModel.observeViewEvents { when (it) { - CreateSpaceEvents.NavigateToDetails -> { + CreateSpaceEvents.NavigateToDetails -> { navigateToFragment(CreateSpaceDetailsFragment::class.java) } - CreateSpaceEvents.NavigateToChooseType -> { + CreateSpaceEvents.NavigateToChooseType -> { navigateToFragment(ChooseSpaceTypeFragment::class.java) } - CreateSpaceEvents.Dismiss -> { + CreateSpaceEvents.Dismiss -> { finish() } - CreateSpaceEvents.NavigateToAddRooms -> { + CreateSpaceEvents.NavigateToAddRooms -> { navigateToFragment(CreateSpaceDefaultRoomsFragment::class.java) } CreateSpaceEvents.NavigateToChoosePrivateType -> { navigateToFragment(ChoosePrivateSpaceTypeFragment::class.java) } - is CreateSpaceEvents.ShowModalError -> { + is CreateSpaceEvents.ShowModalError -> { hideWaitingView() MaterialAlertDialogBuilder(this) .setMessage(it.errorMessage) .setPositiveButton(getString(R.string.ok), null) .show() } - is CreateSpaceEvents.FinishSuccess -> { + is CreateSpaceEvents.FinishSuccess -> { setResult(RESULT_OK, Intent().apply { putExtra(RESULT_DATA_CREATED_SPACE_ID, it.spaceId) putExtra(RESULT_DATA_DEFAULT_ROOM_ID, it.defaultRoomId) @@ -111,7 +110,7 @@ class SpaceCreationActivity : SimpleFragmentActivity(), CreateSpaceViewModel.Fac }) finish() } - CreateSpaceEvents.HideModalLoading -> { + CreateSpaceEvents.HideModalLoading -> { hideWaitingView() } } @@ -135,9 +134,9 @@ class SpaceCreationActivity : SimpleFragmentActivity(), CreateSpaceViewModel.Fac private fun renderState(state: CreateSpaceState) { val titleRes = when (state.step) { - CreateSpaceState.Step.ChooseType -> R.string.activity_create_space_title + CreateSpaceState.Step.ChooseType -> R.string.activity_create_space_title CreateSpaceState.Step.SetDetails, - CreateSpaceState.Step.AddRooms -> { + CreateSpaceState.Step.AddRooms -> { if (state.spaceType == SpaceType.Public) R.string.your_public_space else R.string.your_private_space } diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/BetaWarningBottomSheet.kt b/vector/src/main/java/im/vector/app/features/spaces/create/BetaWarningBottomSheet.kt new file mode 100644 index 0000000000..fc3d98e6b8 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/spaces/create/BetaWarningBottomSheet.kt @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2021 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.spaces.create + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.setFragmentResult +import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment +import im.vector.app.databinding.BottomSheetSpaceCreatePrivateWarningBinding + +class BetaWarningBottomSheet : VectorBaseBottomSheetDialogFragment() { + + override fun getBinding(inflater: LayoutInflater, container: ViewGroup?) = + BottomSheetSpaceCreatePrivateWarningBinding.inflate(inflater, container, false) + + override val showExpanded = true + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + views.continueButton.debouncedClicks { + setFragmentResult(REQUEST_KEY, Bundle.EMPTY) + dismiss() + } + } + + companion object { + const val REQUEST_KEY = "BetaWarningBottomSheet" + } +} diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/ChoosePrivateSpaceTypeFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/create/ChoosePrivateSpaceTypeFragment.kt index 4f079551eb..4031b56c1d 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/ChoosePrivateSpaceTypeFragment.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/ChoosePrivateSpaceTypeFragment.kt @@ -20,6 +20,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.fragment.app.setFragmentResultListener import com.airbnb.mvrx.activityViewModel import im.vector.app.R import im.vector.app.core.epoxy.onClick @@ -38,6 +39,13 @@ class ChoosePrivateSpaceTypeFragment @Inject constructor( override fun getBinding(inflater: LayoutInflater, container: ViewGroup?) = FragmentSpaceCreateChoosePrivateModelBinding.inflate(layoutInflater, container, false) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setFragmentResultListener(BetaWarningBottomSheet.REQUEST_KEY) { _, _ -> + sharedViewModel.handle(CreateSpaceAction.SetSpaceTopology(SpaceTopology.MeAndTeammates)) + } + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -46,7 +54,7 @@ class ChoosePrivateSpaceTypeFragment @Inject constructor( } views.teammatesButton.onClick { - sharedViewModel.handle(CreateSpaceAction.SetSpaceTopology(SpaceTopology.MeAndTeammates)) + BetaWarningBottomSheet().show(parentFragmentManager, "warning") } sharedViewModel.subscribe { state -> diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt index 9881232f4d..aff342cea7 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt @@ -70,7 +70,7 @@ class CreateSpaceViewModel @AssistedInject constructor( override fun handle(action: CreateSpaceAction) { when (action) { - is CreateSpaceAction.SetRoomType -> { + is CreateSpaceAction.SetRoomType -> { setState { copy( step = CreateSpaceState.Step.SetDetails, @@ -79,7 +79,7 @@ class CreateSpaceViewModel @AssistedInject constructor( } _viewEvents.post(CreateSpaceEvents.NavigateToDetails) } - is CreateSpaceAction.NameChanged -> { + is CreateSpaceAction.NameChanged -> { setState { copy( nameInlineError = null, @@ -87,20 +87,20 @@ class CreateSpaceViewModel @AssistedInject constructor( ) } } - is CreateSpaceAction.TopicChanged -> { + is CreateSpaceAction.TopicChanged -> { setState { copy( topic = action.topic ) } } - CreateSpaceAction.OnBackPressed -> { + CreateSpaceAction.OnBackPressed -> { handleBackNavigation() } - CreateSpaceAction.NextFromDetails -> { + CreateSpaceAction.NextFromDetails -> { handleNextFromDetails() } - CreateSpaceAction.NextFromDefaultRooms -> { + CreateSpaceAction.NextFromDefaultRooms -> { handleNextFromDefaultRooms() } is CreateSpaceAction.DefaultRoomNameChanged -> { @@ -112,10 +112,10 @@ class CreateSpaceViewModel @AssistedInject constructor( ) } } - is CreateSpaceAction.SetAvatar -> { + is CreateSpaceAction.SetAvatar -> { setState { copy(avatarUri = action.uri) } } - is CreateSpaceAction.SetSpaceTopology -> { + is CreateSpaceAction.SetSpaceTopology -> { handleSetTopology(action) } }.exhaustive @@ -123,7 +123,7 @@ class CreateSpaceViewModel @AssistedInject constructor( private fun handleSetTopology(action: CreateSpaceAction.SetSpaceTopology) { when (action.topology) { - SpaceTopology.JustMe -> { + SpaceTopology.JustMe -> { setState { copy( spaceTopology = SpaceTopology.JustMe, @@ -146,10 +146,10 @@ class CreateSpaceViewModel @AssistedInject constructor( private fun handleBackNavigation() = withState { state -> when (state.step) { - CreateSpaceState.Step.ChooseType -> { + CreateSpaceState.Step.ChooseType -> { _viewEvents.post(CreateSpaceEvents.Dismiss) } - CreateSpaceState.Step.SetDetails -> { + CreateSpaceState.Step.SetDetails -> { setState { copy( step = CreateSpaceState.Step.ChooseType, @@ -159,7 +159,7 @@ class CreateSpaceViewModel @AssistedInject constructor( } _viewEvents.post(CreateSpaceEvents.NavigateToChooseType) } - CreateSpaceState.Step.AddRooms -> { + CreateSpaceState.Step.AddRooms -> { if (state.spaceType == SpaceType.Private && state.spaceTopology == SpaceTopology.MeAndTeammates) { setState { copy( @@ -234,7 +234,7 @@ class CreateSpaceViewModel @AssistedInject constructor( ) ) when (result) { - is CreateSpaceTaskResult.Success -> { + is CreateSpaceTaskResult.Success -> { setState { copy(creationResult = Success(result.spaceId)) } @@ -246,7 +246,7 @@ class CreateSpaceViewModel @AssistedInject constructor( ) ) } - is CreateSpaceTaskResult.PartialSuccess -> { + is CreateSpaceTaskResult.PartialSuccess -> { // XXX what can we do here? setState { copy(creationResult = Success(result.spaceId)) diff --git a/vector/src/main/res/layout/bottom_sheet_space_create_private_warning.xml b/vector/src/main/res/layout/bottom_sheet_space_create_private_warning.xml new file mode 100644 index 0000000000..7292c7df55 --- /dev/null +++ b/vector/src/main/res/layout/bottom_sheet_space_create_private_warning.xml @@ -0,0 +1,46 @@ + + + + + + + + + +