Unverified Commit 38f906a6 authored by Codrut Topliceanu's avatar Codrut Topliceanu Committed by GitHub
Browse files

For #17805 - Fix adjustResize deprecation (#18252)

* For #17805 - Fix adjustResize deprecation

To handle the deprecation of `adjustResize` I've moved it from `styles.xml` and `AndroidManifest.xml` to `Activity.kt` as a fallback for devices with Android < 11. For Android 11 and up `setDecorFitsSystemWindows(false)` and `OnApplyWindowInsetsListener` will be used to handle app insets. Normal use activities should call `enableSystemInsetsHandling` in `onCreate` as to properly display system bars and for proper keyboard handling.
parent 51cbcf37
......@@ -77,8 +77,7 @@
android:configChanges="keyboard|keyboardHidden|mcc|mnc|orientation|screenSize|layoutDirection|smallestScreenSize|screenLayout"
android:launchMode="singleTask"
android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:windowSoftInputMode="adjustResize">
android:supportsPictureInPicture="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
......@@ -135,7 +134,7 @@
android:taskAffinity=""
android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:windowSoftInputMode="adjustResize|stateAlwaysHidden" />
android:windowSoftInputMode="stateAlwaysHidden" />
<activity
android:name=".IntentReceiverActivity"
......@@ -239,7 +238,7 @@
android:configChanges="keyboard|keyboardHidden|mcc|mnc|orientation|screenSize|layoutDirection|smallestScreenSize|screenLayout"
android:exported="false"
android:taskAffinity=""
android:windowSoftInputMode="adjustResize|stateAlwaysHidden" />
android:windowSoftInputMode="stateAlwaysHidden" />
<activity android:name=".settings.account.AuthIntentReceiverActivity"
android:exported="false" />
......
......@@ -77,6 +77,7 @@ import org.mozilla.fenix.exceptions.trackingprotection.TrackingProtectionExcepti
import org.mozilla.fenix.ext.alreadyOnDestination
import org.mozilla.fenix.ext.breadcrumb
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.enableSystemInsetsHandling
import org.mozilla.fenix.ext.metrics
import org.mozilla.fenix.ext.nav
import org.mozilla.fenix.ext.settings
......@@ -254,6 +255,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
components.core.requestInterceptor.setNavigationController(navHost.navController)
enableSystemInsetsHandling()
StartupTimeline.onActivityCreateEndHome(this) // DO NOT MOVE ANYTHING BELOW HERE.
}
......
......@@ -5,6 +5,8 @@
package org.mozilla.fenix.customtabs
import android.content.Intent
import android.os.Bundle
import android.os.PersistableBundle
import androidx.annotation.VisibleForTesting
import androidx.navigation.NavDestination
import androidx.navigation.NavDirections
......@@ -20,6 +22,7 @@ import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.NavGraphDirections
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.enableSystemInsetsHandling
import java.security.InvalidParameterException
/**
......@@ -28,6 +31,12 @@ import java.security.InvalidParameterException
*/
@Suppress("TooManyFunctions")
open class ExternalAppBrowserActivity : HomeActivity() {
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
enableSystemInsetsHandling()
}
override fun onResume() {
super.onResume()
......
......@@ -5,7 +5,12 @@
package org.mozilla.fenix.ext
import android.app.Activity
import android.os.Build.VERSION
import android.os.Build.VERSION_CODES
import android.view.View
import android.view.Window
import android.view.WindowInsets
import android.view.WindowInsets.Type
import android.view.WindowManager
import mozilla.components.concept.base.crash.Breadcrumb
......@@ -48,3 +53,43 @@ fun Activity.breadcrumb(
)
)
}
/**
* Handles inset changes for the whole activity.
*
* The deprecation of [WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE] in [VERSION_CODES.R]
* means inset changes have to be handled with a [View.OnApplyWindowInsetsListener].
* [Window.setDecorFitsSystemWindows] false tells the system that the app will handle all insets.
* When a keyboard is opened [WindowInsets.getInsets] of [Type.ime] updates accordingly.
*
* See https://github.com/mozilla-mobile/fenix/issues/17805.
* */
fun Activity.enableSystemInsetsHandling() {
if (VERSION.SDK_INT >= VERSION_CODES.R) {
val currentInsetTypes = mutableSetOf<Int>()
currentInsetTypes.add(Type.systemBars())
currentInsetTypes.add(Type.statusBars())
currentInsetTypes.add(Type.mandatorySystemGestures())
currentInsetTypes.add(Type.ime())
window.setDecorFitsSystemWindows(false)
window.decorView.setOnApplyWindowInsetsListener { v, _ ->
val currentInsetTypeMask = currentInsetTypes.fold(0) { accumulator, type ->
accumulator or type
}
val insets = window.decorView.rootWindowInsets.getInsets(currentInsetTypeMask)
v.setPadding(insets.left, insets.top, insets.right, insets.bottom)
WindowInsets.Builder()
.setInsets(currentInsetTypeMask, insets)
.build()
}
} else {
@Suppress("DEPRECATION")
window.setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
)
}
}
......@@ -13,7 +13,8 @@ import android.content.Intent
import android.graphics.Color
import android.graphics.Typeface
import android.graphics.drawable.ColorDrawable
import android.os.Build
import android.os.Build.VERSION
import android.os.Build.VERSION_CODES
import android.os.Bundle
import android.speech.RecognizerIntent
import android.text.style.StyleSpan
......@@ -89,7 +90,8 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler {
// https://github.com/mozilla-mobile/fenix/issues/14279
// To prevent GeckoView from resizing we're going to change the softInputMode to not adjust
// the size of the window.
requireActivity().window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)
if (VERSION.SDK_INT < VERSION_CODES.R)
requireActivity().window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)
// Refocus the toolbar editing and show keyboard if the QR fragment isn't showing
if (childFragmentManager.findFragmentByTag(QR_FRAGMENT_TAG) == null) {
toolbarView.view.edit.focus()
......@@ -102,7 +104,8 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler {
// Let's reset back to the default behavior after we're done searching
// This will be addressed on https://github.com/mozilla-mobile/fenix/issues/17805
@Suppress("DEPRECATION")
requireActivity().window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
if (VERSION.SDK_INT < VERSION_CODES.R)
requireActivity().window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
}
override fun onCreate(savedInstanceState: Bundle?) {
......@@ -346,7 +349,7 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler {
private fun updateAccessibilityTraversalOrder() {
val searchWrapperId = search_wrapper.id
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP_MR1) {
qr_scan_button.accessibilityTraversalAfter = searchWrapperId
search_engines_shortcut_button.accessibilityTraversalAfter = searchWrapperId
fill_link_from_clipboard.accessibilityTraversalAfter = searchWrapperId
......
......@@ -4,17 +4,25 @@
package org.mozilla.fenix.settings.account
import android.os.Bundle
import android.os.PersistableBundle
import mozilla.components.concept.sync.AccountObserver
import mozilla.components.concept.sync.AuthType
import mozilla.components.concept.sync.OAuthAccount
import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.enableSystemInsetsHandling
/**
* A special custom tab for signing into a Firefox Account. The activity is closed once the user is signed in.
*/
class AuthCustomTabActivity : ExternalAppBrowserActivity() {
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
enableSystemInsetsHandling()
}
private val accountStateObserver = object : AccountObserver {
/**
* Navigate away from this activity when we have successful authentication
......
......@@ -342,7 +342,6 @@
<item name="android:windowAnimationStyle">@style/Animation.Design.BottomSheetDialog</item>
<item name="windowNoTitle">true</item>
<item name="android:windowIsFloating">false</item>
<item name="android:windowSoftInputMode">adjustResize</item>
<item name="windowActionBar">false</item>
<item name="android:windowFullscreen">false</item>
<item name="android:windowContentOverlay">@null</item>
......@@ -619,7 +618,6 @@
<item name="android:windowBackground">@android:color/transparent</item>
<item name="windowNoTitle">true</item>
<item name="android:windowIsFloating">false</item>
<item name="android:windowSoftInputMode">adjustResize</item>
<item name="windowActionBar">false</item>
<item name="android:windowFullscreen">false</item>
<item name="android:windowContentOverlay">@null</item>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment