Use WindowManagerProxy.getRotation to determine if rotation has changed

- Follow-up of http://ag/19559863 as Config diff on windowConfiguration does not work on 3P Launcher, so diff WindowManagerProxy.getRotation instead
- Also centralized Configuration diff logic into StatefulActivity

Bug: 240730723
Test: manual on 90/180 degree rotation in Launcher, RecentsActivity and 3P Launcher
Change-Id: Ib368ed5d749841a6873a03e2644608ff68885922
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 03ff146..e55321b 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -18,8 +18,6 @@
 
 import static android.app.PendingIntent.FLAG_IMMUTABLE;
 import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;
-import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION;
-import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE;
 import static android.content.pm.ActivityInfo.CONFIG_UI_MODE;
 import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO;
 import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
@@ -310,8 +308,6 @@
     private static final FloatProperty<Hotseat> HOTSEAT_WIDGET_SCALE =
             HOTSEAT_SCALE_PROPERTY_FACTORY.get(SCALE_INDEX_WIDGET_TRANSITION);
 
-    private Configuration mOldConfig;
-
     @Thunk
     Workspace<?> mWorkspace;
     @Thunk
@@ -466,7 +462,6 @@
         super.onCreate(savedInstanceState);
 
         LauncherAppState app = LauncherAppState.getInstance(this);
-        mOldConfig = new Configuration(getResources().getConfiguration());
         mModel = app.getModel();
 
         mRotationHelper = new RotationHelper(this);
@@ -614,21 +609,6 @@
         dispatchDeviceProfileChanged();
     }
 
-    @Override
-    public void handleConfigurationChanged(Configuration newConfig) {
-        if (compareConfiguration(mOldConfig, newConfig)) {
-            onIdpChanged(false);
-        }
-
-        mOldConfig.setTo(newConfig);
-        super.handleConfigurationChanged(newConfig);
-    }
-
-    protected boolean compareConfiguration(Configuration oldConfig, Configuration newConfig) {
-        int diff = newConfig.diff(oldConfig);
-        return (diff & (CONFIG_ORIENTATION | CONFIG_SCREEN_SIZE)) != 0;
-    }
-
     /**
      * Initializes the drag controller.
      */
@@ -638,6 +618,11 @@
 
     @Override
     public void onIdpChanged(boolean modelPropertiesChanged) {
+        onHandleConfigurationChanged();
+    }
+
+    @Override
+    protected void onHandleConfigurationChanged() {
         if (!initDeviceProfile(mDeviceProfile.inv)) {
             return;
         }
diff --git a/src/com/android/launcher3/statemanager/StatefulActivity.java b/src/com/android/launcher3/statemanager/StatefulActivity.java
index eea9091..2a890c3 100644
--- a/src/com/android/launcher3/statemanager/StatefulActivity.java
+++ b/src/com/android/launcher3/statemanager/StatefulActivity.java
@@ -15,10 +15,14 @@
  */
 package com.android.launcher3.statemanager;
 
+import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION;
+import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE;
+
 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.Bundle;
 import android.os.Handler;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -31,6 +35,7 @@
 import com.android.launcher3.Utilities;
 import com.android.launcher3.statemanager.StateManager.AtomicAnimationFactory;
 import com.android.launcher3.statemanager.StateManager.StateHandler;
+import com.android.launcher3.util.window.WindowManagerProxy;
 import com.android.launcher3.views.BaseDragLayer;
 
 import java.util.List;
@@ -48,6 +53,17 @@
 
     private LauncherRootView mRootView;
 
+    protected Configuration mOldConfig;
+    private int mOldRotation;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mOldConfig = new Configuration(getResources().getConfiguration());
+        mOldRotation = WindowManagerProxy.INSTANCE.get(this).getRotation(this);
+    }
+
     /**
      * Create handlers to control the property changes for this activity
      */
@@ -198,5 +214,21 @@
      * Handles configuration change when system calls {@link #onConfigurationChanged}, or on other
      * situations that configuration might change.
      */
-    public void handleConfigurationChanged(Configuration newConfig) {}
+    public void handleConfigurationChanged(Configuration newConfig) {
+        int diff = newConfig.diff(mOldConfig);
+        int rotation = WindowManagerProxy.INSTANCE.get(this).getRotation(this);
+        if ((diff & (CONFIG_ORIENTATION | CONFIG_SCREEN_SIZE)) != 0
+                || rotation != mOldRotation) {
+            onHandleConfigurationChanged();
+        }
+
+        mOldConfig.setTo(newConfig);
+        mOldRotation = rotation;
+    }
+
+    /**
+     * Logic for when device configuration changes (rotation, screen size change, multi-window,
+     * etc.)
+     */
+    protected abstract void onHandleConfigurationChanged();
 }