diff --git a/src/com/android/settings/notification/BubbleNotificationPreferenceController.java b/src/com/android/settings/notification/BubbleNotificationPreferenceController.java index 0fa480cb64a..1c7b4dfd114 100644 --- a/src/com/android/settings/notification/BubbleNotificationPreferenceController.java +++ b/src/com/android/settings/notification/BubbleNotificationPreferenceController.java @@ -18,6 +18,7 @@ package com.android.settings.notification; import static android.provider.Settings.Global.NOTIFICATION_BUBBLES; +import android.app.ActivityManager; import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; @@ -81,7 +82,8 @@ public class BubbleNotificationPreferenceController extends TogglePreferenceCont @Override public int getAvailabilityStatus() { - return AVAILABLE; + ActivityManager am = mContext.getSystemService(ActivityManager.class); + return am.isLowRamDevice() ? UNSUPPORTED_ON_DEVICE : AVAILABLE; } @Override diff --git a/src/com/android/settings/notification/BubbleSummaryNotificationPreferenceController.java b/src/com/android/settings/notification/BubbleSummaryNotificationPreferenceController.java index f123c51fbdc..a99155fc019 100644 --- a/src/com/android/settings/notification/BubbleSummaryNotificationPreferenceController.java +++ b/src/com/android/settings/notification/BubbleSummaryNotificationPreferenceController.java @@ -18,6 +18,7 @@ package com.android.settings.notification; import static android.provider.Settings.Global.NOTIFICATION_BUBBLES; +import android.app.ActivityManager; import android.content.Context; import android.provider.Settings; @@ -48,7 +49,8 @@ public class BubbleSummaryNotificationPreferenceController extends BasePreferenc @Override public int getAvailabilityStatus() { - return AVAILABLE; + ActivityManager am = mContext.getSystemService(ActivityManager.class); + return am.isLowRamDevice() ? UNSUPPORTED_ON_DEVICE : AVAILABLE; } private boolean areBubblesEnabled() { diff --git a/src/com/android/settings/notification/app/BubblePreferenceController.java b/src/com/android/settings/notification/app/BubblePreferenceController.java index 722b27941ab..8f452f7e750 100644 --- a/src/com/android/settings/notification/app/BubblePreferenceController.java +++ b/src/com/android/settings/notification/app/BubblePreferenceController.java @@ -19,6 +19,7 @@ package com.android.settings.notification.app; import static android.app.NotificationManager.BUBBLE_PREFERENCE_NONE; import static android.provider.Settings.Global.NOTIFICATION_BUBBLES; +import android.app.ActivityManager; import android.annotation.Nullable; import android.content.Context; import android.provider.Settings; @@ -139,7 +140,8 @@ public class BubblePreferenceController extends NotificationPreferenceController } private boolean isGloballyEnabled() { - return Settings.Global.getInt(mContext.getContentResolver(), + ActivityManager am = mContext.getSystemService(ActivityManager.class); + return !am.isLowRamDevice() && Settings.Global.getInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_OFF) == SYSTEM_WIDE_ON; } diff --git a/src/com/android/settings/notification/app/BubbleSummaryPreferenceController.java b/src/com/android/settings/notification/app/BubbleSummaryPreferenceController.java index 7519c23c9fa..236e6283e90 100644 --- a/src/com/android/settings/notification/app/BubbleSummaryPreferenceController.java +++ b/src/com/android/settings/notification/app/BubbleSummaryPreferenceController.java @@ -20,6 +20,7 @@ import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL; import static android.app.NotificationManager.BUBBLE_PREFERENCE_NONE; import static android.provider.Settings.Global.NOTIFICATION_BUBBLES; +import android.app.ActivityManager; import android.content.Context; import android.content.Intent; import android.content.res.Resources; @@ -99,7 +100,8 @@ public class BubbleSummaryPreferenceController extends NotificationPreferenceCon } private boolean isGloballyEnabled() { - return Settings.Global.getInt(mContext.getContentResolver(), + ActivityManager am = mContext.getSystemService(ActivityManager.class); + return !am.isLowRamDevice() && Settings.Global.getInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, ON) == ON; } } diff --git a/tests/robotests/src/com/android/settings/notification/BubbleNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/BubbleNotificationPreferenceControllerTest.java index b2cf55b97b2..871de0f0107 100644 --- a/tests/robotests/src/com/android/settings/notification/BubbleNotificationPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/BubbleNotificationPreferenceControllerTest.java @@ -19,6 +19,7 @@ package com.android.settings.notification; import static android.provider.Settings.Global.NOTIFICATION_BUBBLES; import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; import static com.android.settings.notification.BadgingNotificationPreferenceController.OFF; import static com.android.settings.notification.BadgingNotificationPreferenceController.ON; @@ -29,6 +30,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.ActivityManager; import android.content.Context; import android.provider.Settings; @@ -44,6 +46,8 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.shadow.api.Shadow; +import org.robolectric.shadows.ShadowActivityManager; @RunWith(RobolectricTestRunner.class) public class BubbleNotificationPreferenceControllerTest { @@ -69,7 +73,18 @@ public class BubbleNotificationPreferenceControllerTest { } @Test - public void getAvilabilityStatus_returnsAvailable() { + public void isAvailable_lowRam_returnsUnsupported() { + final ShadowActivityManager activityManager = + Shadow.extract(mContext.getSystemService(ActivityManager.class)); + activityManager.setIsLowRamDevice(true); + assertEquals(UNSUPPORTED_ON_DEVICE, mController.getAvailabilityStatus()); + } + + @Test + public void isAvailable_notLowRam_returnsAvailable() { + final ShadowActivityManager activityManager = + Shadow.extract(mContext.getSystemService(ActivityManager.class)); + activityManager.setIsLowRamDevice(false); assertEquals(AVAILABLE, mController.getAvailabilityStatus()); } diff --git a/tests/robotests/src/com/android/settings/notification/BubbleSummaryNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/BubbleSummaryNotificationPreferenceControllerTest.java index b5f505b6e82..88de7ac4605 100644 --- a/tests/robotests/src/com/android/settings/notification/BubbleSummaryNotificationPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/BubbleSummaryNotificationPreferenceControllerTest.java @@ -18,11 +18,14 @@ package com.android.settings.notification; import static android.provider.Settings.Global.NOTIFICATION_BUBBLES; +import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; import static com.android.settings.notification.BadgingNotificationPreferenceController.OFF; import static com.android.settings.notification.BadgingNotificationPreferenceController.ON; import static com.google.common.truth.Truth.assertThat; +import android.app.ActivityManager; import android.content.Context; import android.provider.Settings; @@ -35,6 +38,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.shadow.api.Shadow; +import org.robolectric.shadows.ShadowActivityManager; @RunWith(RobolectricTestRunner.class) public class BubbleSummaryNotificationPreferenceControllerTest { @@ -68,4 +73,20 @@ public class BubbleSummaryNotificationPreferenceControllerTest { String onString = mContext.getString(R.string.notifications_bubble_setting_on_summary); assertThat(mController.getSummary()).isEqualTo(onString); } + + @Test + public void isAvailable_lowRam_returnsUnsupported() { + final ShadowActivityManager activityManager = + Shadow.extract(mContext.getSystemService(ActivityManager.class)); + activityManager.setIsLowRamDevice(true); + assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE); + } + + @Test + public void isAvailable_notLowRam_returnsAvailable() { + final ShadowActivityManager activityManager = + Shadow.extract(mContext.getSystemService(ActivityManager.class)); + activityManager.setIsLowRamDevice(false); + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); + } } diff --git a/tests/robotests/src/com/android/settings/notification/app/BubblePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/app/BubblePreferenceControllerTest.java index afb3d1b0e7f..ea963e3db1c 100644 --- a/tests/robotests/src/com/android/settings/notification/app/BubblePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/app/BubblePreferenceControllerTest.java @@ -42,6 +42,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.ActivityManager; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Context; @@ -67,7 +68,9 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowApplication; +import org.robolectric.shadows.ShadowActivityManager; import java.util.ArrayList; import java.util.List; @@ -158,6 +161,18 @@ public class BubblePreferenceControllerTest { assertFalse(mController.isAvailable()); } + @Test + public void isNotAvailable_ifLowRam() { + NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); + mController.onResume(appRow, null, null, null, null, null); + + final ShadowActivityManager activityManager = + Shadow.extract(mContext.getSystemService(ActivityManager.class)); + activityManager.setIsLowRamDevice(true); + assertFalse(mController.isAvailable()); + } + + @Test public void isAvailable_notIfOffGlobally_channel() { NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); @@ -170,6 +185,18 @@ public class BubblePreferenceControllerTest { assertFalse(mController.isAvailable()); } + @Test + public void isAvailable_ifNotLowRam() { + NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); + mController.onResume(appRow, null, null, null, null, null); + Settings.Global.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON); + + final ShadowActivityManager activityManager = + Shadow.extract(mContext.getSystemService(ActivityManager.class)); + activityManager.setIsLowRamDevice(false); + assertTrue(mController.isAvailable()); + } + @Test public void isAvailable_app_evenIfOffGlobally() { NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); diff --git a/tests/robotests/src/com/android/settings/notification/app/BubbleSummaryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/app/BubbleSummaryPreferenceControllerTest.java index af7b1085cb4..f851c968657 100644 --- a/tests/robotests/src/com/android/settings/notification/app/BubbleSummaryPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/app/BubbleSummaryPreferenceControllerTest.java @@ -23,6 +23,8 @@ import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED; import static android.app.NotificationManager.IMPORTANCE_HIGH; import static android.provider.Settings.Global.NOTIFICATION_BUBBLES; +import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; import static com.android.settings.notification.app.BubblePreferenceController.SYSTEM_WIDE_OFF; import static com.android.settings.notification.app.BubblePreferenceController.SYSTEM_WIDE_ON; @@ -37,6 +39,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; +import android.app.ActivityManager; import android.app.NotificationChannel; import android.content.Context; import android.provider.Settings; @@ -53,6 +56,8 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.shadow.api.Shadow; +import org.robolectric.shadows.ShadowActivityManager; import org.robolectric.shadows.ShadowApplication; @RunWith(RobolectricTestRunner.class) @@ -139,6 +144,28 @@ public class BubbleSummaryPreferenceControllerTest { assertTrue(mController.isAvailable()); } + @Test + public void isAvailable_lowRam_shouldReturnFalse() { + Settings.Global.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON); + mController.onResume(mAppRow, null, null, null, null, null); + + final ShadowActivityManager activityManager = + Shadow.extract(mContext.getSystemService(ActivityManager.class)); + activityManager.setIsLowRamDevice(true); + assertFalse(mController.isAvailable()); + } + + @Test + public void isAvailable_notLowRam_shouldReturnTrue() { + Settings.Global.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON); + mController.onResume(mAppRow, null, null, null, null, null); + + final ShadowActivityManager activityManager = + Shadow.extract(mContext.getSystemService(ActivityManager.class)); + activityManager.setIsLowRamDevice(false); + assertTrue(mController.isAvailable()); + } + @Test public void updateState_setsIntent() { mAppRow.bubblePreference = BUBBLE_PREFERENCE_ALL;