Merge "Move bubble settings to their own page"
This commit is contained in:
committed by
Android (Google) Code Review
commit
4524c700f3
@@ -2454,6 +2454,18 @@
|
|||||||
android:value="true" />
|
android:value="true" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name="Settings$AppBubbleNotificationSettingsActivity"
|
||||||
|
android:label="@string/bubbles_app_toggle_title"
|
||||||
|
android:parentActivityName="Settings$NotificationAppListActivity">
|
||||||
|
<intent-filter android:priority="1">
|
||||||
|
<action android:name="android.settings.APP_NOTIFICATION_BUBBLE_SETTINGS" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
</intent-filter>
|
||||||
|
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
|
||||||
|
android:value="com.android.settings.notification.AppBubbleNotificationSettings" />
|
||||||
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="Settings$SoundSettingsActivity"
|
android:name="Settings$SoundSettingsActivity"
|
||||||
android:label="@string/sound_settings"
|
android:label="@string/sound_settings"
|
||||||
|
@@ -7791,9 +7791,9 @@
|
|||||||
<string name="notification_badging_title">Allow notification dots</string>
|
<string name="notification_badging_title">Allow notification dots</string>
|
||||||
|
|
||||||
<!-- 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">Allow bubbles</string>
|
<string name="notification_bubbles_title">Bubbles</string>
|
||||||
<!-- Configure Notifications: Summary for the notification bubbles option. [CHAR LIMIT=NONE] -->
|
<!-- Configure Notifications: Summary for the notification bubbles option. [CHAR LIMIT=NONE] -->
|
||||||
<string name="notification_bubbles_summary">Allow apps to show some notifications as bubbles</string>
|
<string name="notification_bubbles_summary">Quickly access app content from anywhere using floating shortcuts</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] -->
|
||||||
|
34
res/xml/app_bubble_notification_settings.xml
Normal file
34
res/xml/app_bubble_notification_settings.xml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<?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="app_bubble_notification_settings">
|
||||||
|
<com.android.settingslib.widget.LayoutPreference
|
||||||
|
android:key="pref_app_header"
|
||||||
|
android:layout="@layout/settings_entity_header"/>
|
||||||
|
|
||||||
|
<com.android.settingslib.RestrictedSwitchPreference
|
||||||
|
android:key="bubble_pref"
|
||||||
|
android:title="@string/notification_bubbles_title"/>
|
||||||
|
|
||||||
|
<com.android.settingslib.widget.FooterPreference
|
||||||
|
android:key="notification_bubbles_footer"
|
||||||
|
android:title="@string/bubbles_feature_education"
|
||||||
|
android:selectable="false" />
|
||||||
|
|
||||||
|
</PreferenceScreen>
|
@@ -60,11 +60,10 @@
|
|||||||
settings:useAdditionalSummary="true"
|
settings:useAdditionalSummary="true"
|
||||||
android:order="1001"
|
android:order="1001"
|
||||||
settings:restrictedSwitchSummary="@string/enabled_by_admin" />
|
settings:restrictedSwitchSummary="@string/enabled_by_admin" />
|
||||||
<com.android.settingslib.RestrictedSwitchPreference
|
<Preference
|
||||||
android:key="bubble_pref"
|
android:key="bubble_link_pref"
|
||||||
android:title="@string/notification_bubbles_title"
|
android:title="@string/notification_bubbles_title"
|
||||||
android:order="1002"
|
android:order="1002" />
|
||||||
settings:restrictedSwitchSummary="@string/enabled_by_admin" />
|
|
||||||
<Preference
|
<Preference
|
||||||
android:key="app_link"
|
android:key="app_link"
|
||||||
android:order="1003"
|
android:order="1003"
|
||||||
|
33
res/xml/bubble_notification_settings.xml
Normal file
33
res/xml/bubble_notification_settings.xml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<?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">
|
||||||
|
<!-- 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>
|
@@ -70,11 +70,11 @@
|
|||||||
settings:controller="com.android.settings.notification.BadgingNotificationPreferenceController"/>
|
settings:controller="com.android.settings.notification.BadgingNotificationPreferenceController"/>
|
||||||
|
|
||||||
<!-- Notification bubbles -->
|
<!-- Notification bubbles -->
|
||||||
<SwitchPreference
|
<Preference
|
||||||
android:key="notification_bubbles"
|
android:key="notification_bubbles"
|
||||||
android:title="@string/notification_bubbles_title"
|
android:title="@string/notification_bubbles_title"
|
||||||
android:summary="@string/notification_bubbles_summary"
|
settings:controller="com.android.settings.notification.BubbleSummaryNotificationPreferenceController"
|
||||||
settings:controller="com.android.settings.notification.BubbleNotificationPreferenceController"/>
|
android:fragment="com.android.settings.notification.BubbleNotificationSettings"/>
|
||||||
|
|
||||||
<!-- Pulse notification light -->
|
<!-- Pulse notification light -->
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
|
@@ -113,6 +113,7 @@ public class Settings extends SettingsActivity {
|
|||||||
public static class ZenModeEventRuleSettingsActivity extends SettingsActivity { /* empty */ }
|
public static class ZenModeEventRuleSettingsActivity extends SettingsActivity { /* empty */ }
|
||||||
public static class SoundSettingsActivity extends SettingsActivity { /* empty */ }
|
public static class SoundSettingsActivity extends SettingsActivity { /* empty */ }
|
||||||
public static class ConfigureNotificationSettingsActivity extends SettingsActivity { /* empty */ }
|
public static class ConfigureNotificationSettingsActivity extends SettingsActivity { /* empty */ }
|
||||||
|
public static class AppBubbleNotificationSettingsActivity extends SettingsActivity { /* empty */ }
|
||||||
public static class NotificationAssistantSettingsActivity extends SettingsActivity{ /* empty */ }
|
public static class NotificationAssistantSettingsActivity extends SettingsActivity{ /* empty */ }
|
||||||
public static class NotificationAppListActivity extends SettingsActivity { /* empty */ }
|
public static class NotificationAppListActivity extends SettingsActivity { /* empty */ }
|
||||||
public static class AppNotificationSettingsActivity extends SettingsActivity { /* empty */ }
|
public static class AppNotificationSettingsActivity extends SettingsActivity { /* empty */ }
|
||||||
|
@@ -101,7 +101,9 @@ import com.android.settings.network.MobileNetworkListFragment;
|
|||||||
import com.android.settings.network.NetworkDashboardFragment;
|
import com.android.settings.network.NetworkDashboardFragment;
|
||||||
import com.android.settings.nfc.AndroidBeam;
|
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.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;
|
||||||
@@ -211,6 +213,8 @@ 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(),
|
||||||
ZenAccessSettings.class.getName(),
|
ZenAccessSettings.class.getName(),
|
||||||
ZenAccessDetails.class.getName(),
|
ZenAccessDetails.class.getName(),
|
||||||
ZenModeAutomationSettings.class.getName(),
|
ZenModeAutomationSettings.class.getName(),
|
||||||
|
@@ -0,0 +1,104 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.search.BaseSearchIndexProvider;
|
||||||
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
|
import com.android.settingslib.search.SearchIndexable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@SearchIndexable
|
||||||
|
public class AppBubbleNotificationSettings extends NotificationSettingsBase {
|
||||||
|
private static final String TAG = "AppBubNotiSettings";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMetricsCategory() {
|
||||||
|
return SettingsEnums.APP_BUBBLE_SETTINGS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getLogTag() {
|
||||||
|
return TAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getPreferenceScreenResId() {
|
||||||
|
return R.xml.app_bubble_notification_settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
|
||||||
|
mControllers = getPreferenceControllers(context, this);
|
||||||
|
return new ArrayList<>(mControllers);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static List<NotificationPreferenceController> getPreferenceControllers(
|
||||||
|
Context context, AppBubbleNotificationSettings fragment) {
|
||||||
|
List<NotificationPreferenceController> controllers = new ArrayList<>();
|
||||||
|
controllers.add(new HeaderPreferenceController(context, fragment));
|
||||||
|
controllers.add(new BubblePreferenceController(context, new NotificationBackend()));
|
||||||
|
return controllers;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
|
||||||
|
if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null) {
|
||||||
|
Log.w(TAG, "Missing package or uid or packageinfo");
|
||||||
|
finish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (NotificationPreferenceController controller : mControllers) {
|
||||||
|
controller.onResume(mAppRow, mChannel, mChannelGroup, mSuspendedAppsAdmin);
|
||||||
|
controller.displayPreference(getPreferenceScreen());
|
||||||
|
}
|
||||||
|
updatePreferenceStates();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.app_bubble_notification_settings;
|
||||||
|
return Arrays.asList(sir);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<AbstractPreferenceController> createPreferenceControllers(Context
|
||||||
|
context) {
|
||||||
|
return new ArrayList<>(AppBubbleNotificationSettings.getPreferenceControllers(
|
||||||
|
context, null));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
@@ -152,7 +152,7 @@ public class AppNotificationSettings extends NotificationSettingsBase {
|
|||||||
mControllers.add(new DescriptionPreferenceController(context));
|
mControllers.add(new DescriptionPreferenceController(context));
|
||||||
mControllers.add(new NotificationsOffPreferenceController(context));
|
mControllers.add(new NotificationsOffPreferenceController(context));
|
||||||
mControllers.add(new DeletedChannelsPreferenceController(context, mBackend));
|
mControllers.add(new DeletedChannelsPreferenceController(context, mBackend));
|
||||||
mControllers.add(new BubblePreferenceController(context, mBackend));
|
mControllers.add(new BubbleSummaryPreferenceController(context, mBackend));
|
||||||
return new ArrayList<>(mControllers);
|
return new ArrayList<>(mControllers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -56,7 +56,7 @@ public class BubbleNotificationPreferenceController extends TogglePreferenceCont
|
|||||||
@Override
|
@Override
|
||||||
public void displayPreference(PreferenceScreen screen) {
|
public void displayPreference(PreferenceScreen screen) {
|
||||||
super.displayPreference(screen);
|
super.displayPreference(screen);
|
||||||
Preference preference = screen.findPreference(NOTIFICATION_BUBBLES);
|
Preference preference = screen.findPreference(getPreferenceKey());
|
||||||
if (preference != null) {
|
if (preference != null) {
|
||||||
mSettingObserver = new SettingObserver(preference);
|
mSettingObserver = new SettingObserver(preference);
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
@@ -21,6 +21,7 @@ import static android.provider.Settings.Secure.NOTIFICATION_BUBBLES;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
@@ -74,6 +75,8 @@ public class BubblePreferenceController extends NotificationPreferenceController
|
|||||||
pref.setEnabled(isChannelConfigurable() && !pref.isDisabledByAdmin());
|
pref.setEnabled(isChannelConfigurable() && !pref.isDisabledByAdmin());
|
||||||
} else {
|
} else {
|
||||||
pref.setChecked(mAppRow.allowBubbles);
|
pref.setChecked(mAppRow.allowBubbles);
|
||||||
|
pref.setSummary(mContext.getString(
|
||||||
|
R.string.bubbles_app_toggle_summary, mAppRow.label));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* 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.app.settings.SettingsEnums;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.provider.Settings;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.applications.AppInfoBase;
|
||||||
|
import com.android.settings.core.SubSettingLauncher;
|
||||||
|
|
||||||
|
import androidx.preference.Preference;
|
||||||
|
|
||||||
|
public class BubbleSummaryPreferenceController extends NotificationPreferenceController {
|
||||||
|
|
||||||
|
private static final String KEY = "bubble_link_pref";
|
||||||
|
private static final int SYSTEM_WIDE_ON = 1;
|
||||||
|
private static final int SYSTEM_WIDE_OFF = 0;
|
||||||
|
|
||||||
|
public BubbleSummaryPreferenceController(Context context, NotificationBackend backend) {
|
||||||
|
super(context, backend);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPreferenceKey() {
|
||||||
|
return KEY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAvailable() {
|
||||||
|
if (!super.isAvailable()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (mAppRow == null && mChannel == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (Settings.Secure.getInt(mContext.getContentResolver(),
|
||||||
|
NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON) == SYSTEM_WIDE_OFF) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (mChannel != null) {
|
||||||
|
if (isDefaultChannel()) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return mAppRow == null ? false : mAppRow.allowBubbles;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateState(Preference preference) {
|
||||||
|
super.updateState(preference);
|
||||||
|
|
||||||
|
if (mAppRow != null) {
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
args.putString(AppInfoBase.ARG_PACKAGE_NAME, mAppRow.pkg);
|
||||||
|
args.putInt(AppInfoBase.ARG_PACKAGE_UID, mAppRow.uid);
|
||||||
|
|
||||||
|
preference.setIntent(new SubSettingLauncher(mContext)
|
||||||
|
.setDestination(AppBubbleNotificationSettings.class.getName())
|
||||||
|
.setArguments(args)
|
||||||
|
.setSourceMetricsCategory(
|
||||||
|
SettingsEnums.NOTIFICATION_APP_NOTIFICATION)
|
||||||
|
.toIntent());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence getSummary() {
|
||||||
|
boolean canBubble = false;
|
||||||
|
if (mAppRow != null) {
|
||||||
|
if (mChannel != null) {
|
||||||
|
canBubble |= mChannel.canBubble();
|
||||||
|
} else {
|
||||||
|
canBubble |= mAppRow.allowBubbles;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mContext.getString(canBubble ? R.string.switch_on_text : R.string.switch_off_text);
|
||||||
|
}
|
||||||
|
}
|
@@ -23,6 +23,7 @@ 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 org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
@@ -223,6 +224,7 @@ public class BubblePreferenceControllerTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testUpdateState_app() {
|
public void testUpdateState_app() {
|
||||||
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
|
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
|
||||||
|
appRow.label = "App!";
|
||||||
appRow.allowBubbles = true;
|
appRow.allowBubbles = true;
|
||||||
mController.onResume(appRow, null, null, null);
|
mController.onResume(appRow, null, null, null);
|
||||||
|
|
||||||
@@ -235,6 +237,9 @@ public class BubblePreferenceControllerTest {
|
|||||||
|
|
||||||
mController.updateState(pref);
|
mController.updateState(pref);
|
||||||
assertFalse(pref.isChecked());
|
assertFalse(pref.isChecked());
|
||||||
|
|
||||||
|
assertNotNull(pref.getSummary());
|
||||||
|
assertTrue(pref.getSummary().toString().contains(appRow.label));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* 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");
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,149 @@
|
|||||||
|
/*
|
||||||
|
* 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.app.NotificationChannel.DEFAULT_CHANNEL_ID;
|
||||||
|
import static android.app.NotificationManager.IMPORTANCE_HIGH;
|
||||||
|
import static android.app.NotificationManager.IMPORTANCE_LOW;
|
||||||
|
import static android.app.NotificationManager.IMPORTANCE_NONE;
|
||||||
|
import static android.provider.Settings.Secure.NOTIFICATION_BUBBLES;
|
||||||
|
|
||||||
|
import static junit.framework.TestCase.assertEquals;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.UserManager;
|
||||||
|
import android.provider.Settings;
|
||||||
|
|
||||||
|
import com.android.settingslib.RestrictedLockUtils;
|
||||||
|
import com.android.settingslib.RestrictedSwitchPreference;
|
||||||
|
|
||||||
|
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 org.robolectric.shadows.ShadowApplication;
|
||||||
|
|
||||||
|
import androidx.preference.Preference;
|
||||||
|
import androidx.preference.PreferenceScreen;
|
||||||
|
|
||||||
|
@RunWith(RobolectricTestRunner.class)
|
||||||
|
public class BubbleSummaryPreferenceControllerTest {
|
||||||
|
|
||||||
|
private Context mContext;
|
||||||
|
@Mock
|
||||||
|
private NotificationBackend mBackend;
|
||||||
|
|
||||||
|
private BubbleSummaryPreferenceController mController;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
MockitoAnnotations.initMocks(this);
|
||||||
|
ShadowApplication shadowApplication = ShadowApplication.getInstance();
|
||||||
|
mContext = RuntimeEnvironment.application;
|
||||||
|
mController = spy(new BubbleSummaryPreferenceController(mContext, mBackend));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNoCrashIfNoOnResume() {
|
||||||
|
mController.isAvailable();
|
||||||
|
mController.updateState(mock(Preference.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIsAvailable_notIfAppBlocked() {
|
||||||
|
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
|
||||||
|
appRow.banned = true;
|
||||||
|
mController.onResume(appRow, mock(NotificationChannel.class), null, null);
|
||||||
|
assertFalse(mController.isAvailable());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIsAvailable_notIfOffGlobally() {
|
||||||
|
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
|
||||||
|
NotificationChannel channel = mock(NotificationChannel.class);
|
||||||
|
when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
|
||||||
|
mController.onResume(appRow, channel, null, null);
|
||||||
|
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 0);
|
||||||
|
|
||||||
|
assertFalse(mController.isAvailable());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIsAvailable_app() {
|
||||||
|
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
|
||||||
|
mController.onResume(appRow, null, null, null);
|
||||||
|
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 1);
|
||||||
|
|
||||||
|
assertTrue(mController.isAvailable());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIsAvailable_defaultChannel() {
|
||||||
|
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
|
||||||
|
appRow.allowBubbles = true;
|
||||||
|
NotificationChannel channel = mock(NotificationChannel.class);
|
||||||
|
when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
|
||||||
|
when(channel.getId()).thenReturn(DEFAULT_CHANNEL_ID);
|
||||||
|
mController.onResume(appRow, channel, null, null);
|
||||||
|
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 1);
|
||||||
|
|
||||||
|
assertTrue(mController.isAvailable());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUpdateState() {
|
||||||
|
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
|
||||||
|
appRow.allowBubbles = true;
|
||||||
|
mController.onResume(appRow, null, null, null);
|
||||||
|
|
||||||
|
Preference pref = new Preference(mContext);
|
||||||
|
mController.updateState(pref);
|
||||||
|
assertNotNull(pref.getIntent());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetSummary() {
|
||||||
|
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
|
||||||
|
appRow.allowBubbles = true;
|
||||||
|
mController.onResume(appRow, null, null, null);
|
||||||
|
|
||||||
|
assertEquals("On", mController.getSummary());
|
||||||
|
|
||||||
|
appRow.allowBubbles = false;
|
||||||
|
mController.onResume(appRow, null, null, null);
|
||||||
|
|
||||||
|
assertEquals("Off", mController.getSummary());
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user