Merge "Move feature-level Bubble setting into developer options; default to off" into qt-dev am: 240b227e1f
am: 34fa757cc9
Change-Id: I01aa071f1ce7f59aa160b7e53baf9da2d2a7db95
This commit is contained in:
Binary file not shown.
@@ -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] -->
|
||||||
|
@@ -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>
|
|
@@ -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"
|
||||||
|
@@ -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
|
||||||
|
@@ -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(),
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
@@ -498,6 +498,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"));
|
||||||
|
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -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);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@@ -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) {
|
||||||
|
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -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);
|
||||||
|
@@ -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");
|
|
||||||
}
|
|
||||||
}
|
|
@@ -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);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user