Merge "Disable lift-to-wake when always-on is checked" into oc-dr1-dev
diff --git a/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceController.java b/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceController.java
index bed04d3..5f97608 100644
--- a/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceController.java
+++ b/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceController.java
@@ -34,11 +34,17 @@
     private static final int MY_USER = UserHandle.myUserId();
 
     private final AmbientDisplayConfiguration mConfig;
+    private final OnPreferenceChangedCallback mCallback;
+
+    public interface OnPreferenceChangedCallback {
+        void onPreferenceChanged();
+    }
 
     public AmbientDisplayAlwaysOnPreferenceController(Context context,
-            AmbientDisplayConfiguration config) {
+            AmbientDisplayConfiguration config, OnPreferenceChangedCallback callback) {
         super(context);
         mConfig = config;
+        mCallback = callback;
     }
 
     @Override
@@ -55,6 +61,9 @@
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         int enabled = (boolean) newValue ? 1 : 0;
         Settings.Secure.putInt(mContext.getContentResolver(), DOZE_ALWAYS_ON, enabled);
+        if (mCallback != null) {
+            mCallback.onPreferenceChanged();
+        }
         return true;
     }
 
diff --git a/src/com/android/settings/display/AmbientDisplaySettings.java b/src/com/android/settings/display/AmbientDisplaySettings.java
index 011cccb..666d47a6 100644
--- a/src/com/android/settings/display/AmbientDisplaySettings.java
+++ b/src/com/android/settings/display/AmbientDisplaySettings.java
@@ -51,11 +51,13 @@
 
     private static List<PreferenceController> buildPreferenceControllers(Context context,
             Lifecycle lifecycle, AmbientDisplayConfiguration config,
-            MetricsFeatureProvider metricsFeatureProvider) {
+            MetricsFeatureProvider metricsFeatureProvider,
+            AmbientDisplayAlwaysOnPreferenceController.OnPreferenceChangedCallback aodCallback) {
         final List<PreferenceController> controllers = new ArrayList<>();
         controllers.add(new AmbientDisplayNotificationsPreferenceController(context, config,
                 metricsFeatureProvider));
-        controllers.add(new AmbientDisplayAlwaysOnPreferenceController(context, config));
+        controllers.add(new AmbientDisplayAlwaysOnPreferenceController(context, config,
+                aodCallback));
         controllers.add(new DoubleTapScreenPreferenceController(context, lifecycle, config,
                 MY_USER_ID, KEY_AMBIENT_DISPLAY_DOUBLE_TAP));
         controllers.add(new PickupGesturePreferenceController(context, lifecycle, config,
@@ -77,7 +79,8 @@
     @Override
     protected List<PreferenceController> getPreferenceControllers(Context context) {
         return buildPreferenceControllers(context, getLifecycle(),
-                new AmbientDisplayConfiguration(context), mMetricsFeatureProvider);
+                new AmbientDisplayConfiguration(context), mMetricsFeatureProvider,
+                () -> { updatePreferenceStates(); });
     }
 
     @Override
@@ -101,7 +104,7 @@
                 @Override
                 public List<PreferenceController> getPreferenceControllers(Context context) {
                     return buildPreferenceControllers(context, null,
-                            new AmbientDisplayConfiguration(context), null);
+                            new AmbientDisplayConfiguration(context), null, null);
                 }
             };
 }
diff --git a/src/com/android/settings/gestures/GesturePreferenceController.java b/src/com/android/settings/gestures/GesturePreferenceController.java
index e647bf3..a5df949 100644
--- a/src/com/android/settings/gestures/GesturePreferenceController.java
+++ b/src/com/android/settings/gestures/GesturePreferenceController.java
@@ -61,6 +61,8 @@
                         ? R.string.gesture_setting_on
                         : R.string.gesture_setting_off);
             }
+            // Different meanings of "Enabled" for the Preference and Controller.
+            preference.setEnabled(canHandleClicks());
         }
     }
 
@@ -81,4 +83,8 @@
     protected abstract String getVideoPrefKey();
 
     protected abstract boolean isSwitchPrefEnabled();
+
+    protected boolean canHandleClicks() {
+        return true;
+    }
 }
diff --git a/src/com/android/settings/gestures/PickupGesturePreferenceController.java b/src/com/android/settings/gestures/PickupGesturePreferenceController.java
index 6308b37..9b36b7c 100644
--- a/src/com/android/settings/gestures/PickupGesturePreferenceController.java
+++ b/src/com/android/settings/gestures/PickupGesturePreferenceController.java
@@ -76,4 +76,9 @@
                 Settings.Secure.DOZE_PULSE_ON_PICK_UP, enabled ? 1 : 0);
         return true;
     }
+
+    @Override
+    public boolean canHandleClicks() {
+        return mAmbientConfig.pulseOnPickupCanBeModified(mUserId);
+    }
 }
diff --git a/tests/robotests/src/com/android/internal/hardware/AmbientDisplayConfiguration.java b/tests/robotests/src/com/android/internal/hardware/AmbientDisplayConfiguration.java
index 7e3cd84..59ca483 100644
--- a/tests/robotests/src/com/android/internal/hardware/AmbientDisplayConfiguration.java
+++ b/tests/robotests/src/com/android/internal/hardware/AmbientDisplayConfiguration.java
@@ -34,6 +34,10 @@
         return true;
     }
 
+    public boolean pulseOnPickupCanBeModified(int user) {
+        return true;
+    }
+
     public boolean pulseOnDoubleTapAvailable() {
         return true;
     }
diff --git a/tests/robotests/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceControllerTest.java
index d38ac51..f01190a 100644
--- a/tests/robotests/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceControllerTest.java
@@ -48,11 +48,13 @@
     @Mock SwitchPreference mSwitchPreference;
 
     AmbientDisplayAlwaysOnPreferenceController mController;
+    boolean mCallbackInvoked;
 
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
-        mController = new AmbientDisplayAlwaysOnPreferenceController(mContext, mConfig);
+        mController = new AmbientDisplayAlwaysOnPreferenceController(mContext, mConfig,
+                () -> { mCallbackInvoked = true; });
     }
 
     @Test
@@ -76,6 +78,13 @@
     }
 
     @Test
+    public void onPreferenceChange_callback() throws Exception {
+        assertThat(mCallbackInvoked).isFalse();
+        mController.onPreferenceChange(mSwitchPreference, true);
+        assertThat(mCallbackInvoked).isTrue();
+    }
+
+    @Test
     public void onPreferenceChange_enable() throws Exception {
         mController.onPreferenceChange(mSwitchPreference, true);
 
diff --git a/tests/robotests/src/com/android/settings/gestures/PIckupGesturePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/PIckupGesturePreferenceControllerTest.java
index d81163d..1877200 100644
--- a/tests/robotests/src/com/android/settings/gestures/PIckupGesturePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/PIckupGesturePreferenceControllerTest.java
@@ -83,4 +83,18 @@
 
         assertThat(mController.isSwitchPrefEnabled()).isFalse();
     }
+
+    @Test
+    public void testCanHandleClicks_configIsSet_shouldReturnTrue() {
+        when(mAmbientDisplayConfiguration.pulseOnPickupCanBeModified(anyInt())).thenReturn(true);
+
+        assertThat(mController.canHandleClicks()).isTrue();
+    }
+
+    @Test
+    public void testCanHandleClicks_configIsNotSet_shouldReturnFalse() {
+        when(mAmbientDisplayConfiguration.pulseOnPickupCanBeModified(anyInt())).thenReturn(false);
+
+        assertThat(mController.canHandleClicks()).isFalse();
+    }
 }