diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 2021b471042..f2c540fcd90 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -103,9 +103,7 @@ - - - + Bluetooth will turn on - - - Unavailable because bedtime mode is on diff --git a/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceController.java b/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceController.java index 7749c8f19ab..6dee5d2675c 100644 --- a/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceController.java +++ b/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceController.java @@ -16,17 +16,12 @@ package com.android.settings.display; import android.content.Context; -import android.content.pm.PackageManager; import android.hardware.display.AmbientDisplayConfiguration; -import android.os.PowerManager; import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings; import android.text.TextUtils; -import androidx.preference.Preference; - -import com.android.settings.R; import com.android.settings.core.TogglePreferenceController; public class AmbientDisplayAlwaysOnPreferenceController extends TogglePreferenceController { @@ -36,9 +31,13 @@ public class AmbientDisplayAlwaysOnPreferenceController extends TogglePreference private static final int MY_USER = UserHandle.myUserId(); private static final String PROP_AWARE_AVAILABLE = "ro.vendor.aware_available"; - private static final String AOD_SUPPRESSED_TOKEN = "winddown"; private AmbientDisplayConfiguration mConfig; + private OnPreferenceChangedCallback mCallback; + + public interface OnPreferenceChangedCallback { + void onPreferenceChanged(); + } public AmbientDisplayAlwaysOnPreferenceController(Context context, String key) { super(context, key); @@ -51,12 +50,6 @@ public class AmbientDisplayAlwaysOnPreferenceController extends TogglePreference AVAILABLE : UNSUPPORTED_ON_DEVICE; } - @Override - public void updateState(Preference preference) { - super.updateState(preference); - refreshSummary(preference); - } - @Override public boolean isSliceable() { return TextUtils.equals(getPreferenceKey(), "ambient_display_always_on"); @@ -77,22 +70,24 @@ public class AmbientDisplayAlwaysOnPreferenceController extends TogglePreference int enabled = isChecked ? ON : OFF; Settings.Secure.putInt( mContext.getContentResolver(), Settings.Secure.DOZE_ALWAYS_ON, enabled); + if (mCallback != null) { + mCallback.onPreferenceChanged(); + } return true; } - @Override - public CharSequence getSummary() { - return mContext.getText( - isAodSuppressedByBedtime(mContext) ? R.string.aware_summary_when_bedtime_on - : R.string.doze_always_on_summary); - } - public AmbientDisplayAlwaysOnPreferenceController setConfig( AmbientDisplayConfiguration config) { mConfig = config; return this; } + public AmbientDisplayAlwaysOnPreferenceController setCallback( + OnPreferenceChangedCallback callback) { + mCallback = callback; + return this; + } + public static boolean isAvailable(AmbientDisplayConfiguration config) { return config.alwaysOnAvailableForUser(MY_USER); } @@ -103,25 +98,4 @@ public class AmbientDisplayAlwaysOnPreferenceController extends TogglePreference } return mConfig; } - - /** - * Returns whether AOD is suppressed by Bedtime mode, a feature of Digital Wellbeing. - * - * We know that Bedtime mode suppresses AOD using {@link AOD_SUPPRESSED_TOKEN}. If the Digital - * Wellbeing app is suppressing AOD with {@link AOD_SUPPRESSED_TOKEN}, then we can infer that - * AOD is being suppressed by Bedtime mode. - */ - public static boolean isAodSuppressedByBedtime(Context context) { - int uid; - final PowerManager powerManager = context.getSystemService(PowerManager.class); - final PackageManager packageManager = context.getPackageManager(); - final String packageName = context.getString( - com.android.internal.R.string.config_defaultWellbeingPackage); - try { - uid = packageManager.getApplicationInfo(packageName, /* flags= */ 0).uid; - } catch (PackageManager.NameNotFoundException e) { - return false; - } - return powerManager.isAmbientDisplaySuppressedForTokenByApp(AOD_SUPPRESSED_TOKEN, uid); - } } diff --git a/src/com/android/settings/security/LockscreenDashboardFragment.java b/src/com/android/settings/security/LockscreenDashboardFragment.java index 39355f381a9..33529916379 100644 --- a/src/com/android/settings/security/LockscreenDashboardFragment.java +++ b/src/com/android/settings/security/LockscreenDashboardFragment.java @@ -88,7 +88,9 @@ public class LockscreenDashboardFragment extends DashboardFragment @Override public void onAttach(Context context) { super.onAttach(context); - use(AmbientDisplayAlwaysOnPreferenceController.class).setConfig(getConfig(context)); + use(AmbientDisplayAlwaysOnPreferenceController.class) + .setConfig(getConfig(context)) + .setCallback(this::updatePreferenceStates); use(AmbientDisplayNotificationsPreferenceController.class).setConfig(getConfig(context)); use(DoubleTapScreenPreferenceController.class).setConfig(getConfig(context)); use(PickupGesturePreferenceController.class).setConfig(getConfig(context)); diff --git a/tests/robotests/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceControllerTest.java index 405ea12abb3..1548b422cd8 100644 --- a/tests/robotests/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceControllerTest.java @@ -19,20 +19,13 @@ package com.android.settings.display; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.ContentResolver; import android.content.Context; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; import android.hardware.display.AmbientDisplayConfiguration; -import android.os.PowerManager; import android.provider.Settings; -import com.android.internal.R; import com.android.settings.testutils.shadow.ShadowSecureSettings; import org.junit.Before; @@ -48,41 +41,24 @@ import org.robolectric.annotation.Config; @Config(shadows = ShadowSecureSettings.class) public class AmbientDisplayAlwaysOnPreferenceControllerTest { - private static final String TEST_PACKAGE = "com.android.test"; - @Mock private AmbientDisplayConfiguration mConfig; - @Mock - private PackageManager mPackageManager; - @Mock - private PowerManager mPowerManager; - @Mock - private ApplicationInfo mApplicationInfo; private Context mContext; private ContentResolver mContentResolver; private AmbientDisplayAlwaysOnPreferenceController mController; + private boolean mCallbackInvoked; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mContext = spy(RuntimeEnvironment.application); + mContext = RuntimeEnvironment.application; mContentResolver = mContext.getContentResolver(); mController = new AmbientDisplayAlwaysOnPreferenceController(mContext, "key"); mController.setConfig(mConfig); - - mApplicationInfo.uid = 1; - when(mContext.getString(R.string.config_defaultWellbeingPackage)).thenReturn(TEST_PACKAGE); - - when(mContext.getPackageManager()).thenReturn(mPackageManager); - doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo( - TEST_PACKAGE, /* flag= */0); - - doReturn(mPowerManager).when(mContext).getSystemService(PowerManager.class); - when(mPowerManager.isAmbientDisplaySuppressedForTokenByApp(anyString(), anyInt())) - .thenReturn(false); + mController.setCallback(() -> mCallbackInvoked = true); } @Test @@ -131,6 +107,13 @@ public class AmbientDisplayAlwaysOnPreferenceControllerTest { .isEqualTo(0); } + @Test + public void onPreferenceChange_callback() { + assertThat(mCallbackInvoked).isFalse(); + mController.setChecked(true); + assertThat(mCallbackInvoked).isTrue(); + } + @Test public void isSliceableCorrectKey_returnsTrue() { final AmbientDisplayAlwaysOnPreferenceController controller = @@ -150,39 +133,4 @@ public class AmbientDisplayAlwaysOnPreferenceControllerTest { public void isPublicSlice_returnTrue() { assertThat(mController.isPublicSlice()).isTrue(); } - - @Test - public void isAodSuppressedByBedtime_bedTimeModeOn_returnTrue() { - when(mPowerManager.isAmbientDisplaySuppressedForTokenByApp(anyString(), anyInt())) - .thenReturn(true); - - assertThat(AmbientDisplayAlwaysOnPreferenceController - .isAodSuppressedByBedtime(mContext)).isTrue(); - } - - @Test - public void isAodSuppressedByBedtime_bedTimeModeOff_returnFalse() { - assertThat(AmbientDisplayAlwaysOnPreferenceController - .isAodSuppressedByBedtime(mContext)).isFalse(); - } - - @Test - public void isAodSuppressedByBedtime_notFoundWellbeingPackage_returnFalse() - throws PackageManager.NameNotFoundException { - when(mPackageManager.getApplicationInfo(TEST_PACKAGE, /* flag= */0)).thenThrow( - new PackageManager.NameNotFoundException()); - - assertThat(AmbientDisplayAlwaysOnPreferenceController - .isAodSuppressedByBedtime(mContext)).isFalse(); - } - - @Test - public void getSummary_bedTimeModeOn_shouldReturnUnavailableSummary() { - when(mPowerManager.isAmbientDisplaySuppressedForTokenByApp(anyString(), anyInt())) - .thenReturn(true); - - final CharSequence summary = mController.getSummary(); - assertThat(summary).isEqualTo(mContext.getString( - com.android.settings.R.string.aware_summary_when_bedtime_on)); - } } diff --git a/tests/robotests/src/com/android/settings/security/LockscreenDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/security/LockscreenDashboardFragmentTest.java index 5c60001ee33..294d05e3133 100644 --- a/tests/robotests/src/com/android/settings/security/LockscreenDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/security/LockscreenDashboardFragmentTest.java @@ -88,6 +88,7 @@ public class LockscreenDashboardFragmentTest { mTestFragment.onAttach(mContext); verify(controller).setConfig(any()); + verify(controller).setCallback(any()); } @Test