From ccc430e2c131784c7a17c66415dd2bd792c02a4b Mon Sep 17 00:00:00 2001 From: Alex Chau Date: Tue, 9 Aug 2022 11:59:45 +0100 Subject: [PATCH] Detect potential WindowConfiguration change at onApplyWindowInsets - Invoke onConfiguration when receiving inset changes - In Laucnher/RecentsActivity onConfiguration, additionally detect for windowConfiguration's rotation change; if Configuration stays the same, it'll be ignored. Bug: 240730723 Test: manual on 90/180 degree rotation in Launcher and RecentsActivity Change-Id: I7087878af847d62e1c715a4f52a18818d1a6c258 --- .../launcher3/BaseQuickstepLauncher.java | 18 +++++++++++++++++ .../android/quickstep/RecentsActivity.java | 20 +++++++++++++++---- src/com/android/launcher3/Launcher.java | 12 +++++++---- .../android/launcher3/LauncherRootView.java | 2 ++ .../statemanager/StatefulActivity.java | 13 ++++++++++++ 5 files changed, 57 insertions(+), 8 deletions(-) diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java index c2e8658401..1ffa8891fd 100644 --- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java @@ -15,6 +15,9 @@ */ package com.android.launcher3; +import static android.app.WindowConfiguration.WINDOW_CONFIG_ROTATION; +import static android.content.pm.ActivityInfo.CONFIG_WINDOW_CONFIGURATION; + import static com.android.launcher3.AbstractFloatingView.TYPE_ALL; import static com.android.launcher3.AbstractFloatingView.TYPE_HIDE_BACK_BUTTON; import static com.android.launcher3.LauncherState.FLAG_HIDE_BACK_BUTTON; @@ -43,6 +46,7 @@ import android.app.ActivityOptions; import android.content.Context; import android.content.Intent; import android.content.IntentSender; +import android.content.res.Configuration; import android.hardware.SensorManager; import android.hardware.devicestate.DeviceStateManager; import android.os.Bundle; @@ -649,6 +653,20 @@ public abstract class BaseQuickstepLauncher extends Launcher { } } + @Override + protected boolean compareConfiguration(Configuration oldConfig, Configuration newConfig) { + int diff = newConfig.diff(oldConfig); + if ((diff & CONFIG_WINDOW_CONFIGURATION) != 0) { + long windowDiff = + newConfig.windowConfiguration.diff(oldConfig.windowConfiguration, false); + if ((windowDiff & WINDOW_CONFIG_ROTATION) != 0) { + return true; + } + } + + return super.compareConfiguration(oldConfig, newConfig); + } + @Override public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { super.dump(prefix, fd, writer, args); diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index 4435eda184..1a966e2516 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -15,8 +15,10 @@ */ package com.android.quickstep; +import static android.app.WindowConfiguration.WINDOW_CONFIG_ROTATION; import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION; import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE; +import static android.content.pm.ActivityInfo.CONFIG_WINDOW_CONFIGURATION; import static com.android.launcher3.QuickstepTransitionManager.RECENTS_LAUNCH_DURATION; import static com.android.launcher3.QuickstepTransitionManager.STATUS_BAR_TRANSITION_DURATION; @@ -348,13 +350,23 @@ public final class RecentsActivity extends StatefulActivity { } @Override - public void onConfigurationChanged(Configuration newConfig) { - int diff = newConfig.diff(mOldConfig); - if ((diff & (CONFIG_ORIENTATION | CONFIG_SCREEN_SIZE)) != 0) { + public void handleConfigurationChanged(Configuration newConfig) { + if (compareConfiguration(mOldConfig, newConfig)) { onHandleConfigChanged(); } mOldConfig.setTo(newConfig); - super.onConfigurationChanged(newConfig); + super.handleConfigurationChanged(newConfig); + } + + private boolean compareConfiguration(Configuration oldConfig, Configuration newConfig) { + int diff = newConfig.diff(oldConfig); + if ((diff & CONFIG_WINDOW_CONFIGURATION) != 0) { + long windowDiff = + newConfig.windowConfiguration.diff(oldConfig.windowConfiguration, false); + return (windowDiff & WINDOW_CONFIG_ROTATION) != 0; + } + + return (diff & (CONFIG_ORIENTATION | CONFIG_SCREEN_SIZE)) != 0; } @Override diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 5ee9aa8668..03ff146edf 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -615,14 +615,18 @@ public class Launcher extends StatefulActivity } @Override - public void onConfigurationChanged(Configuration newConfig) { - int diff = newConfig.diff(mOldConfig); - if ((diff & (CONFIG_ORIENTATION | CONFIG_SCREEN_SIZE)) != 0) { + public void handleConfigurationChanged(Configuration newConfig) { + if (compareConfiguration(mOldConfig, newConfig)) { onIdpChanged(false); } mOldConfig.setTo(newConfig); - super.onConfigurationChanged(newConfig); + super.handleConfigurationChanged(newConfig); + } + + protected boolean compareConfiguration(Configuration oldConfig, Configuration newConfig) { + int diff = newConfig.diff(oldConfig); + return (diff & (CONFIG_ORIENTATION | CONFIG_SCREEN_SIZE)) != 0; } /** diff --git a/src/com/android/launcher3/LauncherRootView.java b/src/com/android/launcher3/LauncherRootView.java index a5c5c02735..1592154c3a 100644 --- a/src/com/android/launcher3/LauncherRootView.java +++ b/src/com/android/launcher3/LauncherRootView.java @@ -55,6 +55,8 @@ public class LauncherRootView extends InsettableFrameLayout { @Override public WindowInsets onApplyWindowInsets(WindowInsets insets) { + mActivity.handleConfigurationChanged(mActivity.getResources().getConfiguration()); + insets = WindowManagerProxy.INSTANCE.get(getContext()) .normalizeWindowInsets(getContext(), insets, mTempRect); handleSystemWindowInsets(mTempRect); diff --git a/src/com/android/launcher3/statemanager/StatefulActivity.java b/src/com/android/launcher3/statemanager/StatefulActivity.java index 2158dea3fe..eea90919ba 100644 --- a/src/com/android/launcher3/statemanager/StatefulActivity.java +++ b/src/com/android/launcher3/statemanager/StatefulActivity.java @@ -18,6 +18,7 @@ package com.android.launcher3.statemanager; import static com.android.launcher3.LauncherState.FLAG_CLOSE_POPUPS; import static com.android.launcher3.LauncherState.FLAG_NON_INTERACTIVE; +import android.content.res.Configuration; import android.os.Handler; import android.view.LayoutInflater; import android.view.View; @@ -186,4 +187,16 @@ public abstract class StatefulActivity> public void runOnBindToTouchInteractionService(Runnable r) { r.run(); } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + handleConfigurationChanged(newConfig); + super.onConfigurationChanged(newConfig); + } + + /** + * Handles configuration change when system calls {@link #onConfigurationChanged}, or on other + * situations that configuration might change. + */ + public void handleConfigurationChanged(Configuration newConfig) {} }