Move feature-level Bubble setting into developer options; default to off

Functionality:
* Moves feature-level setting into developer settings (apps section)
* Adds bubbles in developer options under "apps" section
* Configures the app-specific bubble toggle in notifications settings
  to be hidden / shown based on the developer setting
* Configures the channel-specific bubble toggle in notification channel
  settings to be hidden / shown based on the developer setting

Tests:
* Anything that might be assuming that it's globally enabled now has
  a bit to enable it globally in that test
* There is a logic change now where the app-level setting would be available
  even if off globally, now that is not true -- if it's off globally the
  app-level is no longer available
* Adds tests for the developer setting

Test: make -j40 RunSettingsRoboTests ROBOTEST_FILTER="Bubble"
Bug: 131845765
Change-Id: I5f6bf74e5ada3fc023571825cca10d7bddc60e6e
This commit is contained in:
Mady Mellor
2019-05-06 16:54:07 -07:00
parent d204d6c33f
commit 32fa736dd6
18 changed files with 268 additions and 544 deletions

Binary file not shown.

View File

@@ -7891,8 +7891,8 @@
<!-- Configure Notifications: Title for the notification bubbles option. [CHAR LIMIT=60] --> <!-- Configure Notifications: Title for the notification bubbles option. [CHAR LIMIT=60] -->
<string name="notification_bubbles_title">Bubbles</string> <string name="notification_bubbles_title">Bubbles</string>
<!-- Configure Notifications: Summary for the notification bubbles option. [CHAR LIMIT=NONE] --> <!-- Developer setting summary for bubbles [CHAR LIMIT=NONE] -->
<string name="notification_bubbles_summary">Quickly access app content from anywhere using floating shortcuts</string> <string name="notification_bubbles_developer_setting_summary">Some notifications can appear as bubbles on the screen</string>
<!-- Feature education for bubbles. [CHAR LIMIT=NONE] --> <!-- Feature education for bubbles. [CHAR LIMIT=NONE] -->
<string name="bubbles_feature_education">Some notifications and other content can appear as bubbles on the screen. To open a bubble, tap it. To dismiss it, drag it down the screen.</string> <string name="bubbles_feature_education">Some notifications and other content can appear as bubbles on the screen. To open a bubble, tap it. To dismiss it, drag it down the screen.</string>
<!-- Title for the toggle shown on the app-level bubbles page [CHAR LIMIT=60] --> <!-- Title for the toggle shown on the app-level bubbles page [CHAR LIMIT=60] -->

View File

@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="@string/bubbles_app_toggle_title"
android:key="bubble_notification_settings">
<com.android.settings.widget.VideoPreference
android:key="bubbles_illustration"
android:title="@string/summary_placeholder"
settings:animation="@raw/bubbles"
settings:controller="com.android.settings.widget.VideoPreferenceController"
android:persistent="false" />
<!-- Notification bubbles -->
<SwitchPreference
android:key="global_notification_bubbles"
android:title="@string/notification_bubbles_title"
android:summary="@string/notification_bubbles_summary"
settings:controller="com.android.settings.notification.BubbleNotificationPreferenceController"/>
<com.android.settingslib.widget.FooterPreference
android:key="notification_bubbles_footer"
android:title="@string/bubbles_feature_education"
android:selectable="false" />
</PreferenceScreen>

View File

@@ -74,13 +74,6 @@
android:title="@string/notification_badging_title" android:title="@string/notification_badging_title"
settings:controller="com.android.settings.notification.BadgingNotificationPreferenceController"/> settings:controller="com.android.settings.notification.BadgingNotificationPreferenceController"/>
<!-- Notification bubbles -->
<Preference
android:key="notification_bubbles"
android:title="@string/notification_bubbles_title"
settings:controller="com.android.settings.notification.BubbleSummaryNotificationPreferenceController"
android:fragment="com.android.settings.notification.BubbleNotificationSettings"/>
<!-- Pulse notification light --> <!-- Pulse notification light -->
<SwitchPreference <SwitchPreference
android:key="notification_pulse" android:key="notification_pulse"

View File

@@ -560,6 +560,12 @@
android:key="device_identifier_access_restrictions" android:key="device_identifier_access_restrictions"
android:title="@string/device_identifier_access_restrictions_title" android:title="@string/device_identifier_access_restrictions_title"
android:summary="@string/device_identifier_access_restrictions_summary" /> android:summary="@string/device_identifier_access_restrictions_summary" />
<SwitchPreference
android:key="notification_bubbles"
android:title="@string/notification_bubbles_title"
android:summary="@string/notification_bubbles_developer_setting_summary"/>
</PreferenceCategory> </PreferenceCategory>
<com.android.settings.development.autofill.AutofillPreferenceCategory <com.android.settings.development.autofill.AutofillPreferenceCategory

View File

@@ -104,7 +104,6 @@ import com.android.settings.nfc.AndroidBeam;
import com.android.settings.nfc.PaymentSettings; import com.android.settings.nfc.PaymentSettings;
import com.android.settings.notification.AppBubbleNotificationSettings; import com.android.settings.notification.AppBubbleNotificationSettings;
import com.android.settings.notification.AppNotificationSettings; import com.android.settings.notification.AppNotificationSettings;
import com.android.settings.notification.BubbleNotificationSettings;
import com.android.settings.notification.ChannelGroupNotificationSettings; import com.android.settings.notification.ChannelGroupNotificationSettings;
import com.android.settings.notification.ChannelNotificationSettings; import com.android.settings.notification.ChannelNotificationSettings;
import com.android.settings.notification.ConfigureNotificationSettings; import com.android.settings.notification.ConfigureNotificationSettings;
@@ -216,7 +215,6 @@ public class SettingsGateway {
DreamSettings.class.getName(), DreamSettings.class.getName(),
UserSettings.class.getName(), UserSettings.class.getName(),
NotificationAccessSettings.class.getName(), NotificationAccessSettings.class.getName(),
BubbleNotificationSettings.class.getName(),
AppBubbleNotificationSettings.class.getName(), AppBubbleNotificationSettings.class.getName(),
ZenAccessSettings.class.getName(), ZenAccessSettings.class.getName(),
ZenAccessDetails.class.getName(), ZenAccessDetails.class.getName(),

View File

@@ -0,0 +1,75 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.development;
import static android.provider.Settings.Secure.NOTIFICATION_BUBBLES;
import android.content.Context;
import android.provider.Settings;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.development.DeveloperOptionsPreferenceController;
public class BubbleGlobalPreferenceController extends DeveloperOptionsPreferenceController
implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
@VisibleForTesting
static final int ON = 1;
@VisibleForTesting
static final int OFF = 0;
public BubbleGlobalPreferenceController(Context context) {
super(context);
}
@Override
public String getPreferenceKey() {
return NOTIFICATION_BUBBLES;
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
writeSetting((boolean) newValue);
return true;
}
@Override
public void updateState(Preference preference) {
((SwitchPreference) mPreference).setChecked(isEnabled());
}
@Override
protected void onDeveloperOptionsSwitchDisabled() {
super.onDeveloperOptionsSwitchDisabled();
writeSetting(false /* isEnabled */);
updateState(mPreference);
}
private boolean isEnabled() {
return Settings.Secure.getInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, OFF) == ON;
}
private void writeSetting(boolean isEnabled) {
Settings.Secure.putInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, isEnabled ? ON : OFF);
}
}

View File

@@ -482,6 +482,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
controllers.add(new DesktopModePreferenceController(context)); controllers.add(new DesktopModePreferenceController(context));
controllers.add(new DeviceIdentifierAccessRestrictionsPreferenceController(context)); controllers.add(new DeviceIdentifierAccessRestrictionsPreferenceController(context));
controllers.add(new ShortcutManagerThrottlingPreferenceController(context)); controllers.add(new ShortcutManagerThrottlingPreferenceController(context));
controllers.add(new BubbleGlobalPreferenceController(context));
controllers.add(new EnableGnssRawMeasFullTrackingPreferenceController(context)); controllers.add(new EnableGnssRawMeasFullTrackingPreferenceController(context));
controllers.add(new DefaultLaunchPreferenceController(context, "running_apps")); controllers.add(new DefaultLaunchPreferenceController(context, "running_apps"));
controllers.add(new DefaultLaunchPreferenceController(context, "demo_mode")); controllers.add(new DefaultLaunchPreferenceController(context, "demo_mode"));

View File

@@ -1,124 +0,0 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.notification;
import static android.provider.Settings.Secure.NOTIFICATION_BUBBLES;
import static android.provider.Settings.Secure.NOTIFICATION_BUBBLES;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.provider.Settings;
import android.text.TextUtils;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
public class BubbleNotificationPreferenceController extends TogglePreferenceController
implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener,
LifecycleObserver, OnResume, OnPause {
private static final String TAG = "BubbleNotifPrefContr";
@VisibleForTesting
static final int ON = 1;
@VisibleForTesting
static final int OFF = 0;
private SettingObserver mSettingObserver;
public BubbleNotificationPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
Preference preference = screen.findPreference(getPreferenceKey());
if (preference != null) {
mSettingObserver = new SettingObserver(preference);
}
}
@Override
public void onResume() {
if (mSettingObserver != null) {
mSettingObserver.register(mContext.getContentResolver(), true /* register */);
}
}
@Override
public void onPause() {
if (mSettingObserver != null) {
mSettingObserver.register(mContext.getContentResolver(), false /* register */);
}
}
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
}
@Override
public boolean isChecked() {
return Settings.Secure.getInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, ON) == ON;
}
@Override
public boolean setChecked(boolean isChecked) {
return Settings.Secure.putInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, isChecked ? ON : OFF);
}
class SettingObserver extends ContentObserver {
private final Uri NOTIFICATION_BUBBLES_URI =
Settings.Secure.getUriFor(NOTIFICATION_BUBBLES);
private final Preference mPreference;
public SettingObserver(Preference preference) {
super(new Handler());
mPreference = preference;
}
public void register(ContentResolver cr, boolean register) {
if (register) {
cr.registerContentObserver(NOTIFICATION_BUBBLES_URI, false, this);
} else {
cr.unregisterContentObserver(this);
}
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
if (NOTIFICATION_BUBBLES_URI.equals(uri)) {
updateState(mPreference);
}
}
}
}

View File

@@ -1,65 +0,0 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.notification;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.provider.SearchIndexableResource;
import com.android.settings.R;
import com.android.settings.core.OnActivityResultListener;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
import java.util.Arrays;
import java.util.List;
@SearchIndexable
public class BubbleNotificationSettings extends DashboardFragment implements
OnActivityResultListener {
private static final String TAG = "BubbleNotiSettings";
@Override
public int getMetricsCategory() {
return SettingsEnums.BUBBLE_SETTINGS;
}
@Override
protected String getLogTag() {
return TAG;
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.bubble_notification_settings;
}
/**
* For Search.
*/
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@Override
public List<SearchIndexableResource> getXmlResourcesToIndex(
Context context, boolean enabled) {
final SearchIndexableResource sir = new SearchIndexableResource(context);
sir.xmlResId = R.xml.bubble_notification_settings;
return Arrays.asList(sir);
}
};
}

View File

@@ -25,6 +25,7 @@ import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.RestrictedSwitchPreference; import com.android.settingslib.RestrictedSwitchPreference;
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference; import androidx.preference.Preference;
@@ -33,8 +34,10 @@ public class BubblePreferenceController extends NotificationPreferenceController
private static final String TAG = "BubblePrefContr"; private static final String TAG = "BubblePrefContr";
private static final String KEY = "bubble_pref"; private static final String KEY = "bubble_pref";
private static final int SYSTEM_WIDE_ON = 1; @VisibleForTesting
private static final int SYSTEM_WIDE_OFF = 0; static final int SYSTEM_WIDE_ON = 1;
@VisibleForTesting
static final int SYSTEM_WIDE_OFF = 0;
private FragmentManager mFragmentManager; private FragmentManager mFragmentManager;
@@ -58,18 +61,14 @@ public class BubblePreferenceController extends NotificationPreferenceController
if (!super.isAvailable()) { if (!super.isAvailable()) {
return false; return false;
} }
if (mAppRow == null && mChannel == null) { if (!isGloballyEnabled()) {
return false; return false;
} }
if (mChannel != null) { if (mChannel != null) {
if (Settings.Secure.getInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON) == SYSTEM_WIDE_OFF) {
return false;
}
if (isDefaultChannel()) { if (isDefaultChannel()) {
return true; return true;
} else { } else {
return mAppRow == null ? false : mAppRow.allowBubbles; return mAppRow != null && mAppRow.allowBubbles;
} }
} }
return true; return true;
@@ -80,12 +79,10 @@ public class BubblePreferenceController extends NotificationPreferenceController
RestrictedSwitchPreference pref = (RestrictedSwitchPreference) preference; RestrictedSwitchPreference pref = (RestrictedSwitchPreference) preference;
pref.setDisabledByAdmin(mAdmin); pref.setDisabledByAdmin(mAdmin);
if (mChannel != null) { if (mChannel != null) {
pref.setChecked(mChannel.canBubble()); pref.setChecked(mChannel.canBubble() && isGloballyEnabled());
pref.setEnabled(!pref.isDisabledByAdmin()); pref.setEnabled(!pref.isDisabledByAdmin());
} else { } else {
pref.setChecked(mAppRow.allowBubbles pref.setChecked(mAppRow.allowBubbles && isGloballyEnabled());
&& Settings.Secure.getInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON) == SYSTEM_WIDE_ON);
pref.setSummary(mContext.getString( pref.setSummary(mContext.getString(
R.string.bubbles_app_toggle_summary, mAppRow.label)); R.string.bubbles_app_toggle_summary, mAppRow.label));
} }
@@ -94,7 +91,7 @@ public class BubblePreferenceController extends NotificationPreferenceController
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
final boolean value = (Boolean) newValue; final boolean value = (Boolean) newValue && isGloballyEnabled();
if (mChannel != null) { if (mChannel != null) {
mChannel.setAllowBubbles(value); mChannel.setAllowBubbles(value);
saveChannel(); saveChannel();
@@ -103,9 +100,7 @@ public class BubblePreferenceController extends NotificationPreferenceController
RestrictedSwitchPreference pref = (RestrictedSwitchPreference) preference; RestrictedSwitchPreference pref = (RestrictedSwitchPreference) preference;
// if the global setting is off, toggling app level permission requires extra // if the global setting is off, toggling app level permission requires extra
// confirmation // confirmation
if (Settings.Secure.getInt(mContext.getContentResolver(), if (!isGloballyEnabled() && !pref.isChecked()) {
NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON) == SYSTEM_WIDE_OFF
&& !pref.isChecked()) {
new BubbleWarningDialogFragment() new BubbleWarningDialogFragment()
.setPkgInfo(mAppRow.pkg, mAppRow.uid) .setPkgInfo(mAppRow.pkg, mAppRow.uid)
.show(mFragmentManager, "dialog"); .show(mFragmentManager, "dialog");
@@ -118,6 +113,11 @@ public class BubblePreferenceController extends NotificationPreferenceController
return true; return true;
} }
private boolean isGloballyEnabled() {
return Settings.Secure.getInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, SYSTEM_WIDE_OFF) == SYSTEM_WIDE_ON;
}
// Used in app level prompt that confirms the user is ok with turning on bubbles // Used in app level prompt that confirms the user is ok with turning on bubbles
// globally. If they aren't, undo what // globally. If they aren't, undo what
public static void revertBubblesApproval(Context mContext, String pkg, int uid) { public static void revertBubblesApproval(Context mContext, String pkg, int uid) {

View File

@@ -1,53 +0,0 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.notification;
import static android.provider.Settings.Secure.NOTIFICATION_BUBBLES;
import android.content.Context;
import android.provider.Settings;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import androidx.annotation.VisibleForTesting;
public class BubbleSummaryNotificationPreferenceController extends BasePreferenceController {
@VisibleForTesting
static final int ON = 1;
public BubbleSummaryNotificationPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
}
@Override
public CharSequence getSummary() {
return mContext.getString(
areBubblesEnabled() ? R.string.switch_on_text : R.string.switch_off_text);
}
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
}
private boolean areBubblesEnabled() {
return Settings.Secure.getInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, ON) == ON;
}
}

View File

@@ -27,13 +27,16 @@ import com.android.settings.R;
import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.AppInfoBase;
import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.SubSettingLauncher;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference; import androidx.preference.Preference;
public class BubbleSummaryPreferenceController extends NotificationPreferenceController { public class BubbleSummaryPreferenceController extends NotificationPreferenceController {
private static final String KEY = "bubble_link_pref"; private static final String KEY = "bubble_link_pref";
private static final int SYSTEM_WIDE_ON = 1; @VisibleForTesting
private static final int SYSTEM_WIDE_OFF = 0; static final int SYSTEM_WIDE_ON = 1;
@VisibleForTesting
static final int SYSTEM_WIDE_OFF = 0;
public BubbleSummaryPreferenceController(Context context, NotificationBackend backend) { public BubbleSummaryPreferenceController(Context context, NotificationBackend backend) {
super(context, backend); super(context, backend);
@@ -53,17 +56,16 @@ public class BubbleSummaryPreferenceController extends NotificationPreferenceCon
return false; return false;
} }
if (mChannel != null) { if (mChannel != null) {
if (Settings.Secure.getInt(mContext.getContentResolver(), if (!isGloballyEnabled()) {
NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON) == SYSTEM_WIDE_OFF) {
return false; return false;
} }
if (isDefaultChannel()) { if (isDefaultChannel()) {
return true; return true;
} else { } else {
return mAppRow == null ? false : mAppRow.allowBubbles; return mAppRow != null && mAppRow.allowBubbles;
} }
} }
return true; return isGloballyEnabled();
} }
@Override @Override
@@ -89,13 +91,16 @@ public class BubbleSummaryPreferenceController extends NotificationPreferenceCon
boolean canBubble = false; boolean canBubble = false;
if (mAppRow != null) { if (mAppRow != null) {
if (mChannel != null) { if (mChannel != null) {
canBubble |= mChannel.canBubble(); canBubble |= mChannel.canBubble() && isGloballyEnabled();
} else { } else {
canBubble |= mAppRow.allowBubbles canBubble |= mAppRow.allowBubbles && isGloballyEnabled();
&& (Settings.Secure.getInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON) == SYSTEM_WIDE_ON);
} }
} }
return mContext.getString(canBubble ? R.string.switch_on_text : R.string.switch_off_text); return mContext.getString(canBubble ? R.string.switch_on_text : R.string.switch_off_text);
} }
private boolean isGloballyEnabled() {
return Settings.Secure.getInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, SYSTEM_WIDE_OFF) == SYSTEM_WIDE_ON;
}
} }

View File

@@ -0,0 +1,111 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.development;
import static android.provider.Settings.Secure.NOTIFICATION_BUBBLES;
import static com.android.settings.development.BubbleGlobalPreferenceController.OFF;
import static com.android.settings.development.BubbleGlobalPreferenceController.ON;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.provider.Settings;
import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
@RunWith(RobolectricTestRunner.class)
public class BubbleGlobalPreferenceControllerTest {
private Context mContext;
@Mock
private SwitchPreference mPreference;
@Mock
private PreferenceScreen mPreferenceScreen;
private BubbleGlobalPreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mController = new BubbleGlobalPreferenceController(mContext);
when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
.thenReturn(mPreference);
mController.displayPreference(mPreferenceScreen);
}
@Test
public void onPreferenceChange_settingEnabled_allowBubbles_shouldBeOn() {
mController.onPreferenceChange(mPreference, true /* new value */);
assertThat(isSettingEnabled()).isTrue();
}
@Test
public void onPreferenceChange_settingDisabled_allowBubbles_shouldBeOff() {
mController.onPreferenceChange(mPreference, false /* new value */);
assertThat(isSettingEnabled()).isFalse();
}
@Test
public void updateState_settingEnabled_preferenceShouldBeChecked() {
Settings.Secure.putInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, 1 /* enabled */);
mController.updateState(mPreference);
verify(mPreference).setChecked(true);
}
@Test
public void updateState_settingReset_defaultDisabled_preferenceShouldNotBeChecked() {
Settings.Secure.putInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, 0 /* enabled */);
mController.updateState(mPreference);
verify(mPreference).setChecked(false);
}
@Test
public void onDeveloperOptionsSwitchDisabled_shouldDisable() {
mController.onDeveloperOptionsSwitchDisabled();
verify(mPreference).setChecked(false);
verify(mPreference).setEnabled(false);
assertThat(isSettingEnabled()).isFalse();
}
private boolean isSettingEnabled() {
return Settings.Secure.getInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES,
OFF /* default off */) == ON;
}
}

View File

@@ -1,136 +0,0 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.notification;
import static android.provider.Settings.Secure.NOTIFICATION_BUBBLES;
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 static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.provider.Settings;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.preference.TwoStatePreference;
@RunWith(RobolectricTestRunner.class)
public class BubbleNotificationPreferenceControllerTest {
private Context mContext;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private PreferenceScreen mScreen;
private BubbleNotificationPreferenceController mController;
private Preference mPreference;
private static final String KEY_NOTIFICATION_BUBBLES = "notification_bubbles";
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mController = new BubbleNotificationPreferenceController(mContext,
KEY_NOTIFICATION_BUBBLES);
mPreference = new Preference(RuntimeEnvironment.application);
mPreference.setKey(mController.getPreferenceKey());
when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);
}
@Test
public void display_shouldDisplay() {
assertThat(mPreference.isVisible()).isTrue();
}
@Test
public void updateState_preferenceSetCheckedWhenSettingIsOn() {
final TwoStatePreference preference = mock(TwoStatePreference.class);
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, ON);
mController.updateState(preference);
verify(preference).setChecked(true);
}
@Test
public void updateState_preferenceSetUncheckedWhenSettingIsOff() {
final TwoStatePreference preference = mock(TwoStatePreference.class);
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, OFF);
assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, ON)).isEqualTo(OFF);
mController.updateState(preference);
verify(preference).setChecked(false);
}
@Test
public void isChecked_settingIsOff_shouldReturnFalse() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, OFF);
assertThat(mController.isChecked()).isFalse();
}
@Test
public void isChecked_settingIsOn_shouldReturnTrue() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, ON);
assertThat(mController.isChecked()).isTrue();
}
@Test
public void setChecked_setFalse_disablesSetting() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, ON);
mController.setChecked(false);
int updatedValue = Settings.Secure.getInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, -1);
assertThat(updatedValue).isEqualTo(OFF);
}
@Test
public void setChecked_setTrue_enablesSetting() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, OFF);
mController.setChecked(true);
int updatedValue = Settings.Secure.getInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, -1);
assertThat(updatedValue).isEqualTo(ON);
}
@Test
public void isSliceable_returnsFalse() {
assertThat(mController.isSliceable()).isFalse();
}
}

View File

@@ -22,6 +22,9 @@ import static android.app.NotificationManager.IMPORTANCE_LOW;
import static android.app.NotificationManager.IMPORTANCE_NONE; import static android.app.NotificationManager.IMPORTANCE_NONE;
import static android.provider.Settings.Secure.NOTIFICATION_BUBBLES; import static android.provider.Settings.Secure.NOTIFICATION_BUBBLES;
import static com.android.settings.notification.BubblePreferenceController.SYSTEM_WIDE_OFF;
import static com.android.settings.notification.BubblePreferenceController.SYSTEM_WIDE_ON;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
@@ -96,6 +99,7 @@ public class BubblePreferenceControllerTest {
@Test @Test
public void testIsAvailable_notIfAppBlocked() { public void testIsAvailable_notIfAppBlocked() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
appRow.banned = true; appRow.banned = true;
mController.onResume(appRow, mock(NotificationChannel.class), null, null); mController.onResume(appRow, mock(NotificationChannel.class), null, null);
@@ -104,6 +108,7 @@ public class BubblePreferenceControllerTest {
@Test @Test
public void testIsAvailable_notIfChannelBlocked() { public void testIsAvailable_notIfChannelBlocked() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
NotificationChannel channel = mock(NotificationChannel.class); NotificationChannel channel = mock(NotificationChannel.class);
when(channel.getImportance()).thenReturn(IMPORTANCE_NONE); when(channel.getImportance()).thenReturn(IMPORTANCE_NONE);
@@ -113,6 +118,7 @@ public class BubblePreferenceControllerTest {
@Test @Test
public void testIsAvailable_channel_notIfAppOff() { public void testIsAvailable_channel_notIfAppOff() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
appRow.allowBubbles = false; appRow.allowBubbles = false;
NotificationChannel channel = mock(NotificationChannel.class); NotificationChannel channel = mock(NotificationChannel.class);
@@ -123,12 +129,13 @@ public class BubblePreferenceControllerTest {
} }
@Test @Test
public void testIsAvailable_ifOffGlobally_app() { public void testIsNotAvailable_ifOffGlobally_app() {
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
mController.onResume(appRow, null, null, null); mController.onResume(appRow, null, null, null);
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 0); Settings.Secure.putInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, SYSTEM_WIDE_OFF);
assertTrue(mController.isAvailable()); assertFalse(mController.isAvailable());
} }
@Test @Test
@@ -137,7 +144,8 @@ public class BubblePreferenceControllerTest {
NotificationChannel channel = mock(NotificationChannel.class); NotificationChannel channel = mock(NotificationChannel.class);
when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH); when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
mController.onResume(appRow, channel, null, null); mController.onResume(appRow, channel, null, null);
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 0); Settings.Secure.putInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, SYSTEM_WIDE_OFF);
assertFalse(mController.isAvailable()); assertFalse(mController.isAvailable());
} }
@@ -146,7 +154,7 @@ public class BubblePreferenceControllerTest {
public void testIsAvailable_app() { public void testIsAvailable_app() {
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
mController.onResume(appRow, null, null, null); mController.onResume(appRow, null, null, null);
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 1); Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
assertTrue(mController.isAvailable()); assertTrue(mController.isAvailable());
} }
@@ -159,7 +167,7 @@ public class BubblePreferenceControllerTest {
when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH); when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
when(channel.getId()).thenReturn(DEFAULT_CHANNEL_ID); when(channel.getId()).thenReturn(DEFAULT_CHANNEL_ID);
mController.onResume(appRow, channel, null, null); mController.onResume(appRow, channel, null, null);
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 1); Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
assertTrue(mController.isAvailable()); assertTrue(mController.isAvailable());
} }
@@ -171,7 +179,7 @@ public class BubblePreferenceControllerTest {
NotificationChannel channel = mock(NotificationChannel.class); NotificationChannel channel = mock(NotificationChannel.class);
when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH); when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
mController.onResume(appRow, channel, null, null); mController.onResume(appRow, channel, null, null);
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 1); Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
assertTrue(mController.isAvailable()); assertTrue(mController.isAvailable());
} }
@@ -183,7 +191,7 @@ public class BubblePreferenceControllerTest {
NotificationChannel channel = mock(NotificationChannel.class); NotificationChannel channel = mock(NotificationChannel.class);
when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH); when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
mController.onResume(appRow, channel, null, null); mController.onResume(appRow, channel, null, null);
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 1); Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
assertFalse(mController.isAvailable()); assertFalse(mController.isAvailable());
} }
@@ -203,6 +211,7 @@ public class BubblePreferenceControllerTest {
@Test @Test
public void testUpdateState_channelNotBlockable() { public void testUpdateState_channelNotBlockable() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
NotificationChannel channel = mock(NotificationChannel.class); NotificationChannel channel = mock(NotificationChannel.class);
when(channel.isImportanceLockedByCriticalDeviceFunction()).thenReturn(true); when(channel.isImportanceLockedByCriticalDeviceFunction()).thenReturn(true);
@@ -216,6 +225,7 @@ public class BubblePreferenceControllerTest {
@Test @Test
public void testUpdateState_channel() { public void testUpdateState_channel() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
NotificationChannel channel = mock(NotificationChannel.class); NotificationChannel channel = mock(NotificationChannel.class);
when(channel.canBubble()).thenReturn(true); when(channel.canBubble()).thenReturn(true);
@@ -235,6 +245,7 @@ public class BubblePreferenceControllerTest {
@Test @Test
public void testUpdateState_app() { public void testUpdateState_app() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
appRow.label = "App!"; appRow.label = "App!";
appRow.allowBubbles = true; appRow.allowBubbles = true;
@@ -256,7 +267,8 @@ public class BubblePreferenceControllerTest {
@Test @Test
public void testUpdateState_app_offGlobally() { public void testUpdateState_app_offGlobally() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 0); Settings.Secure.putInt(mContext.getContentResolver(),
NOTIFICATION_BUBBLES, SYSTEM_WIDE_OFF);
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
appRow.label = "App!"; appRow.label = "App!";
appRow.allowBubbles = true; appRow.allowBubbles = true;
@@ -269,6 +281,7 @@ public class BubblePreferenceControllerTest {
@Test @Test
public void testOnPreferenceChange_on_channel() { public void testOnPreferenceChange_on_channel() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
appRow.allowBubbles = true; appRow.allowBubbles = true;
NotificationChannel channel = NotificationChannel channel =
@@ -288,6 +301,7 @@ public class BubblePreferenceControllerTest {
@Test @Test
public void testOnPreferenceChange_off_channel() { public void testOnPreferenceChange_off_channel() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
appRow.allowBubbles = true; appRow.allowBubbles = true;
NotificationChannel channel = NotificationChannel channel =
@@ -307,6 +321,7 @@ public class BubblePreferenceControllerTest {
@Test @Test
public void testOnPreferenceChange_on_app() { public void testOnPreferenceChange_on_app() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
appRow.allowBubbles = false; appRow.allowBubbles = false;
mController.onResume(appRow, null, null, null); mController.onResume(appRow, null, null, null);
@@ -324,6 +339,7 @@ public class BubblePreferenceControllerTest {
@Test @Test
public void testOnPreferenceChange_off_app() { public void testOnPreferenceChange_off_app() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
appRow.allowBubbles = true; appRow.allowBubbles = true;
mController.onResume(appRow, null, null, null); mController.onResume(appRow, null, null, null);
@@ -341,7 +357,8 @@ public class BubblePreferenceControllerTest {
@Test @Test
public void testOnPreferenceChange_on_app_offGlobally() { public void testOnPreferenceChange_on_app_offGlobally() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 0); Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES,
SYSTEM_WIDE_OFF);
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
appRow.allowBubbles = false; appRow.allowBubbles = false;
mController.onResume(appRow, null, null, null); mController.onResume(appRow, null, null, null);

View File

@@ -1,70 +0,0 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.notification;
import static android.provider.Settings.Secure.NOTIFICATION_BUBBLES;
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.content.Context;
import android.provider.Settings;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import androidx.preference.Preference;
@RunWith(RobolectricTestRunner.class)
public class BubbleSummaryNotificationPreferenceControllerTest {
private Context mContext;
private BubbleSummaryNotificationPreferenceController mController;
private Preference mPreference;
private static final String KEY_NOTIFICATION_BUBBLES = "notification_bubbles";
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
mController = new BubbleSummaryNotificationPreferenceController(mContext,
KEY_NOTIFICATION_BUBBLES);
mPreference = new Preference(RuntimeEnvironment.application);
}
@Test
public void display_shouldDisplay() {
assertThat(mPreference.isVisible()).isTrue();
}
@Test
public void getSummary() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, OFF);
assertThat(mController.getSummary()).isEqualTo("Off");
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, ON);
assertThat(mController.getSummary()).isEqualTo("On");
}
}

View File

@@ -22,6 +22,9 @@ import static android.app.NotificationManager.IMPORTANCE_LOW;
import static android.app.NotificationManager.IMPORTANCE_NONE; import static android.app.NotificationManager.IMPORTANCE_NONE;
import static android.provider.Settings.Secure.NOTIFICATION_BUBBLES; import static android.provider.Settings.Secure.NOTIFICATION_BUBBLES;
import static com.android.settings.notification.BubbleSummaryPreferenceController.SYSTEM_WIDE_OFF;
import static com.android.settings.notification.BubbleSummaryPreferenceController.SYSTEM_WIDE_ON;
import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
@@ -95,7 +98,8 @@ public class BubbleSummaryPreferenceControllerTest {
NotificationChannel channel = mock(NotificationChannel.class); NotificationChannel channel = mock(NotificationChannel.class);
when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH); when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
mController.onResume(appRow, channel, null, null); mController.onResume(appRow, channel, null, null);
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 0); Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES,
SYSTEM_WIDE_OFF);
assertFalse(mController.isAvailable()); assertFalse(mController.isAvailable());
} }
@@ -104,18 +108,19 @@ public class BubbleSummaryPreferenceControllerTest {
public void testIsAvailable_app() { public void testIsAvailable_app() {
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
mController.onResume(appRow, null, null, null); mController.onResume(appRow, null, null, null);
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 1); Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
assertTrue(mController.isAvailable()); assertTrue(mController.isAvailable());
} }
@Test @Test
public void testIsAvailable_app_globalOff() { public void testIsNotAvailable_app_globalOff() {
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
mController.onResume(appRow, null, null, null); mController.onResume(appRow, null, null, null);
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 0); Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES,
SYSTEM_WIDE_OFF);
assertTrue(mController.isAvailable()); assertFalse(mController.isAvailable());
} }
@Test @Test
@@ -126,7 +131,7 @@ public class BubbleSummaryPreferenceControllerTest {
when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH); when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
when(channel.getId()).thenReturn(DEFAULT_CHANNEL_ID); when(channel.getId()).thenReturn(DEFAULT_CHANNEL_ID);
mController.onResume(appRow, channel, null, null); mController.onResume(appRow, channel, null, null);
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 1); Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
assertTrue(mController.isAvailable()); assertTrue(mController.isAvailable());
} }
@@ -144,16 +149,18 @@ public class BubbleSummaryPreferenceControllerTest {
@Test @Test
public void testGetSummary() { public void testGetSummary() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
appRow.allowBubbles = true; appRow.allowBubbles = true;
mController.onResume(appRow, null, null, null); mController.onResume(appRow, null, null, null);
assertEquals("On", mController.getSummary()); assertEquals("On", mController.getSummary());
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 0); Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES,
SYSTEM_WIDE_OFF);
assertEquals("Off", mController.getSummary()); assertEquals("Off", mController.getSummary());
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 1); Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
appRow.allowBubbles = false; appRow.allowBubbles = false;
mController.onResume(appRow, null, null, null); mController.onResume(appRow, null, null, null);