mirror of
https://github.com/element-hq/element-android
synced 2024-11-28 05:31:21 +03:00
bottom navigation tabs are removed for AppLayout (#6905)
This commit is contained in:
parent
da70d520bc
commit
225d05e0be
3 changed files with 13 additions and 114 deletions
1
changelog.d/6565.wip
Normal file
1
changelog.d/6565.wip
Normal file
|
@ -0,0 +1 @@
|
||||||
|
[App Layout] Bottom navigation tabs are removed for new home screen
|
|
@ -27,7 +27,6 @@ import androidx.lifecycle.lifecycleScope
|
||||||
import com.airbnb.mvrx.activityViewModel
|
import com.airbnb.mvrx.activityViewModel
|
||||||
import com.airbnb.mvrx.fragmentViewModel
|
import com.airbnb.mvrx.fragmentViewModel
|
||||||
import com.airbnb.mvrx.withState
|
import com.airbnb.mvrx.withState
|
||||||
import com.google.android.material.badge.BadgeDrawable
|
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import im.vector.app.R
|
import im.vector.app.R
|
||||||
import im.vector.app.SpaceStateHandler
|
import im.vector.app.SpaceStateHandler
|
||||||
|
@ -50,7 +49,6 @@ import im.vector.app.features.popup.PopupAlertManager
|
||||||
import im.vector.app.features.popup.VerificationVectorAlert
|
import im.vector.app.features.popup.VerificationVectorAlert
|
||||||
import im.vector.app.features.settings.VectorPreferences
|
import im.vector.app.features.settings.VectorPreferences
|
||||||
import im.vector.app.features.settings.VectorSettingsActivity.Companion.EXTRA_DIRECT_ACCESS_SECURITY_PRIVACY_MANAGE_SESSIONS
|
import im.vector.app.features.settings.VectorSettingsActivity.Companion.EXTRA_DIRECT_ACCESS_SECURITY_PRIVACY_MANAGE_SESSIONS
|
||||||
import im.vector.app.features.themes.ThemeUtils
|
|
||||||
import im.vector.app.features.workers.signout.BannerState
|
import im.vector.app.features.workers.signout.BannerState
|
||||||
import im.vector.app.features.workers.signout.ServerBackupStatusViewModel
|
import im.vector.app.features.workers.signout.ServerBackupStatusViewModel
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
@ -79,7 +77,6 @@ class NewHomeDetailFragment :
|
||||||
|
|
||||||
private val viewModel: HomeDetailViewModel by fragmentViewModel()
|
private val viewModel: HomeDetailViewModel by fragmentViewModel()
|
||||||
private val unknownDeviceDetectorSharedViewModel: UnknownDeviceDetectorSharedViewModel by activityViewModel()
|
private val unknownDeviceDetectorSharedViewModel: UnknownDeviceDetectorSharedViewModel by activityViewModel()
|
||||||
private val unreadMessagesSharedViewModel: UnreadMessagesSharedViewModel by activityViewModel()
|
|
||||||
private val serverBackupStatusViewModel: ServerBackupStatusViewModel by activityViewModel()
|
private val serverBackupStatusViewModel: ServerBackupStatusViewModel by activityViewModel()
|
||||||
|
|
||||||
private lateinit var sharedActionViewModel: HomeSharedActionViewModel
|
private lateinit var sharedActionViewModel: HomeSharedActionViewModel
|
||||||
|
@ -127,24 +124,18 @@ class NewHomeDetailFragment :
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
sharedActionViewModel = activityViewModelProvider.get(HomeSharedActionViewModel::class.java)
|
sharedActionViewModel = activityViewModelProvider.get(HomeSharedActionViewModel::class.java)
|
||||||
sharedCallActionViewModel = activityViewModelProvider.get(SharedKnownCallsViewModel::class.java)
|
sharedCallActionViewModel = activityViewModelProvider.get(SharedKnownCallsViewModel::class.java)
|
||||||
setupBottomNavigationView()
|
|
||||||
setupToolbar()
|
setupToolbar()
|
||||||
setupKeysBackupBanner()
|
setupKeysBackupBanner()
|
||||||
setupActiveCallView()
|
setupActiveCallView()
|
||||||
|
|
||||||
withState(viewModel) {
|
childFragmentManager.commitTransaction {
|
||||||
// Update the navigation view if needed (for when we restore the tabs)
|
add(R.id.roomListContainer, HomeRoomListFragment::class.java, null, HOME_ROOM_LIST_FRAGMENT_TAG)
|
||||||
views.bottomNavigationView.selectedItemId = it.currentTab.toMenuId()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
viewModel.onEach(HomeDetailViewState::selectedSpace) { selectedSpace ->
|
viewModel.onEach(HomeDetailViewState::selectedSpace) { selectedSpace ->
|
||||||
onSpaceChange(selectedSpace)
|
onSpaceChange(selectedSpace)
|
||||||
}
|
}
|
||||||
|
|
||||||
viewModel.onEach(HomeDetailViewState::currentTab) { currentTab ->
|
|
||||||
updateUIForTab(currentTab)
|
|
||||||
}
|
|
||||||
|
|
||||||
viewModel.observeViewEvents { viewEvent ->
|
viewModel.observeViewEvents { viewEvent ->
|
||||||
when (viewEvent) {
|
when (viewEvent) {
|
||||||
HomeDetailViewEvents.CallStarted -> Unit
|
HomeDetailViewEvents.CallStarted -> Unit
|
||||||
|
@ -196,7 +187,6 @@ class NewHomeDetailFragment :
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
updateTabVisibilitySafely(R.id.bottom_action_notification, vectorPreferences.labAddNotificationTab())
|
|
||||||
callManager.checkForProtocolsSupportIfNeeded()
|
callManager.checkForProtocolsSupportIfNeeded()
|
||||||
refreshSpaceState()
|
refreshSpaceState()
|
||||||
}
|
}
|
||||||
|
@ -308,65 +298,6 @@ class NewHomeDetailFragment :
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupBottomNavigationView() {
|
|
||||||
views.bottomNavigationView.menu.findItem(R.id.bottom_action_notification).isVisible = vectorPreferences.labAddNotificationTab()
|
|
||||||
views.bottomNavigationView.setOnItemSelectedListener {
|
|
||||||
val tab = when (it.itemId) {
|
|
||||||
R.id.bottom_action_people -> HomeTab.RoomList(RoomListDisplayMode.PEOPLE)
|
|
||||||
R.id.bottom_action_rooms -> HomeTab.RoomList(RoomListDisplayMode.ROOMS)
|
|
||||||
R.id.bottom_action_notification -> HomeTab.RoomList(RoomListDisplayMode.NOTIFICATIONS)
|
|
||||||
else -> HomeTab.DialPad
|
|
||||||
}
|
|
||||||
viewModel.handle(HomeDetailAction.SwitchTab(tab))
|
|
||||||
true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun updateUIForTab(tab: HomeTab) {
|
|
||||||
views.bottomNavigationView.menu.findItem(tab.toMenuId()).isChecked = true
|
|
||||||
updateSelectedFragment(tab)
|
|
||||||
invalidateOptionsMenu()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun HomeTab.toFragmentTag() = "FRAGMENT_TAG_$this"
|
|
||||||
|
|
||||||
private fun updateSelectedFragment(tab: HomeTab) {
|
|
||||||
val fragmentTag = tab.toFragmentTag()
|
|
||||||
val fragmentToShow = childFragmentManager.findFragmentByTag(fragmentTag)
|
|
||||||
childFragmentManager.commitTransaction {
|
|
||||||
childFragmentManager.fragments
|
|
||||||
.filter { it != fragmentToShow }
|
|
||||||
.forEach {
|
|
||||||
detach(it)
|
|
||||||
}
|
|
||||||
if (fragmentToShow == null) {
|
|
||||||
when (tab) {
|
|
||||||
is HomeTab.RoomList -> {
|
|
||||||
add(R.id.roomListContainer, HomeRoomListFragment::class.java, null, fragmentTag)
|
|
||||||
}
|
|
||||||
is HomeTab.DialPad -> {
|
|
||||||
throw NotImplementedError("this tab shouldn't exists when app layout is enabled")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
attach(fragmentToShow)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun updateTabVisibilitySafely(tabId: Int, isVisible: Boolean) {
|
|
||||||
val wasVisible = views.bottomNavigationView.menu.findItem(tabId).isVisible
|
|
||||||
views.bottomNavigationView.menu.findItem(tabId).isVisible = isVisible
|
|
||||||
if (wasVisible && !isVisible) {
|
|
||||||
// As we hide it check if it's not the current item!
|
|
||||||
withState(viewModel) {
|
|
||||||
if (it.currentTab.toMenuId() == tabId) {
|
|
||||||
viewModel.handle(HomeDetailAction.SwitchTab(HomeTab.RoomList(RoomListDisplayMode.PEOPLE)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ==========================================================================================
|
/* ==========================================================================================
|
||||||
* KeysBackupBanner Listener
|
* KeysBackupBanner Listener
|
||||||
* ========================================================================================== */
|
* ========================================================================================== */
|
||||||
|
@ -380,9 +311,6 @@ class NewHomeDetailFragment :
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun invalidate() = withState(viewModel) {
|
override fun invalidate() = withState(viewModel) {
|
||||||
views.bottomNavigationView.getOrCreateBadge(R.id.bottom_action_people).render(it.notificationCountPeople, it.notificationHighlightPeople)
|
|
||||||
views.bottomNavigationView.getOrCreateBadge(R.id.bottom_action_rooms).render(it.notificationCountRooms, it.notificationHighlightRooms)
|
|
||||||
views.bottomNavigationView.getOrCreateBadge(R.id.bottom_action_notification).render(it.notificationCountCatchup, it.notificationHighlightCatchup)
|
|
||||||
views.syncStateView.render(
|
views.syncStateView.render(
|
||||||
it.syncState,
|
it.syncState,
|
||||||
it.incrementalSyncRequestState,
|
it.incrementalSyncRequestState,
|
||||||
|
@ -393,27 +321,6 @@ class NewHomeDetailFragment :
|
||||||
hasUnreadRooms = it.hasUnreadMessages
|
hasUnreadRooms = it.hasUnreadMessages
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun BadgeDrawable.render(count: Int, highlight: Boolean) {
|
|
||||||
isVisible = count > 0
|
|
||||||
number = count
|
|
||||||
maxCharacterCount = 3
|
|
||||||
badgeTextColor = ThemeUtils.getColor(requireContext(), R.attr.colorOnPrimary)
|
|
||||||
backgroundColor = if (highlight) {
|
|
||||||
ThemeUtils.getColor(requireContext(), R.attr.colorError)
|
|
||||||
} else {
|
|
||||||
ThemeUtils.getColor(requireContext(), R.attr.vctr_unread_background)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun HomeTab.toMenuId() = when (this) {
|
|
||||||
is HomeTab.DialPad -> R.id.bottom_action_dial_pad
|
|
||||||
is HomeTab.RoomList -> when (displayMode) {
|
|
||||||
RoomListDisplayMode.PEOPLE -> R.id.bottom_action_people
|
|
||||||
RoomListDisplayMode.ROOMS -> R.id.bottom_action_rooms
|
|
||||||
else -> R.id.bottom_action_notification
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onTapToReturnToCall() {
|
override fun onTapToReturnToCall() {
|
||||||
callManager.getCurrentCall()?.let { call ->
|
callManager.getCurrentCall()?.let { call ->
|
||||||
VectorCallActivity.newIntent(
|
VectorCallActivity.newIntent(
|
||||||
|
@ -436,4 +343,8 @@ class NewHomeDetailFragment :
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val HOME_ROOM_LIST_FRAGMENT_TAG = "TAG_HOME_ROOM_LIST"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,8 +68,8 @@
|
||||||
android:id="@+id/avatar"
|
android:id="@+id/avatar"
|
||||||
android:layout_width="36dp"
|
android:layout_width="36dp"
|
||||||
android:layout_height="36dp"
|
android:layout_height="36dp"
|
||||||
android:padding="6dp"
|
|
||||||
android:contentDescription="@string/a11y_open_settings"
|
android:contentDescription="@string/a11y_open_settings"
|
||||||
|
android:padding="6dp"
|
||||||
tools:src="@sample/user_round_avatars" />
|
tools:src="@sample/user_round_avatars" />
|
||||||
|
|
||||||
</com.google.android.material.appbar.MaterialToolbar>
|
</com.google.android.material.appbar.MaterialToolbar>
|
||||||
|
@ -78,26 +78,13 @@
|
||||||
|
|
||||||
</com.google.android.material.appbar.AppBarLayout>
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
|
|
||||||
|
|
||||||
<androidx.fragment.app.FragmentContainerView
|
<androidx.fragment.app.FragmentContainerView
|
||||||
android:id="@+id/roomListContainer"
|
android:id="@+id/roomListContainer"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="match_parent"
|
||||||
app:layout_constraintBottom_toTopOf="@id/bottomNavigationView"
|
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
|
||||||
|
|
||||||
<com.google.android.material.bottomnavigation.BottomNavigationView
|
|
||||||
android:id="@+id/bottomNavigationView"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:menu="@menu/home_bottom_navigation" />
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
||||||
|
|
||||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue