Merge "Update dream summary when dream suppressed by bedtime mode" into tm-qpr-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 458f6fc..818689d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3359,6 +3359,8 @@
     <string name="screensaver_settings_title">Screen saver</string>
     <!-- List of synonyms used in the settings search bar to find the “Screen saver”. [CHAR LIMIT=NONE] -->
     <string name="keywords_screensaver">screensaver</string>
+    <!-- Summary for screensaver unavailable when Bedtime mode is on [CHAR LIMIT=50] -->
+    <string name="screensaver_settings_when_to_dream_bedtime">Unavailable because bedtime mode is on</string>
     <!-- The title for the toggle which disables/enables screen savers [CHAR_LIMIT=30] -->
     <string name="screensaver_settings_toggle_title">Use screen saver</string>
     <!-- Display settings screen, summary fragment for screen saver options, activated when docked or asleep and charging [CHAR LIMIT=35] -->
diff --git a/src/com/android/settings/display/ScreenSaverPreferenceController.java b/src/com/android/settings/display/ScreenSaverPreferenceController.java
index 676a567..de1aaea 100644
--- a/src/com/android/settings/display/ScreenSaverPreferenceController.java
+++ b/src/com/android/settings/display/ScreenSaverPreferenceController.java
@@ -18,6 +18,7 @@
 
 import androidx.preference.Preference;
 
+import com.android.settings.R;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.dream.DreamSettings;
 import com.android.settingslib.core.AbstractPreferenceController;
@@ -26,9 +27,12 @@
         PreferenceControllerMixin {
 
     private static final String KEY_SCREEN_SAVER = "screensaver";
+    private final boolean mDreamsDisabledByAmbientModeSuppression;
 
     public ScreenSaverPreferenceController(Context context) {
         super(context);
+        mDreamsDisabledByAmbientModeSuppression = context.getResources().getBoolean(
+                com.android.internal.R.bool.config_dreamsDisabledByAmbientModeSuppressionConfig);
     }
 
     @Override
@@ -47,7 +51,12 @@
 
     @Override
     public void updateState(Preference preference) {
-        preference.setSummary(DreamSettings.getSummaryTextWithDreamName(mContext));
+        if (mDreamsDisabledByAmbientModeSuppression
+                && AmbientDisplayAlwaysOnPreferenceController.isAodSuppressedByBedtime(mContext)) {
+            preference.setSummary(R.string.screensaver_settings_when_to_dream_bedtime);
+        } else {
+            preference.setSummary(DreamSettings.getSummaryTextWithDreamName(mContext));
+        }
     }
 
     private boolean isSystemUser() {
diff --git a/src/com/android/settings/dream/WhenToDreamPreferenceController.java b/src/com/android/settings/dream/WhenToDreamPreferenceController.java
index 4108e85..02ae6a7 100644
--- a/src/com/android/settings/dream/WhenToDreamPreferenceController.java
+++ b/src/com/android/settings/dream/WhenToDreamPreferenceController.java
@@ -20,7 +20,10 @@
 
 import androidx.preference.Preference;
 
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.display.AmbientDisplayAlwaysOnPreferenceController;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.dream.DreamBackend;
 
@@ -29,19 +32,34 @@
 
     private static final String WHEN_TO_START = "when_to_start";
     private final DreamBackend mBackend;
+    private final boolean mDreamsDisabledByAmbientModeSuppression;
 
     WhenToDreamPreferenceController(Context context) {
+        this(context, context.getResources().getBoolean(
+                com.android.internal.R.bool.config_dreamsDisabledByAmbientModeSuppressionConfig));
+    }
+
+    @VisibleForTesting
+    WhenToDreamPreferenceController(Context context,
+            boolean dreamsDisabledByAmbientModeSuppression) {
         super(context);
 
         mBackend = DreamBackend.getInstance(context);
+        mDreamsDisabledByAmbientModeSuppression = dreamsDisabledByAmbientModeSuppression;
     }
 
     @Override
     public void updateState(Preference preference) {
         super.updateState(preference);
 
-        int resId = DreamSettings.getDreamSettingDescriptionResId(mBackend.getWhenToDreamSetting());
-        preference.setSummary(preference.getContext().getString(resId));
+        if (mDreamsDisabledByAmbientModeSuppression
+                && AmbientDisplayAlwaysOnPreferenceController.isAodSuppressedByBedtime(mContext)) {
+            preference.setSummary(R.string.screensaver_settings_when_to_dream_bedtime);
+        } else {
+            final int resId = DreamSettings.getDreamSettingDescriptionResId(
+                    mBackend.getWhenToDreamSetting());
+            preference.setSummary(resId);
+        }
     }
 
     @Override
diff --git a/tests/robotests/src/com/android/settings/dream/WhenToDreamPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/dream/WhenToDreamPreferenceControllerTest.java
index 3305cde..458c5c6 100644
--- a/tests/robotests/src/com/android/settings/dream/WhenToDreamPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/dream/WhenToDreamPreferenceControllerTest.java
@@ -16,15 +16,24 @@
 
 package com.android.settings.dream;
 
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.os.PowerManager;
 
 import androidx.preference.Preference;
 import androidx.test.core.app.ApplicationProvider;
 
+import com.android.settings.R;
+import com.android.settings.display.AmbientDisplayAlwaysOnPreferenceController;
 import com.android.settingslib.dream.DreamBackend;
 import com.android.settingslib.dream.DreamBackend.WhenToDream;
 
@@ -38,32 +47,64 @@
 
 @RunWith(RobolectricTestRunner.class)
 public class WhenToDreamPreferenceControllerTest {
+    private static final String TEST_PACKAGE = "com.android.test";
 
     private WhenToDreamPreferenceController mController;
     private Context mContext;
     @Mock
     private DreamBackend mBackend;
+    @Mock
+    private PowerManager mPowerManager;
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private ApplicationInfo mApplicationInfo;
 
     @Before
-    public void setup() {
+    public void setup() throws Exception {
         MockitoAnnotations.initMocks(this);
-        mContext = ApplicationProvider.getApplicationContext();
-        mController = new WhenToDreamPreferenceController(mContext);
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        mController = new WhenToDreamPreferenceController(mContext, true);
         ReflectionHelpers.setField(mController, "mBackend", mBackend);
+        when(mContext.getSystemService(PowerManager.class)).thenReturn(mPowerManager);
+        when(mPowerManager.isAmbientDisplaySuppressedForTokenByApp(anyString(), anyInt()))
+                .thenReturn(false);
+
+        mApplicationInfo.uid = 1;
+        when(mContext.getString(
+                com.android.internal.R.string.config_defaultWellbeingPackage)).thenReturn(
+                TEST_PACKAGE);
+
+        when(mContext.getPackageManager()).thenReturn(mPackageManager);
+        when(mPackageManager.getApplicationInfo(TEST_PACKAGE, /* flag= */ 0)).thenReturn(
+                mApplicationInfo);
     }
 
     @Test
-    public void updateSummary() {
+    public void testUpdateSummary() {
         // Don't have to test the other settings because DreamSettings tests that all
         // @WhenToDream values map to the correct ResId
         final @WhenToDream int testSetting = DreamBackend.WHILE_CHARGING;
         final Preference mockPref = mock(Preference.class);
         when(mockPref.getContext()).thenReturn(mContext);
         when(mBackend.getWhenToDreamSetting()).thenReturn(testSetting);
-        final String expectedString =
-                mContext.getString(DreamSettings.getDreamSettingDescriptionResId(testSetting));
+        final int expectedResId = DreamSettings.getDreamSettingDescriptionResId(testSetting);
 
         mController.updateState(mockPref);
-        verify(mockPref).setSummary(expectedString);
+        verify(mockPref).setSummary(expectedResId);
+    }
+
+    @Test
+    public void testBedtimeModeSuppression() {
+        final Preference mockPref = mock(Preference.class);
+        when(mockPref.getContext()).thenReturn(mContext);
+        when(mBackend.getWhenToDreamSetting()).thenReturn(DreamBackend.WHILE_CHARGING);
+        when(mPowerManager.isAmbientDisplaySuppressedForTokenByApp(anyString(), anyInt()))
+                .thenReturn(true);
+
+        assertTrue(AmbientDisplayAlwaysOnPreferenceController.isAodSuppressedByBedtime(mContext));
+
+        mController.updateState(mockPref);
+        verify(mockPref).setSummary(R.string.screensaver_settings_when_to_dream_bedtime);
     }
 }