diff --git a/changelog.d/6877.wip b/changelog.d/6877.wip index 415749a297..d1e1c7c82d 100644 --- a/changelog.d/6877.wip +++ b/changelog.d/6877.wip @@ -1 +1 @@ -[New Layout] Adds space backstack for back navigation and space sheet header +[New Layout] Adds back navigation through spaces diff --git a/vector/src/main/java/im/vector/app/SpaceStateHandler.kt b/vector/src/main/java/im/vector/app/SpaceStateHandler.kt index 39ed9bf4f6..64b6fc4e8b 100644 --- a/vector/src/main/java/im/vector/app/SpaceStateHandler.kt +++ b/vector/src/main/java/im/vector/app/SpaceStateHandler.kt @@ -42,20 +42,18 @@ interface SpaceStateHandler : DefaultLifecycleObserver { * @param session the current active session * @param persistNow if true, the current space will immediately be persisted in shared prefs * @param isForwardNavigation whether this navigation is a forward action to properly handle backstack - * @param overriddenSpaceName overrides the display name of the space being set */ fun setCurrentSpace( spaceId: String?, session: Session? = null, persistNow: Boolean = false, isForwardNavigation: Boolean = true, - overriddenSpaceName: String? = null, ) /** * Gets the Space ID of the space on top of the backstack. * - * May return null to indicate the All Chats space + * May return null to indicate the All Chats space. */ fun popSpaceBackstack(): String? diff --git a/vector/src/main/java/im/vector/app/SpaceStateHandlerImpl.kt b/vector/src/main/java/im/vector/app/SpaceStateHandlerImpl.kt index d2b3abba59..a665b619c0 100644 --- a/vector/src/main/java/im/vector/app/SpaceStateHandlerImpl.kt +++ b/vector/src/main/java/im/vector/app/SpaceStateHandlerImpl.kt @@ -72,13 +72,10 @@ class SpaceStateHandlerImpl @Inject constructor( session: Session?, persistNow: Boolean, isForwardNavigation: Boolean, - overriddenSpaceName: String?, ) { val activeSession = session ?: activeSessionHolder.getSafeActiveSession() ?: return val spaceToLeave = selectedSpaceDataSource.currentValue?.orNull() - val spaceToSet = spaceId?.let { activeSession.getRoomSummary(spaceId) }?.let { - if (overriddenSpaceName != null) it.copy(displayName = overriddenSpaceName) else it - } + val spaceToSet = spaceId?.let { activeSession.getRoomSummary(spaceId) } val sameSpaceSelected = spaceId == spaceToLeave?.roomId if (sameSpaceSelected) { diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt index 87707d2d65..4142c89e30 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt @@ -144,7 +144,6 @@ class HomeActivity : private val createSpaceResultLauncher = registerStartForActivityResult { activityResult -> if (activityResult.resultCode == Activity.RESULT_OK) { val spaceId = SpaceCreationActivity.getCreatedSpaceId(activityResult.data) - val spaceName = SpaceCreationActivity.getCreatedSpaceName(activityResult.data) val defaultRoomId = SpaceCreationActivity.getDefaultRoomId(activityResult.data) val isJustMe = SpaceCreationActivity.isJustMeSpace(activityResult.data) views.drawerLayout.closeDrawer(GravityCompat.START) @@ -162,7 +161,6 @@ class HomeActivity : context = this, spaceId = spaceId, postSwitchOption, - overriddenSpaceName = spaceName, ) roomListSharedActionViewModel.post(RoomListSharedAction.CloseBottomSheet) } diff --git a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt index f30386a477..3b56867a20 100644 --- a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt +++ b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt @@ -180,13 +180,12 @@ class DefaultNavigator @Inject constructor( context: Context, spaceId: String, postSwitchSpaceAction: Navigator.PostSwitchSpaceAction, - overriddenSpaceName: String?, ) { if (sessionHolder.getSafeActiveSession()?.getRoomSummary(spaceId) == null) { fatalError("Trying to open an unknown space $spaceId", vectorPreferences.failFast()) return } - spaceStateHandler.setCurrentSpace(spaceId, overriddenSpaceName = overriddenSpaceName) + spaceStateHandler.setCurrentSpace(spaceId) handlePostSwitchAction(context, spaceId, postSwitchSpaceAction) } diff --git a/vector/src/main/java/im/vector/app/features/navigation/Navigator.kt b/vector/src/main/java/im/vector/app/features/navigation/Navigator.kt index bb59c84555..5d86456ba5 100644 --- a/vector/src/main/java/im/vector/app/features/navigation/Navigator.kt +++ b/vector/src/main/java/im/vector/app/features/navigation/Navigator.kt @@ -72,7 +72,6 @@ interface Navigator { context: Context, spaceId: String, postSwitchSpaceAction: PostSwitchSpaceAction, - overriddenSpaceName: String? = null, ) fun openSpacePreview(context: Context, spaceId: String) diff --git a/vector/src/main/java/im/vector/app/features/spaces/NewSpaceListHeaderItem.kt b/vector/src/main/java/im/vector/app/features/spaces/NewSpaceListHeaderItem.kt deleted file mode 100644 index 29538be16e..0000000000 --- a/vector/src/main/java/im/vector/app/features/spaces/NewSpaceListHeaderItem.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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 - -import android.content.Context -import android.widget.TextView -import com.airbnb.epoxy.EpoxyAttribute -import com.airbnb.epoxy.EpoxyModelClass -import im.vector.app.R -import im.vector.app.core.epoxy.VectorEpoxyHolder -import im.vector.app.core.epoxy.VectorEpoxyModel - -@EpoxyModelClass -abstract class NewSpaceListHeaderItem : VectorEpoxyModel(R.layout.item_new_space_list_header) { - - @EpoxyAttribute var currentSpace: String? = null - @EpoxyAttribute var spaceHistory: List> = emptyList() - - override fun bind(holder: Holder) { - super.bind(holder) - holder.spaceHeader.text = buildSpaceHeaderText(holder.spaceHeader.context) - } - - private fun buildSpaceHeaderText(context: Context): String { - val allChats = context.getString(R.string.all_chats) - var spaceHeaderText = allChats - - val nonRootSpaceHistory = spaceHistory.filter { it.second.isNotEmpty() } - - if (nonRootSpaceHistory.isNotEmpty()) { - spaceHeaderText += " > ${nonRootSpaceHistory.joinToString(" > ") { it.second }}" - } - if (currentSpace != null) { - spaceHeaderText += " > $currentSpace" - } - return spaceHeaderText - } - - class Holder : VectorEpoxyHolder() { - val spaceHeader by bind(R.id.space_header) - } -} diff --git a/vector/src/main/java/im/vector/app/features/spaces/NewSpaceSummaryController.kt b/vector/src/main/java/im/vector/app/features/spaces/NewSpaceSummaryController.kt index 47b0f23f44..524c7d82af 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/NewSpaceSummaryController.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/NewSpaceSummaryController.kt @@ -51,7 +51,6 @@ class NewSpaceSummaryController @Inject constructor( nonNullViewState.selectedSpace, nonNullViewState.rootSpacesOrdered, nonNullViewState.homeAggregateCount, - nonNullViewState.spaceHistory, ) } @@ -60,16 +59,9 @@ class NewSpaceSummaryController @Inject constructor( selectedSpace: RoomSummary?, rootSpaces: List?, homeCount: RoomAggregateNotificationCount, - spaceHistory: List>, ) { val host = this - newSpaceListHeaderItem { - id("space_list_header") - currentSpace(selectedSpace?.displayName) - spaceHistory(spaceHistory) - } - if (selectedSpace != null) { addSubSpaces(selectedSpace, spaceSummaries, homeCount) } else { 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 aeca7021eb..9fa4a53efc 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 @@ -104,7 +104,6 @@ class SpaceCreationActivity : SimpleFragmentActivity() { is CreateSpaceEvents.FinishSuccess -> { setResult(RESULT_OK, Intent().apply { putExtra(RESULT_DATA_CREATED_SPACE_ID, it.spaceId) - putExtra(RESULT_DATA_CREATED_SPACE_NAME, it.spaceName) putExtra(RESULT_DATA_DEFAULT_ROOM_ID, it.defaultRoomId) putExtra(RESULT_DATA_CREATED_SPACE_IS_JUST_ME, it.topology == SpaceTopology.JustMe) }) @@ -160,7 +159,6 @@ class SpaceCreationActivity : SimpleFragmentActivity() { companion object { private const val RESULT_DATA_CREATED_SPACE_ID = "RESULT_DATA_CREATED_SPACE_ID" - private const val RESULT_DATA_CREATED_SPACE_NAME = "RESULT_DATA_CREATED_SPACE_NAME" private const val RESULT_DATA_DEFAULT_ROOM_ID = "RESULT_DATA_DEFAULT_ROOM_ID" private const val RESULT_DATA_CREATED_SPACE_IS_JUST_ME = "RESULT_DATA_CREATED_SPACE_IS_JUST_ME" @@ -174,10 +172,6 @@ class SpaceCreationActivity : SimpleFragmentActivity() { return data?.extras?.getString(RESULT_DATA_CREATED_SPACE_ID) } - fun getCreatedSpaceName(data: Intent?): String? { - return data?.extras?.getString(RESULT_DATA_CREATED_SPACE_NAME) - } - fun getDefaultRoomId(data: Intent?): String? { return data?.extras?.getString(RESULT_DATA_DEFAULT_ROOM_ID) } diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt index d8e5d49ddf..c7f8e0d411 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt @@ -85,15 +85,10 @@ class SpaceListViewModel @AssistedInject constructor( } observeSpaceSummaries() - val spaceHistory = spaceStateHandler.getSpaceBackstack() - .map { it to it?.let { session.roomService().getRoomSummary(it)?.displayName }.orEmpty() } spaceStateHandler.getSelectedSpaceFlow() .distinctUntilChanged() .setOnEach { selectedSpaceOption -> - copy( - selectedSpace = selectedSpaceOption.orNull(), - spaceHistory = spaceHistory, - ) + copy(selectedSpace = selectedSpaceOption.orNull()) } // XXX there should be a way to refactor this and share it diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewState.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewState.kt index ebdc9e72ac..f75c336b5d 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewState.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewState.kt @@ -32,6 +32,5 @@ data class SpaceListViewState( val spaceOrderInfo: Map? = null, val spaceOrderLocalEchos: Map? = null, val expandedStates: Map = emptyMap(), - val spaceHistory: List> = emptyList(), // List of space id to display name val homeAggregateCount: RoomAggregateNotificationCount = RoomAggregateNotificationCount(0, 0) ) : MavericksState diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceEvents.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceEvents.kt index 45d1700352..eeb2ca30ff 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceEvents.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceEvents.kt @@ -25,7 +25,7 @@ sealed class CreateSpaceEvents : VectorViewEvents { object NavigateToAdd3Pid : CreateSpaceEvents() object NavigateToChoosePrivateType : CreateSpaceEvents() object Dismiss : CreateSpaceEvents() - data class FinishSuccess(val spaceId: String, val spaceName: String, val defaultRoomId: String?, val topology: SpaceTopology?) : CreateSpaceEvents() + data class FinishSuccess(val spaceId: String, val defaultRoomId: String?, val topology: SpaceTopology?) : CreateSpaceEvents() data class ShowModalError(val errorMessage: String) : CreateSpaceEvents() object HideModalLoading : CreateSpaceEvents() data class ShowModalLoading(val message: String?) : CreateSpaceEvents() 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 761f0f791b..b680f77df2 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 @@ -380,7 +380,6 @@ class CreateSpaceViewModel @AssistedInject constructor( _viewEvents.post( CreateSpaceEvents.FinishSuccess( result.spaceId, - spaceName, result.childIds.firstOrNull(), state.spaceTopology ) @@ -394,7 +393,6 @@ class CreateSpaceViewModel @AssistedInject constructor( _viewEvents.post( CreateSpaceEvents.FinishSuccess( result.spaceId, - spaceName, result.childIds.firstOrNull(), state.spaceTopology ) diff --git a/vector/src/main/res/layout/item_new_space_list_header.xml b/vector/src/main/res/layout/item_new_space_list_header.xml deleted file mode 100644 index bb05f4cb53..0000000000 --- a/vector/src/main/res/layout/item_new_space_list_header.xml +++ /dev/null @@ -1,17 +0,0 @@ - - diff --git a/vector/src/test/java/im/vector/app/features/navigation/DefaultNavigatorTest.kt b/vector/src/test/java/im/vector/app/features/navigation/DefaultNavigatorTest.kt index 6301fe1549..bdf1dbd4e6 100644 --- a/vector/src/test/java/im/vector/app/features/navigation/DefaultNavigatorTest.kt +++ b/vector/src/test/java/im/vector/app/features/navigation/DefaultNavigatorTest.kt @@ -19,6 +19,7 @@ package im.vector.app.features.navigation import im.vector.app.test.fakes.FakeActiveSessionHolder import im.vector.app.test.fakes.FakeAnalyticsTracker import im.vector.app.test.fakes.FakeContext +import im.vector.app.test.fakes.FakeDebugNavigator import im.vector.app.test.fakes.FakeSpaceStateHandler import im.vector.app.test.fakes.FakeSupportedVerificationMethodsProvider import im.vector.app.test.fakes.FakeVectorFeatures @@ -36,6 +37,7 @@ internal class DefaultNavigatorTest { private val supportedVerificationMethodsProvider = FakeSupportedVerificationMethodsProvider() private val features = FakeVectorFeatures() private val analyticsTracker = FakeAnalyticsTracker() + private val debugNavigator = FakeDebugNavigator() private val navigator = DefaultNavigator( sessionHolder.instance, @@ -45,10 +47,11 @@ internal class DefaultNavigatorTest { supportedVerificationMethodsProvider.instance, features, analyticsTracker, + debugNavigator, ) /** - * The below tests are by no means all that we want to test in [DefaultNavigator]. + * The below test is by no means all that we want to test in [DefaultNavigator]. * Please add relevant tests as you make changes to or related to other functions in the class. */ @@ -62,16 +65,4 @@ internal class DefaultNavigatorTest { spaceStateHandler.verifySetCurrentSpace(spaceId) } - - @Test - fun `given non-null overriddenSpaceName, when switchToSpace, then current space set`() { - val spaceId = "space-id" - val spaceSummary = aRoomSummary(spaceId) - sessionHolder.fakeSession.fakeRoomService.getRoomSummaryReturns(spaceSummary) - val overriddenSpaceName = "new-space-name" - - navigator.switchToSpace(FakeContext().instance, spaceId, Navigator.PostSwitchSpaceAction.None, overriddenSpaceName) - - spaceStateHandler.verifySetCurrentSpace(spaceId, overriddenSpaceName = overriddenSpaceName) - } } diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeDebugNavigator.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeDebugNavigator.kt new file mode 100644 index 0000000000..42074093b3 --- /dev/null +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeDebugNavigator.kt @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2022 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.test.fakes + +import im.vector.app.core.debug.DebugNavigator +import io.mockk.mockk + +class FakeDebugNavigator : DebugNavigator by mockk() diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeSpaceStateHandler.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeSpaceStateHandler.kt index 04358d6a1f..f95b968c91 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeSpaceStateHandler.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeSpaceStateHandler.kt @@ -22,7 +22,7 @@ import io.mockk.verify class FakeSpaceStateHandler : SpaceStateHandler by mockk(relaxUnitFun = true) { - fun verifySetCurrentSpace(spaceId: String, overriddenSpaceName: String? = null) { - verify { setCurrentSpace(spaceId, overriddenSpaceName = overriddenSpaceName) } + fun verifySetCurrentSpace(spaceId: String) { + verify { setCurrentSpace(spaceId) } } }