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() }