From cfbb9db6ac6c9e0e7e676ceb1b378c403d672b6f Mon Sep 17 00:00:00 2001
From: Light_summer <93428659+lightsummer233@users.noreply.github.com>
Date: Wed, 1 May 2024 08:35:04 +0800
Subject: [PATCH] Updater: Drop fitsSystemWindows, fix fab issue (#51)
---
.../yukonga/update/activity/MainActivity.kt | 52 +++++-----
.../yukonga/update/logic/utils/AppUtils.kt | 95 +++++++++++++++++++
.../main/res/layout-land/activity_main.xml | 6 +-
app/src/main/res/layout-land/main_content.xml | 2 +
app/src/main/res/layout/activity_main.xml | 9 +-
app/src/main/res/layout/main_content.xml | 2 +
app/src/main/res/values/ids.xml | 14 +++
7 files changed, 144 insertions(+), 36 deletions(-)
create mode 100644 app/src/main/res/values/ids.xml
diff --git a/app/src/main/kotlin/top/yukonga/update/activity/MainActivity.kt b/app/src/main/kotlin/top/yukonga/update/activity/MainActivity.kt
index fd537d81..3fb3625d 100644
--- a/app/src/main/kotlin/top/yukonga/update/activity/MainActivity.kt
+++ b/app/src/main/kotlin/top/yukonga/update/activity/MainActivity.kt
@@ -9,7 +9,6 @@ import android.text.InputType
import android.text.TextWatcher
import android.text.method.LinkMovementMethod
import android.view.View.OnFocusChangeListener
-import android.view.WindowInsets
import android.view.WindowManager
import android.widget.ArrayAdapter
import android.widget.LinearLayout
@@ -44,9 +43,10 @@ import top.yukonga.update.logic.utils.AnimUtils.fadInAnimation
import top.yukonga.update.logic.utils.AnimUtils.fadOutAnimation
import top.yukonga.update.logic.utils.AnimUtils.setTextAnimation
import top.yukonga.update.logic.utils.AppUtils
+import top.yukonga.update.logic.utils.AppUtils.addInsetsByMargin
+import top.yukonga.update.logic.utils.AppUtils.addInsetsByPadding
import top.yukonga.update.logic.utils.AppUtils.dp
import top.yukonga.update.logic.utils.AppUtils.hideKeyBoard
-import top.yukonga.update.logic.utils.AppUtils.isLandscape
import top.yukonga.update.logic.utils.AppUtils.json
import top.yukonga.update.logic.utils.AppUtils.setCopyClickListener
import top.yukonga.update.logic.utils.AppUtils.setDownloadClickListener
@@ -173,8 +173,8 @@ class MainActivity : AppCompatActivity() {
} else {
showStringToast(this@MainActivity, getString(R.string.login_expired_dialog), 0)
activityMainBinding.apply {
- topAppBar.menu.findItem(R.id.login).isVisible = true
- topAppBar.menu.findItem(R.id.logout).isVisible = false
+ toolbar.menu.findItem(R.id.login).isVisible = true
+ toolbar.menu.findItem(R.id.logout).isVisible = false
}
}
}
@@ -301,11 +301,11 @@ class MainActivity : AppCompatActivity() {
MaterialAlertDialogBuilder(this@MainActivity).apply {
setView(view)
setNegativeButton(getString(R.string.cancel)) { dialog, _ ->
- hapticReject(activityMainBinding.topAppBar)
+ hapticReject(activityMainBinding.toolbar)
dialog.dismiss()
}
setPositiveButton(getString(R.string.login)) { _, _ ->
- hapticConfirm(activityMainBinding.topAppBar)
+ hapticConfirm(activityMainBinding.toolbar)
val global = prefs.getString("global", "") ?: "0"
val savePassword = prefs.getString("save_password", "") ?: "0"
val mInputAccount = inputAccount.text.toString()
@@ -320,8 +320,8 @@ class MainActivity : AppCompatActivity() {
loginDesc.text = getString(R.string.using_v2)
}
activityMainBinding.apply {
- topAppBar.menu.findItem(R.id.login).isVisible = false
- topAppBar.menu.findItem(R.id.logout).isVisible = true
+ toolbar.menu.findItem(R.id.login).isVisible = false
+ toolbar.menu.findItem(R.id.logout).isVisible = true
}
}
}
@@ -334,11 +334,11 @@ class MainActivity : AppCompatActivity() {
MaterialAlertDialogBuilder(this@MainActivity).apply {
setTitle(getString(R.string.logout))
setMessage(getString(R.string.logout_desc)).setNegativeButton(getString(R.string.cancel)) { dialog, _ ->
- hapticReject(activityMainBinding.topAppBar)
+ hapticReject(activityMainBinding.toolbar)
dialog.dismiss()
}
setPositiveButton(getString(R.string.confirm)) { _, _ ->
- hapticConfirm(activityMainBinding.topAppBar)
+ hapticConfirm(activityMainBinding.toolbar)
CoroutineScope(Dispatchers.Default).launch {
LoginUtils().logout(this@MainActivity)
withContext(Dispatchers.Main) {
@@ -348,8 +348,8 @@ class MainActivity : AppCompatActivity() {
loginDesc.text = getString(R.string.login_desc)
}
activityMainBinding.apply {
- topAppBar.menu.findItem(R.id.login).isVisible = true
- topAppBar.menu.findItem(R.id.logout).isVisible = false
+ toolbar.menu.findItem(R.id.login).isVisible = true
+ toolbar.menu.findItem(R.id.logout).isVisible = false
}
}
}
@@ -368,21 +368,17 @@ class MainActivity : AppCompatActivity() {
}
private fun setupEdgeToEdge() {
+
+ // Enable edge to edge
enableEdgeToEdge()
if (AppUtils.atLeast(Build.VERSION_CODES.Q)) window.isNavigationBarContrastEnforced = false
- if (AppUtils.atLeast(Build.VERSION_CODES.R)) {
- mainContentBinding.downloadInfo.setOnApplyWindowInsetsListener { _, insets ->
- mainContentBinding.downloadInfo.layoutParams.apply {
- (this as LinearLayout.LayoutParams).bottomMargin =
- if (isLandscape()) 32.dp else 24.dp + insets.getInsets(WindowInsets.Type.systemGestures()).bottom
- }
- insets
- }
- } else {
- mainContentBinding.downloadInfo.layoutParams.apply {
- (this as LinearLayout.LayoutParams).bottomMargin = if (isLandscape()) 32.dp else 24.dp + 46.dp
- }
- }
+
+ // Add insets
+ activityMainBinding.root.addInsetsByPadding(top = true)
+ activityMainBinding.appBarLayout.addInsetsByPadding(left = true, right = true)
+ activityMainBinding.implement.addInsetsByMargin(bottom = true, left = true, right = true)
+ mainContentBinding.scrollView.addInsetsByPadding(left = true, right = true, bottom = true)
+
}
private fun setupCutoutMode() {
@@ -531,7 +527,7 @@ class MainActivity : AppCompatActivity() {
}
private fun setupTopAppBar() {
- activityMainBinding.topAppBar.apply {
+ activityMainBinding.toolbar.apply {
setNavigationOnClickListener {
hapticConfirm(this)
showAboutDialog()
@@ -566,8 +562,8 @@ class MainActivity : AppCompatActivity() {
loginDesc.text = getString(R.string.using_v2)
}
activityMainBinding.apply {
- topAppBar.menu.findItem(R.id.login).isVisible = false
- topAppBar.menu.findItem(R.id.logout).isVisible = true
+ toolbar.menu.findItem(R.id.login).isVisible = false
+ toolbar.menu.findItem(R.id.logout).isVisible = true
}
}
}
diff --git a/app/src/main/kotlin/top/yukonga/update/logic/utils/AppUtils.kt b/app/src/main/kotlin/top/yukonga/update/logic/utils/AppUtils.kt
index 498e8aba..aa582bc3 100644
--- a/app/src/main/kotlin/top/yukonga/update/logic/utils/AppUtils.kt
+++ b/app/src/main/kotlin/top/yukonga/update/logic/utils/AppUtils.kt
@@ -10,9 +10,14 @@ import android.net.Uri
import android.os.Build
import android.util.TypedValue
import android.view.View
+import android.view.ViewGroup
import android.view.WindowInsets
import android.view.inputmethod.InputMethodManager
import androidx.appcompat.app.AppCompatActivity.INPUT_METHOD_SERVICE
+import androidx.core.graphics.Insets
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.updatePadding
import com.google.android.material.button.MaterialButton
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.serialization.json.Json
@@ -86,4 +91,94 @@ object AppUtils {
}
}
+ fun View.addInsetsByPadding(
+ top: Boolean = false,
+ bottom: Boolean = false,
+ left: Boolean = false,
+ right: Boolean = false
+ ) {
+ ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
+ val inset = Insets.max(
+ insets.getInsets(WindowInsetsCompat.Type.systemBars()),
+ insets.getInsets(WindowInsetsCompat.Type.displayCutout())
+ )
+ if (top) {
+ val lastTopPadding = view.getTag(R.id.view_add_insets_padding_top_tag) as? Int ?: 0
+ val newTopPadding = inset.top
+ view.setTag(R.id.view_add_insets_padding_top_tag, newTopPadding)
+ view.updatePadding(top = view.paddingTop - lastTopPadding + newTopPadding)
+ }
+ if (bottom) {
+ val lastBottomPadding =
+ view.getTag(R.id.view_add_insets_padding_bottom_tag) as? Int ?: 0
+ val newBottomPadding = inset.bottom
+ view.setTag(R.id.view_add_insets_padding_bottom_tag, newBottomPadding)
+ view.updatePadding(bottom = view.paddingBottom - lastBottomPadding + newBottomPadding)
+ }
+ if (left) {
+ val lastLeftPadding = view.getTag(R.id.view_add_insets_padding_left_tag) as? Int ?: 0
+ val newLeftPadding = inset.left
+ view.setTag(R.id.view_add_insets_padding_left_tag, newLeftPadding)
+ view.updatePadding(left = view.paddingLeft - lastLeftPadding + newLeftPadding)
+ }
+ if (right) {
+ val lastRightPadding = view.getTag(R.id.view_add_insets_padding_right_tag) as? Int ?: 0
+ val newRightPadding = inset.right
+ view.setTag(R.id.view_add_insets_padding_right_tag, newRightPadding)
+ view.updatePadding(right = view.paddingRight - lastRightPadding + newRightPadding)
+ }
+ return@setOnApplyWindowInsetsListener insets
+ }
+ }
+
+ fun View.addInsetsByMargin(
+ top: Boolean = false,
+ bottom: Boolean = false,
+ left: Boolean = false,
+ right: Boolean = false
+ ) {
+ ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
+ val inset = Insets.max(
+ insets.getInsets(WindowInsetsCompat.Type.systemBars()),
+ insets.getInsets(WindowInsetsCompat.Type.displayCutout())
+ )
+ if (top) {
+ val lastTopMargin = view.getTag(R.id.view_add_insets_margin_top_tag) as? Int ?: 0
+ val newTopMargin = inset.top
+ view.setTag(R.id.view_add_insets_margin_top_tag, newTopMargin)
+ (view.layoutParams as? ViewGroup.MarginLayoutParams)?.let { layoutParams ->
+ layoutParams.topMargin = layoutParams.topMargin - lastTopMargin + newTopMargin
+ view.layoutParams = layoutParams
+ }
+ }
+ if (bottom) {
+ val lastBottomMargin = view.getTag(R.id.view_add_insets_margin_bottom_tag) as? Int ?: 0
+ val newBottomMargin = inset.bottom
+ view.setTag(R.id.view_add_insets_margin_bottom_tag, newBottomMargin)
+ (view.layoutParams as? ViewGroup.MarginLayoutParams)?.let { layoutParams ->
+ layoutParams.bottomMargin = layoutParams.bottomMargin - lastBottomMargin + newBottomMargin
+ view.layoutParams = layoutParams
+ }
+ }
+ if (left) {
+ val lastLeftMargin = view.getTag(R.id.view_add_insets_margin_left_tag) as? Int ?: 0
+ val newLeftMargin = inset.left
+ view.setTag(R.id.view_add_insets_margin_left_tag, newLeftMargin)
+ (view.layoutParams as? ViewGroup.MarginLayoutParams)?.let { layoutParams ->
+ layoutParams.leftMargin = layoutParams.leftMargin - lastLeftMargin + newLeftMargin
+ view.layoutParams = layoutParams
+ }
+ }
+ if (right) {
+ val lastRightMargin = view.getTag(R.id.view_add_insets_margin_right_tag) as? Int ?: 0
+ val newRightMargin = inset.right
+ view.setTag(R.id.view_add_insets_margin_right_tag, newRightMargin)
+ (view.layoutParams as? ViewGroup.MarginLayoutParams)?.let { layoutParams ->
+ layoutParams.rightMargin = layoutParams.rightMargin - lastRightMargin + newRightMargin
+ view.layoutParams = layoutParams
+ }
+ }
+ return@setOnApplyWindowInsetsListener insets
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml
index 2d341cba..50b42322 100644
--- a/app/src/main/res/layout-land/activity_main.xml
+++ b/app/src/main/res/layout-land/activity_main.xml
@@ -2,10 +2,10 @@
+ android:layout_height="match_parent">
+ android:layout_height="match_parent">
+ app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/main_content.xml b/app/src/main/res/layout/main_content.xml
index 4af38bc5..01af9b32 100644
--- a/app/src/main/res/layout/main_content.xml
+++ b/app/src/main/res/layout/main_content.xml
@@ -2,8 +2,10 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file