Add toggle switch for auto rotate preference in display settings.

Bug: 183471038

Test: locally with flame & crosshatch
Change-Id: Iea4dbdd6df8a53f0fb79b82c97892256ad072c1d
diff --git a/src/com/android/settings/display/SmartAutoRotatePreferenceController.java b/src/com/android/settings/display/SmartAutoRotatePreferenceController.java
index f8d5f96..849fbe7 100644
--- a/src/com/android/settings/display/SmartAutoRotatePreferenceController.java
+++ b/src/com/android/settings/display/SmartAutoRotatePreferenceController.java
@@ -22,6 +22,8 @@
 import static com.android.settings.display.SmartAutoRotateController.hasSufficientPermission;
 import static com.android.settings.display.SmartAutoRotateController.isRotationResolverServiceAvailable;
 
+import android.text.TextUtils;
+import android.app.settings.SettingsEnums;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -37,7 +39,9 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.view.RotationPolicy;
 import com.android.settings.R;
-import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnStart;
 import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -45,12 +49,10 @@
 /**
  * SmartAutoRotatePreferenceController provides auto rotate summary in display settings
  */
-public class SmartAutoRotatePreferenceController extends BasePreferenceController
+public class SmartAutoRotatePreferenceController extends TogglePreferenceController
         implements LifecycleObserver, OnStart, OnStop {
 
-    private RotationPolicy.RotationPolicyListener mRotationPolicyListener;
-    private Preference mPreference;
-
+    private final MetricsFeatureProvider mMetricsFeatureProvider;
     private final SensorPrivacyManager mPrivacyManager;
     private final PowerManager mPowerManager;
     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@@ -60,12 +62,16 @@
         }
     };
 
+    private RotationPolicy.RotationPolicyListener mRotationPolicyListener;
+    private Preference mPreference;
+
     public SmartAutoRotatePreferenceController(Context context, String preferenceKey) {
         super(context, preferenceKey);
         mPrivacyManager = SensorPrivacyManager.getInstance(context);
         mPrivacyManager
                 .addSensorPrivacyListener(CAMERA, (sensor, enabled) -> refreshSummary(mPreference));
         mPowerManager = context.getSystemService(PowerManager.class);
+        mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
     }
 
     @Override
@@ -75,12 +81,28 @@
     }
 
     @Override
+    public boolean isSliceable() {
+        return TextUtils.equals(getPreferenceKey(), "auto_rotate");
+    }
+
+    @Override
+    public boolean isPublicSlice() {
+        return true;
+    }
+
+    @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
         mPreference = screen.findPreference(getPreferenceKey());
     }
 
     @Override
+    public void updateState(Preference preference) {
+        super.updateState(preference);
+        refreshSummary(mPreference);
+    }
+
+    @Override
     public void onStart() {
         mContext.registerReceiver(mReceiver,
                 new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED));
@@ -89,7 +111,7 @@
                 @Override
                 public void onChange() {
                     if (mPreference != null) {
-                        refreshSummary(mPreference);
+                        updateState(mPreference);
                     }
                 }
             };
@@ -122,6 +144,20 @@
     }
 
     @Override
+    public boolean isChecked() {
+        return !RotationPolicy.isRotationLocked(mContext);
+    }
+
+    @Override
+    public boolean setChecked(boolean isChecked) {
+        final boolean isLocked = !isChecked;
+        mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_ROTATION_LOCK,
+                isLocked);
+        RotationPolicy.setRotationLock(mContext, isLocked);
+        return true;
+    }
+
+    @Override
     public CharSequence getSummary() {
         int activeStringId = R.string.auto_rotate_option_off;
         if (!RotationPolicy.isRotationLocked(mContext)) {