Loading res/values/strings.xml +2 −2 Original line number Diff line number Diff line Loading @@ -7106,10 +7106,10 @@ summary on the channel page--> <!-- [CHAR LIMIT=100] Notification Importance: min importance level description --> <string name="notification_importance_min">No sound or visual interruption</string> <string name="notification_importance_min">Show silently and minimize</string> <!-- [CHAR LIMIT=100] Notification Importance: low importance level description --> <string name="notification_importance_low">No sound</string> <string name="notification_importance_low">Show silently</string> <!-- [CHAR LIMIT=100] Notification Importance: normal importance level description --> <string name="notification_importance_default">Make sound</string> src/com/android/settings/notification/AppNotificationSettings.java +63 −13 Original line number Diff line number Diff line Loading @@ -19,10 +19,8 @@ package com.android.settings.notification; import android.app.NotificationChannel; import android.app.NotificationChannelGroup; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.provider.Settings; import android.support.v14.preference.SwitchPreference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceCategory; import android.support.v7.preference.PreferenceGroup; Loading @@ -32,9 +30,8 @@ import android.util.Log; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.applications.AppInfoBase; import com.android.settings.widget.MasterSwitchPreference; import com.android.settings.widget.MasterCheckBoxPreference; import com.android.settingslib.RestrictedSwitchPreference; import com.android.settingslib.core.AbstractPreferenceController; import java.util.ArrayList; Loading Loading @@ -179,7 +176,7 @@ public class AppNotificationSettings extends NotificationSettingsBase { groupCategory.setKey(group.getId()); populateGroupToggle(groupCategory, group); } if (!group.isBlocked()) { final List<NotificationChannel> channels = group.getChannels(); Collections.sort(channels, mChannelComparator); int N = channels.size(); Loading @@ -189,6 +186,26 @@ public class AppNotificationSettings extends NotificationSettingsBase { } } } } protected void populateGroupToggle(final PreferenceGroup parent, NotificationChannelGroup group) { RestrictedSwitchPreference preference = new RestrictedSwitchPreference(getPrefContext()); preference.setTitle(R.string.notification_switch_label); preference.setEnabled(mSuspendedAppsAdmin == null && isChannelGroupBlockable(group)); preference.setChecked(!group.isBlocked()); preference.setOnPreferenceClickListener(preference1 -> { final boolean allowGroup = ((SwitchPreference) preference1).isChecked(); group.setBlocked(!allowGroup); mBackend.updateChannelGroup(mAppRow.pkg, mAppRow.uid, group); onGroupBlockStateChanged(group); return true; }); parent.addPreference(preference); } private Comparator<NotificationChannelGroup> mChannelGroupComparator = new Comparator<NotificationChannelGroup>() { Loading @@ -204,4 +221,37 @@ public class AppNotificationSettings extends NotificationSettingsBase { return left.getId().compareTo(right.getId()); } }; protected void onGroupBlockStateChanged(NotificationChannelGroup group) { if (group == null) { return; } PreferenceGroup groupGroup = ( PreferenceGroup) getPreferenceScreen().findPreference(group.getId()); if (groupGroup != null) { if (group.isBlocked()) { List<Preference> toRemove = new ArrayList<>(); int childCount = groupGroup.getPreferenceCount(); for (int i = 0; i < childCount; i++) { Preference pref = groupGroup.getPreference(i); if (pref instanceof MasterCheckBoxPreference) { toRemove.add(pref); } } for (Preference pref : toRemove) { groupGroup.removePreference(pref); } } else { final List<NotificationChannel> channels = group.getChannels(); Collections.sort(channels, mChannelComparator); int N = channels.size(); for (int i = 0; i < N; i++) { final NotificationChannel channel = channels.get(i); populateSingleChannelPrefs(groupGroup, channel, group.isBlocked()); } } } } } src/com/android/settings/notification/BlockPreferenceController.java +4 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,10 @@ public class BlockPreferenceController extends NotificationPreferenceController mChannel.setImportance(importance); saveChannel(); } if (mBackend.onlyHasDefaultChannel(mAppRow.pkg, mAppRow.uid)) { mAppRow.banned = blocked; mBackend.setNotificationsEnabledForPackage(mAppRow.pkg, mAppRow.uid, !blocked); } } else if (mChannelGroup != null && mChannelGroup.getGroup() != null) { mChannelGroup.setBlocked(blocked); mBackend.updateChannelGroup(mAppRow.pkg, mAppRow.uid, mChannelGroup.getGroup()); Loading src/com/android/settings/notification/NotificationAppPreference.java 0 → 100644 +131 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 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.content.Context; import android.support.v7.preference.PreferenceViewHolder; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; import android.widget.ProgressBar; import android.widget.Switch; import com.android.settings.R; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.TwoTargetPreference; /** * Shows an app icon, title and summary. Has a second switch touch target. */ public class NotificationAppPreference extends TwoTargetPreference { private int mProgress; private boolean mProgressVisible; private Switch mSwitch; private boolean mChecked; private boolean mEnableSwitch = true; public NotificationAppPreference(Context context) { super(context); setLayoutResource(R.layout.preference_app); } public NotificationAppPreference(Context context, AttributeSet attrs) { super(context, attrs); setLayoutResource(R.layout.preference_app); } @Override protected int getSecondTargetResId() { return R.layout.preference_widget_master_switch; } public void setProgress(int amount) { mProgress = amount; mProgressVisible = true; notifyChanged(); } @Override public void onBindViewHolder(PreferenceViewHolder view) { super.onBindViewHolder(view); view.findViewById(R.id.summary_container) .setVisibility(TextUtils.isEmpty(getSummary()) ? View.GONE : View.VISIBLE); final ProgressBar progress = (ProgressBar) view.findViewById(android.R.id.progress); if (mProgressVisible) { progress.setProgress(mProgress); progress.setVisibility(View.VISIBLE); } else { progress.setVisibility(View.GONE); } final View widgetView = view.findViewById(android.R.id.widget_frame); if (widgetView != null) { widgetView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mSwitch != null && !mSwitch.isEnabled()) { return; } setChecked(!mChecked); if (!callChangeListener(mChecked)) { setChecked(!mChecked); } else { persistBoolean(mChecked); } } }); } mSwitch = (Switch) view.findViewById(R.id.switchWidget); if (mSwitch != null) { mSwitch.setContentDescription(getTitle()); mSwitch.setChecked(mChecked); mSwitch.setEnabled(mEnableSwitch); } } public boolean isChecked() { return mSwitch != null && mChecked; } public void setChecked(boolean checked) { mChecked = checked; if (mSwitch != null) { mSwitch.setChecked(checked); } } public void setSwitchEnabled(boolean enabled) { mEnableSwitch = enabled; if (mSwitch != null) { mSwitch.setEnabled(enabled); } } /** * If admin is not null, disables the switch. * Otherwise, keep it enabled. */ public void setDisabledByAdmin(RestrictedLockUtils.EnforcedAdmin admin) { setSwitchEnabled(admin == null); } public Switch getSwitch() { return mSwitch; } } src/com/android/settings/notification/NotificationBackend.java +9 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,9 @@ */ package com.android.settings.notification; import static android.app.NotificationManager.IMPORTANCE_NONE; import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED; import android.app.INotificationManager; import android.app.NotificationChannel; import android.app.NotificationChannelGroup; Loading Loading @@ -101,6 +104,12 @@ public class NotificationBackend { public boolean setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled) { try { if (onlyHasDefaultChannel(pkg, uid)) { NotificationChannel defaultChannel = getChannel(pkg, uid, NotificationChannel.DEFAULT_CHANNEL_ID); defaultChannel.setImportance(enabled ? IMPORTANCE_UNSPECIFIED : IMPORTANCE_NONE); updateChannel(pkg, uid, defaultChannel); } sINM.setNotificationsEnabledForPackage(pkg, uid, enabled); return true; } catch (Exception e) { Loading Loading
res/values/strings.xml +2 −2 Original line number Diff line number Diff line Loading @@ -7106,10 +7106,10 @@ summary on the channel page--> <!-- [CHAR LIMIT=100] Notification Importance: min importance level description --> <string name="notification_importance_min">No sound or visual interruption</string> <string name="notification_importance_min">Show silently and minimize</string> <!-- [CHAR LIMIT=100] Notification Importance: low importance level description --> <string name="notification_importance_low">No sound</string> <string name="notification_importance_low">Show silently</string> <!-- [CHAR LIMIT=100] Notification Importance: normal importance level description --> <string name="notification_importance_default">Make sound</string>
src/com/android/settings/notification/AppNotificationSettings.java +63 −13 Original line number Diff line number Diff line Loading @@ -19,10 +19,8 @@ package com.android.settings.notification; import android.app.NotificationChannel; import android.app.NotificationChannelGroup; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.provider.Settings; import android.support.v14.preference.SwitchPreference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceCategory; import android.support.v7.preference.PreferenceGroup; Loading @@ -32,9 +30,8 @@ import android.util.Log; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.applications.AppInfoBase; import com.android.settings.widget.MasterSwitchPreference; import com.android.settings.widget.MasterCheckBoxPreference; import com.android.settingslib.RestrictedSwitchPreference; import com.android.settingslib.core.AbstractPreferenceController; import java.util.ArrayList; Loading Loading @@ -179,7 +176,7 @@ public class AppNotificationSettings extends NotificationSettingsBase { groupCategory.setKey(group.getId()); populateGroupToggle(groupCategory, group); } if (!group.isBlocked()) { final List<NotificationChannel> channels = group.getChannels(); Collections.sort(channels, mChannelComparator); int N = channels.size(); Loading @@ -189,6 +186,26 @@ public class AppNotificationSettings extends NotificationSettingsBase { } } } } protected void populateGroupToggle(final PreferenceGroup parent, NotificationChannelGroup group) { RestrictedSwitchPreference preference = new RestrictedSwitchPreference(getPrefContext()); preference.setTitle(R.string.notification_switch_label); preference.setEnabled(mSuspendedAppsAdmin == null && isChannelGroupBlockable(group)); preference.setChecked(!group.isBlocked()); preference.setOnPreferenceClickListener(preference1 -> { final boolean allowGroup = ((SwitchPreference) preference1).isChecked(); group.setBlocked(!allowGroup); mBackend.updateChannelGroup(mAppRow.pkg, mAppRow.uid, group); onGroupBlockStateChanged(group); return true; }); parent.addPreference(preference); } private Comparator<NotificationChannelGroup> mChannelGroupComparator = new Comparator<NotificationChannelGroup>() { Loading @@ -204,4 +221,37 @@ public class AppNotificationSettings extends NotificationSettingsBase { return left.getId().compareTo(right.getId()); } }; protected void onGroupBlockStateChanged(NotificationChannelGroup group) { if (group == null) { return; } PreferenceGroup groupGroup = ( PreferenceGroup) getPreferenceScreen().findPreference(group.getId()); if (groupGroup != null) { if (group.isBlocked()) { List<Preference> toRemove = new ArrayList<>(); int childCount = groupGroup.getPreferenceCount(); for (int i = 0; i < childCount; i++) { Preference pref = groupGroup.getPreference(i); if (pref instanceof MasterCheckBoxPreference) { toRemove.add(pref); } } for (Preference pref : toRemove) { groupGroup.removePreference(pref); } } else { final List<NotificationChannel> channels = group.getChannels(); Collections.sort(channels, mChannelComparator); int N = channels.size(); for (int i = 0; i < N; i++) { final NotificationChannel channel = channels.get(i); populateSingleChannelPrefs(groupGroup, channel, group.isBlocked()); } } } } }
src/com/android/settings/notification/BlockPreferenceController.java +4 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,10 @@ public class BlockPreferenceController extends NotificationPreferenceController mChannel.setImportance(importance); saveChannel(); } if (mBackend.onlyHasDefaultChannel(mAppRow.pkg, mAppRow.uid)) { mAppRow.banned = blocked; mBackend.setNotificationsEnabledForPackage(mAppRow.pkg, mAppRow.uid, !blocked); } } else if (mChannelGroup != null && mChannelGroup.getGroup() != null) { mChannelGroup.setBlocked(blocked); mBackend.updateChannelGroup(mAppRow.pkg, mAppRow.uid, mChannelGroup.getGroup()); Loading
src/com/android/settings/notification/NotificationAppPreference.java 0 → 100644 +131 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 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.content.Context; import android.support.v7.preference.PreferenceViewHolder; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; import android.widget.ProgressBar; import android.widget.Switch; import com.android.settings.R; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.TwoTargetPreference; /** * Shows an app icon, title and summary. Has a second switch touch target. */ public class NotificationAppPreference extends TwoTargetPreference { private int mProgress; private boolean mProgressVisible; private Switch mSwitch; private boolean mChecked; private boolean mEnableSwitch = true; public NotificationAppPreference(Context context) { super(context); setLayoutResource(R.layout.preference_app); } public NotificationAppPreference(Context context, AttributeSet attrs) { super(context, attrs); setLayoutResource(R.layout.preference_app); } @Override protected int getSecondTargetResId() { return R.layout.preference_widget_master_switch; } public void setProgress(int amount) { mProgress = amount; mProgressVisible = true; notifyChanged(); } @Override public void onBindViewHolder(PreferenceViewHolder view) { super.onBindViewHolder(view); view.findViewById(R.id.summary_container) .setVisibility(TextUtils.isEmpty(getSummary()) ? View.GONE : View.VISIBLE); final ProgressBar progress = (ProgressBar) view.findViewById(android.R.id.progress); if (mProgressVisible) { progress.setProgress(mProgress); progress.setVisibility(View.VISIBLE); } else { progress.setVisibility(View.GONE); } final View widgetView = view.findViewById(android.R.id.widget_frame); if (widgetView != null) { widgetView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mSwitch != null && !mSwitch.isEnabled()) { return; } setChecked(!mChecked); if (!callChangeListener(mChecked)) { setChecked(!mChecked); } else { persistBoolean(mChecked); } } }); } mSwitch = (Switch) view.findViewById(R.id.switchWidget); if (mSwitch != null) { mSwitch.setContentDescription(getTitle()); mSwitch.setChecked(mChecked); mSwitch.setEnabled(mEnableSwitch); } } public boolean isChecked() { return mSwitch != null && mChecked; } public void setChecked(boolean checked) { mChecked = checked; if (mSwitch != null) { mSwitch.setChecked(checked); } } public void setSwitchEnabled(boolean enabled) { mEnableSwitch = enabled; if (mSwitch != null) { mSwitch.setEnabled(enabled); } } /** * If admin is not null, disables the switch. * Otherwise, keep it enabled. */ public void setDisabledByAdmin(RestrictedLockUtils.EnforcedAdmin admin) { setSwitchEnabled(admin == null); } public Switch getSwitch() { return mSwitch; } }
src/com/android/settings/notification/NotificationBackend.java +9 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,9 @@ */ package com.android.settings.notification; import static android.app.NotificationManager.IMPORTANCE_NONE; import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED; import android.app.INotificationManager; import android.app.NotificationChannel; import android.app.NotificationChannelGroup; Loading Loading @@ -101,6 +104,12 @@ public class NotificationBackend { public boolean setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled) { try { if (onlyHasDefaultChannel(pkg, uid)) { NotificationChannel defaultChannel = getChannel(pkg, uid, NotificationChannel.DEFAULT_CHANNEL_ID); defaultChannel.setImportance(enabled ? IMPORTANCE_UNSPECIFIED : IMPORTANCE_NONE); updateChannel(pkg, uid, defaultChannel); } sINM.setNotificationsEnabledForPackage(pkg, uid, enabled); return true; } catch (Exception e) { Loading