Adds ContentObserver for Swipe Up enabled setting

Registers a ContentObserver to handle Swipe Up gesture enable/disable
changes from Settings App. Also provides a static method to get the
current state of settings for the Swipe Up feature.

Bug: 77549883
Test: Manual Test
Change-Id: I5aa13cebdcb78be4869e8a5ae7f570490c8ac05c
diff --git a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java
index c1590f6..a10583c 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java
@@ -18,8 +18,6 @@
 
 import static com.android.launcher3.LauncherState.NORMAL;
 import static com.android.launcher3.LauncherState.OVERVIEW;
-import static com.android.launcher3.Utilities.getPrefs;
-import static com.android.quickstep.OverviewInteractionState.KEY_SWIPE_UP_ENABLED;
 import static com.android.launcher3.LauncherState.ALL_APPS;
 
 import android.content.Context;
@@ -39,8 +37,8 @@
 public class UiFactory {
 
     public static TouchController[] createTouchControllers(Launcher launcher) {
-        SharedPreferences prefs = getPrefs(launcher);
-        boolean swipeUpEnabled = prefs.getBoolean(KEY_SWIPE_UP_ENABLED, true);
+        boolean swipeUpEnabled = OverviewInteractionState.getInstance(launcher)
+                .isSwipeUpGestureEnabled();
         if (!swipeUpEnabled) {
             return new TouchController[] {
                     launcher.getDragController(),
diff --git a/quickstep/src/com/android/quickstep/OverviewInteractionState.java b/quickstep/src/com/android/quickstep/OverviewInteractionState.java
index 22b1757..471262b 100644
--- a/quickstep/src/com/android/quickstep/OverviewInteractionState.java
+++ b/quickstep/src/com/android/quickstep/OverviewInteractionState.java
@@ -21,13 +21,14 @@
 import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_HIDE_BACK_BUTTON;
 import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_SHOW_OVERVIEW_BUTTON;
 
+import android.content.ContentResolver;
 import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.database.ContentObserver;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
 import android.os.RemoteException;
+import android.provider.Settings;
 import android.support.annotation.WorkerThread;
 import android.util.Log;
 
@@ -47,7 +48,7 @@
  *
  * @see com.android.systemui.shared.system.NavigationBarCompat.InteractionType and associated flags.
  */
-public class OverviewInteractionState implements OnSharedPreferenceChangeListener {
+public class OverviewInteractionState {
 
     private static final String TAG = "OverviewFlags";
 
@@ -70,12 +71,13 @@
         return INSTANCE;
     }
 
-    public static final String KEY_SWIPE_UP_ENABLED = "pref_enable_quickstep";
-
     private static final int MSG_SET_PROXY = 200;
     private static final int MSG_SET_BACK_BUTTON_VISIBLE = 201;
     private static final int MSG_SET_SWIPE_UP_ENABLED = 202;
 
+    private static final String SWIPE_UP_SETTING_NAME = "swipe_up_to_switch_apps_enabled";
+    private final SwipeUpGestureEnabledSettingObserver mSwipeUpSettingObserver;
+
     private final Handler mUiHandler;
     private final Handler mBgHandler;
 
@@ -88,19 +90,13 @@
         mUiHandler = new Handler(this::handleUiMessage);
         mBgHandler = new Handler(UiThreadHelper.getBackgroundLooper(), this::handleBgMessage);
 
-        SharedPreferences prefs = getPrefs(context);
-        prefs.registerOnSharedPreferenceChangeListener(this);
-        onSharedPreferenceChanged(prefs, KEY_SWIPE_UP_ENABLED);
+        mSwipeUpSettingObserver = new SwipeUpGestureEnabledSettingObserver(mUiHandler,
+                context.getContentResolver());
+        mSwipeUpSettingObserver.register();
     }
 
-    @Override
-    public void onSharedPreferenceChanged(SharedPreferences prefs, String s) {
-        if (KEY_SWIPE_UP_ENABLED.equals(s)) {
-            mUiHandler.removeMessages(MSG_SET_SWIPE_UP_ENABLED);
-            boolean swipeUpEnabled = prefs.getBoolean(s, true);
-            mUiHandler.obtainMessage(MSG_SET_SWIPE_UP_ENABLED,
-                    swipeUpEnabled ? 1 : 0, 0).sendToTarget();
-        }
+    public boolean isSwipeUpGestureEnabled() {
+        return mSwipeUpEnabled;
     }
 
     public void setBackButtonVisible(boolean visible) {
@@ -152,4 +148,32 @@
             Log.w(TAG, "Unable to update overview interaction flags", e);
         }
     }
+
+    private class SwipeUpGestureEnabledSettingObserver extends ContentObserver {
+        private Handler mHandler;
+        private ContentResolver mResolver;
+
+        SwipeUpGestureEnabledSettingObserver(Handler handler, ContentResolver resolver) {
+            super(handler);
+            mHandler = handler;
+            mResolver = resolver;
+        }
+
+        public void register() {
+            mResolver.registerContentObserver(Settings.Secure.getUriFor(SWIPE_UP_SETTING_NAME),
+                    false, this);
+            mSwipeUpEnabled = getValue();
+        }
+
+        @Override
+        public void onChange(boolean selfChange) {
+            super.onChange(selfChange);
+            mHandler.removeMessages(MSG_SET_SWIPE_UP_ENABLED);
+            mHandler.obtainMessage(MSG_SET_SWIPE_UP_ENABLED, getValue() ? 1 : 0, 0).sendToTarget();
+        }
+
+        private boolean getValue() {
+            return Settings.Secure.getInt(mResolver, SWIPE_UP_SETTING_NAME, 0) == 1;
+        }
+    }
 }