From 4a8918a9c650a74040bb078b13bdc2937bbbfa13 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Tue, 16 Aug 2022 11:58:24 +0200 Subject: [PATCH] Some foldable optimizations --- Habitica/res/layout-w600dp/activity_main.xml | 28 ++++ Habitica/res/layout/activity_main.xml | 144 +---------------- Habitica/res/layout/activity_main_content.xml | 146 ++++++++++++++++++ Habitica/res/values-w600dp/dimens.xml | 4 + Habitica/res/values-w600dp/values.xml | 4 + Habitica/res/values/values.xml | 2 + .../habitica/ui/activities/MainActivity.kt | 43 +++--- .../habitica/ui/fragments/BaseMainFragment.kt | 18 +-- .../ui/fragments/NavigationDrawerFragment.kt | 47 ++++-- .../ui/fragments/tasks/TasksFragment.kt | 4 +- 10 files changed, 256 insertions(+), 184 deletions(-) create mode 100644 Habitica/res/layout-w600dp/activity_main.xml create mode 100644 Habitica/res/layout/activity_main_content.xml create mode 100644 Habitica/res/values-w600dp/dimens.xml create mode 100644 Habitica/res/values-w600dp/values.xml diff --git a/Habitica/res/layout-w600dp/activity_main.xml b/Habitica/res/layout-w600dp/activity_main.xml new file mode 100644 index 000000000..924f58cf8 --- /dev/null +++ b/Habitica/res/layout-w600dp/activity_main.xml @@ -0,0 +1,28 @@ + + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/layout/activity_main.xml b/Habitica/res/layout/activity_main.xml index 8fb24c4f6..26adf6e6d 100644 --- a/Habitica/res/layout/activity_main.xml +++ b/Habitica/res/layout/activity_main.xml @@ -11,149 +11,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/Habitica/res/layout/activity_main_content.xml b/Habitica/res/layout/activity_main_content.xml new file mode 100644 index 000000000..7553ad017 --- /dev/null +++ b/Habitica/res/layout/activity_main_content.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/values-w600dp/dimens.xml b/Habitica/res/values-w600dp/dimens.xml new file mode 100644 index 000000000..ac91c71ec --- /dev/null +++ b/Habitica/res/values-w600dp/dimens.xml @@ -0,0 +1,4 @@ + + + 260dp + \ No newline at end of file diff --git a/Habitica/res/values-w600dp/values.xml b/Habitica/res/values-w600dp/values.xml new file mode 100644 index 000000000..706351a97 --- /dev/null +++ b/Habitica/res/values-w600dp/values.xml @@ -0,0 +1,4 @@ + + + true + \ No newline at end of file diff --git a/Habitica/res/values/values.xml b/Habitica/res/values/values.xml index 9bd3ec3a7..0bf3d4ef4 100644 --- a/Habitica/res/values/values.xml +++ b/Habitica/res/values/values.xml @@ -234,4 +234,6 @@ compact minimal + + false diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt index 93921e0bc..2216249f9 100755 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt @@ -98,7 +98,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { lateinit var binding: ActivityMainBinding val snackbarContainer: ViewGroup - get() = binding.snackbarContainer + get() = binding.content.snackbarContainer private var avatarInHeader: AvatarWithBarsViewModel? = null val notificationsViewModel: NotificationsViewModel by viewModels() @@ -111,7 +111,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { private var lastNotificationOpen: Long? = null val isAppBarExpanded: Boolean - get() = binding.appbar.height - binding.appbar.bottom == 0 + get() = binding.content.appbar.height - binding.content.appbar.bottom == 0 override fun getLayoutResId(): Int { return R.layout.activity_main @@ -145,9 +145,9 @@ open class MainActivity : BaseActivity(), SnackbarActivity { Wearable.getCapabilityClient(this).addLocalCapability("provide_auth") } - setupToolbar(binding.toolbar) + setupToolbar(binding.content.toolbar) - avatarInHeader = AvatarWithBarsViewModel(this, binding.avatarWithBars, viewModel.userViewModel) + avatarInHeader = AvatarWithBarsViewModel(this, binding.content.avatarWithBars, viewModel.userViewModel) sideAvatarView = AvatarView(this, showBackground = true, showMount = false, showPet = false) viewModel.user.observe(this) { @@ -215,11 +215,11 @@ open class MainActivity : BaseActivity(), SnackbarActivity { } override fun setTitle(title: CharSequence?) { - binding.toolbarTitle.text = title + binding.content.toolbarTitle.text = title } override fun setTitle(titleId: Int) { - binding.toolbarTitle.text = getString(titleId) + binding.content.toolbarTitle.text = getString(titleId) } private fun updateToolbarTitle(destination: NavDestination, arguments: Bundle?) { @@ -249,9 +249,9 @@ open class MainActivity : BaseActivity(), SnackbarActivity { } private fun setupBottomnavigationLayoutListener() { - binding.bottomNavigation.viewTreeObserver.addOnGlobalLayoutListener { - if (binding.bottomNavigation.visibility == View.VISIBLE) { - snackbarContainer.setPadding(0, 0, 0, binding.bottomNavigation.barHeight + 12.dpToPx(this)) + binding.content.bottomNavigation.viewTreeObserver.addOnGlobalLayoutListener { + if (binding.content.bottomNavigation.visibility == View.VISIBLE) { + snackbarContainer.setPadding(0, 0, 0, binding.content.bottomNavigation.barHeight + 12.dpToPx(this)) } else { snackbarContainer.setPadding(0, 0, 0, 0) } @@ -272,7 +272,10 @@ open class MainActivity : BaseActivity(), SnackbarActivity { } override fun onOptionsItemSelected(item: MenuItem): Boolean { - return if (drawerToggle?.onOptionsItemSelected(item) == true) { + return if (binding.root.parent is DrawerLayout && drawerToggle?.onOptionsItemSelected(item) == true) { + true + } else if (item.itemId == android.R.id.home) { + drawerFragment?.toggleDrawer() true } else super.onOptionsItemSelected(item) } @@ -326,7 +329,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { launchTrace?.stop() launchTrace = null - if (binding.toolbarTitle.text?.isNotBlank() != true) { + if (binding.content.toolbarTitle.text?.isNotBlank() != true) { navigationController.currentDestination?.let { updateToolbarTitle(it, null) } } } @@ -401,7 +404,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { viewModel.updateUser("flags.welcomed", true) } - val title = binding.toolbarTitle.text + val title = binding.content.toolbarTitle.text if (title.isBlank()) { viewModel.getToolbarTitle(0, null, null) { newTitle -> this.title = newTitle @@ -485,12 +488,12 @@ open class MainActivity : BaseActivity(), SnackbarActivity { val view = TutorialView(this, step, viewModel) view.setTutorialTexts(texts) view.setCanBeDeferred(canBeDeferred) - binding.overlayFrameLayout.children.forEach { + binding.content.overlayFrameLayout.children.forEach { if (it is TutorialView) { - binding.overlayFrameLayout.removeView(it) + binding.content.overlayFrameLayout.removeView(it) } } - binding.overlayFrameLayout.addView(view) + binding.content.overlayFrameLayout.addView(view) viewModel.logTutorialStatus(step, false) } @@ -544,11 +547,11 @@ open class MainActivity : BaseActivity(), SnackbarActivity { // a new error resets the timer to hide the error message errorJob?.cancel() } - binding.connectionIssueView.visibility = View.VISIBLE - binding.connectionIssueTextview.text = message + binding.content.connectionIssueView.visibility = View.VISIBLE + binding.content.connectionIssueTextview.text = message errorJob = lifecycleScope.launch(Dispatchers.Main) { delay(1.toDuration(DurationUnit.MINUTES)) - binding.connectionIssueView.visibility = View.GONE + binding.content.connectionIssueView.visibility = View.GONE } } } @@ -558,8 +561,8 @@ open class MainActivity : BaseActivity(), SnackbarActivity { errorJob?.cancel() } lifecycleScope.launch(Dispatchers.Main) { - if (binding.connectionIssueView.visibility == View.VISIBLE) { - binding.connectionIssueView.visibility = View.GONE + if (binding.content.connectionIssueView.visibility == View.VISIBLE) { + binding.content.connectionIssueView.visibility = View.GONE } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt index f1a69cc4f..18a67721d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt @@ -36,10 +36,10 @@ abstract class BaseMainFragment : BaseFragment() { protected var showsBackButton: Boolean = false open val activity get() = getActivity() as? MainActivity - val tabLayout get() = activity?.binding?.detailTabs - val collapsingToolbar get() = activity?.binding?.toolbar - val toolbarAccessoryContainer get() = activity?.binding?.toolbarAccessoryContainer - val bottomNavigation get() = activity?.binding?.bottomNavigation + val tabLayout get() = activity?.binding?.content?.detailTabs + val collapsingToolbar get() = activity?.binding?.content?.toolbar + val toolbarAccessoryContainer get() = activity?.binding?.content?.toolbarAccessoryContainer + val bottomNavigation get() = activity?.binding?.content?.bottomNavigation var usesTabLayout: Boolean = false var hidesToolbar: Boolean = false var usesBottomNavigation = false @@ -94,11 +94,11 @@ abstract class BaseMainFragment : BaseFragment() { var isTitleInteractive = false open fun updateToolbarInteractivity() { - activity?.binding?.toolbarTitle?.background?.alpha = if (isTitleInteractive) 255 else 0 + activity?.binding?.content?.toolbarTitle?.background?.alpha = if (isTitleInteractive) 255 else 0 if (isTitleInteractive) { - activity?.binding?.toolbarTitle?.setScaledPadding(context, 16, 4, 16, 4) + activity?.binding?.content?.toolbarTitle?.setScaledPadding(context, 16, 4, 16, 4) } else { - activity?.binding?.toolbarTitle?.setPadding(0) + activity?.binding?.content?.toolbarTitle?.setPadding(0) } } @@ -118,11 +118,11 @@ abstract class BaseMainFragment : BaseFragment() { } private fun hideToolbar() { - activity?.binding?.avatarWithBars?.root?.visibility = View.GONE + activity?.binding?.content?.avatarWithBars?.root?.visibility = View.GONE } private fun showToolbar() { - activity?.binding?.avatarWithBars?.root?.visibility = View.VISIBLE + activity?.binding?.content?.avatarWithBars?.root?.visibility = View.VISIBLE } private fun disableToolbarScrolling() { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt index e9b55dc2d..1660fe34f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt @@ -14,6 +14,8 @@ import androidx.core.content.ContextCompat import androidx.core.content.edit import androidx.core.os.bundleOf import androidx.core.view.GravityCompat +import androidx.core.view.isVisible +import androidx.drawerlayout.widget.DrawerLayout import androidx.fragment.app.DialogFragment import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.SimpleItemAnimator @@ -27,8 +29,6 @@ import com.habitrpg.android.habitica.databinding.DrawerMainBinding import com.habitrpg.android.habitica.extensions.getMinuteOrSeconds import com.habitrpg.android.habitica.extensions.getRemainingString import com.habitrpg.android.habitica.extensions.getShortRemainingString -import com.habitrpg.common.habitica.extensions.getThemeColor -import com.habitrpg.common.habitica.extensions.isUsingNightModeResources import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.MainNavigationController @@ -46,6 +46,7 @@ import com.habitrpg.android.habitica.ui.menu.HabiticaDrawerItem import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.viewmodels.NotificationsViewModel import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar +import com.habitrpg.common.habitica.extensions.getThemeColor import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.disposables.CompositeDisposable import kotlinx.coroutines.Dispatchers @@ -83,7 +84,7 @@ class NavigationDrawerFragment : DialogFragment() { private var activePromo: HabiticaPromotion? = null - private var drawerLayout: androidx.drawerlayout.widget.DrawerLayout? = null + private var drawerLayout: DrawerLayout? = null private var fragmentContainerView: View? = null private var mCurrentSelectedPosition = 0 @@ -96,6 +97,8 @@ class NavigationDrawerFragment : DialogFragment() { val isDrawerOpen: Boolean get() = drawerLayout?.isDrawerOpen(GravityCompat.START) ?: false + private var isTabletUI: Boolean = false + override fun onCreate(savedInstanceState: Bundle?) { val context = context adapter = if (context != null) { @@ -111,6 +114,7 @@ class NavigationDrawerFragment : DialogFragment() { mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION) mFromSavedInstanceState = true } + isTabletUI = resources.getBoolean(R.bool.isTabletUI) setHasOptionsMenu(true) } @@ -265,7 +269,9 @@ class NavigationDrawerFragment : DialogFragment() { if (!user.hasClass && !hasSpecialItems) { item.isVisible = false } else { - if (user.stats?.lvl ?: 0 < HabiticaSnackbar.MIN_LEVEL_FOR_SKILLS && (!hasSpecialItems)) { + if ((user.stats?.lvl + ?: 0) < HabiticaSnackbar.MIN_LEVEL_FOR_SKILLS && (!hasSpecialItems) + ) { item.pillText = getString(R.string.unlock_lvl_11) } else { item.pillText = null @@ -277,7 +283,7 @@ class NavigationDrawerFragment : DialogFragment() { val statsItem = getItemWithIdentifier(SIDEBAR_STATS) if (statsItem != null) { if (user.preferences?.disableClasses != true) { - if (user.stats?.lvl ?: 0 >= 10 && user.stats?.points ?: 0 > 0) { + if ((user.stats?.lvl ?: 0) >= 10 && (user.stats?.points ?: 0) > 0) { statsItem.pillText = user.stats?.points.toString() } else { statsItem.pillText = null @@ -399,7 +405,9 @@ class NavigationDrawerFragment : DialogFragment() { openSelection: Boolean = true, preventReselection: Boolean = true ) { - closeDrawer() + if (!isTabletUI) { + closeDrawer() + } if (adapter.selectedItem != null && adapter.selectedItem == transitionId && bundle == null && preventReselection) return adapter.selectedItem = transitionId @@ -417,7 +425,9 @@ class NavigationDrawerFragment : DialogFragment() { } private fun startNotificationsActivity() { - closeDrawer() + if (!isTabletUI) { + closeDrawer() + } val activity = activity as? MainActivity if (activity != null) { @@ -445,7 +455,7 @@ class NavigationDrawerFragment : DialogFragment() { */ fun setUp( fragmentId: Int, - drawerLayout: androidx.drawerlayout.widget.DrawerLayout, + drawerLayout: DrawerLayout, viewModel: NotificationsViewModel ) { fragmentContainerView = activity?.findViewById(fragmentId) @@ -475,15 +485,32 @@ class NavigationDrawerFragment : DialogFragment() { fun openDrawer() { val containerView = fragmentContainerView - if (containerView != null) { + if (containerView != null && containerView.parent is DrawerLayout) { drawerLayout?.openDrawer(containerView) + } else { + containerView?.isVisible = true } } fun closeDrawer() { val containerView = fragmentContainerView - if (containerView != null) { + if (containerView != null && containerView.parent is DrawerLayout) { drawerLayout?.closeDrawer(containerView) + } else { + containerView?.isVisible = false + } + } + + fun toggleDrawer() { + val containerView = fragmentContainerView + if (containerView != null && containerView.parent is DrawerLayout) { + if (drawerLayout?.isDrawerOpen(containerView) == true) { + drawerLayout?.closeDrawer(containerView) + } else { + drawerLayout?.openDrawer(containerView) + } + } else { + containerView?.isVisible = containerView?.isVisible != true } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt index bf202bb20..9c1a9a448 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt @@ -119,7 +119,7 @@ class TasksFragment : BaseMainFragment(), SearchView.O bottomNavigation?.listener = this bottomNavigation?.canAddTasks = viewModel.isPersonalBoard - activity?.binding?.toolbarTitle?.setOnClickListener { + activity?.binding?.content?.toolbarTitle?.setOnClickListener { viewModel.cycleOwnerIDs() } } @@ -199,7 +199,7 @@ class TasksFragment : BaseMainFragment(), SearchView.O dialog.viewModel = viewModel // There are some cases where these things might not be correctly set after the app resumes. This is just to catch that as best as possible - val navigation = bottomNavigation ?: activity?.binding?.bottomNavigation + val navigation = bottomNavigation ?: activity?.binding?.content?.bottomNavigation val taskType = navigation?.activeTaskType ?: activeFragment?.taskType dialog.setOnDismissListener { updateFilterIcon() }