Non-blockable notification packages.

Adds a resource for listing packages whose notifications users
cannot block.

Bug: 31404047
Change-Id: I6247f0826fe1c2cf080b33fea6b7fdcf1e9f0cc6
This commit is contained in:
Julia Reynolds
2016-09-12 08:53:47 -04:00
parent b0c59bb504
commit 98a448633c
4 changed files with 29 additions and 11 deletions

View File

@@ -2548,4 +2548,7 @@
<item>110,119:112</item> <item>110,119:112</item>
--> -->
<string-array translatable="false" name="config_convert_to_emergency_number_map" /> <string-array translatable="false" name="config_convert_to_emergency_number_map" />
<!-- An array of packages for which notifications cannot be blocked. -->
<string-array translatable="false" name="config_nonBlockableNotificationPackages" />
</resources> </resources>

View File

@@ -2700,4 +2700,6 @@
<java-symbol type="drawable" name="ic_restart" /> <java-symbol type="drawable" name="ic_restart" />
<java-symbol type="array" name="config_convert_to_emergency_number_map" /> <java-symbol type="array" name="config_convert_to_emergency_number_map" />
<java-symbol type="array" name="config_nonBlockableNotificationPackages" />
</resources> </resources>

View File

@@ -113,8 +113,11 @@ import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.stack.StackStateAnimator; import com.android.systemui.statusbar.stack.StackStateAnimator;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Set;
import static android.service.notification.NotificationListenerService.Ranking.IMPORTANCE_HIGH; import static android.service.notification.NotificationListenerService.Ranking.IMPORTANCE_HIGH;
@@ -268,6 +271,8 @@ public abstract class BaseStatusBar extends SystemUI implements
protected boolean mVrMode; protected boolean mVrMode;
private Set<String> mNonBlockablePkgs;
@Override // NotificationData.Environment @Override // NotificationData.Environment
public boolean isDeviceProvisioned() { public boolean isDeviceProvisioned() {
return mDeviceProvisioned; return mDeviceProvisioned;
@@ -824,6 +829,9 @@ public abstract class BaseStatusBar extends SystemUI implements
Slog.e(TAG, "Failed to register VR mode state listener: " + e); Slog.e(TAG, "Failed to register VR mode state listener: " + e);
} }
mNonBlockablePkgs = new HashSet<String>();
Collections.addAll(mNonBlockablePkgs, mContext.getResources().getStringArray(
com.android.internal.R.array.config_nonBlockableNotificationPackages));
} }
protected void notifyUserAboutHiddenNotifications() { protected void notifyUserAboutHiddenNotifications() {
@@ -1104,7 +1112,8 @@ public abstract class BaseStatusBar extends SystemUI implements
settingsButton.setVisibility(View.GONE); settingsButton.setVisibility(View.GONE);
} }
guts.bindImportance(pmUser, sbn, mNotificationData.getImportance(sbn.getKey())); guts.bindImportance(pmUser, sbn, mNonBlockablePkgs,
mNotificationData.getImportance(sbn.getKey()));
final TextView doneButton = (TextView) guts.findViewById(R.id.done); final TextView doneButton = (TextView) guts.findViewById(R.id.done);
doneButton.setText(R.string.notification_done); doneButton.setText(R.string.notification_done);

View File

@@ -50,6 +50,8 @@ import com.android.systemui.R;
import com.android.systemui.statusbar.stack.StackStateAnimator; import com.android.systemui.statusbar.stack.StackStateAnimator;
import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService;
import java.util.Set;
/** /**
* The guts of a notification revealed when performing a long press. * The guts of a notification revealed when performing a long press.
*/ */
@@ -173,7 +175,7 @@ public class NotificationGuts extends LinearLayout implements TunerService.Tunab
} }
void bindImportance(final PackageManager pm, final StatusBarNotification sbn, void bindImportance(final PackageManager pm, final StatusBarNotification sbn,
final int importance) { final Set<String> nonBlockablePkgs, final int importance) {
mINotificationManager = INotificationManager.Stub.asInterface( mINotificationManager = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE)); ServiceManager.getService(Context.NOTIFICATION_SERVICE));
mStartingUserImportance = NotificationListenerService.Ranking.IMPORTANCE_UNSPECIFIED; mStartingUserImportance = NotificationListenerService.Ranking.IMPORTANCE_UNSPECIFIED;
@@ -182,24 +184,26 @@ public class NotificationGuts extends LinearLayout implements TunerService.Tunab
mINotificationManager.getImportance(sbn.getPackageName(), sbn.getUid()); mINotificationManager.getImportance(sbn.getPackageName(), sbn.getUid());
} catch (RemoteException e) {} } catch (RemoteException e) {}
mNotificationImportance = importance; mNotificationImportance = importance;
boolean systemApp = false; boolean nonBlockable = false;
try { try {
final PackageInfo info = final PackageInfo info =
pm.getPackageInfo(sbn.getPackageName(), PackageManager.GET_SIGNATURES); pm.getPackageInfo(sbn.getPackageName(), PackageManager.GET_SIGNATURES);
systemApp = Utils.isSystemPackage(getResources(), pm, info); nonBlockable = Utils.isSystemPackage(getResources(), pm, info);
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
// unlikely. // unlikely.
} }
if (nonBlockablePkgs != null) {
nonBlockable |= nonBlockablePkgs.contains(sbn.getPackageName());
}
final View importanceSlider = findViewById(R.id.importance_slider); final View importanceSlider = findViewById(R.id.importance_slider);
final View importanceButtons = findViewById(R.id.importance_buttons); final View importanceButtons = findViewById(R.id.importance_buttons);
if (mShowSlider) { if (mShowSlider) {
bindSlider(importanceSlider, systemApp); bindSlider(importanceSlider, nonBlockable);
importanceSlider.setVisibility(View.VISIBLE); importanceSlider.setVisibility(View.VISIBLE);
importanceButtons.setVisibility(View.GONE); importanceButtons.setVisibility(View.GONE);
} else { } else {
bindToggles(importanceButtons, mStartingUserImportance, nonBlockable);
bindToggles(importanceButtons, mStartingUserImportance, systemApp);
importanceButtons.setVisibility(View.VISIBLE); importanceButtons.setVisibility(View.VISIBLE);
importanceSlider.setVisibility(View.GONE); importanceSlider.setVisibility(View.GONE);
} }
@@ -239,7 +243,7 @@ public class NotificationGuts extends LinearLayout implements TunerService.Tunab
} }
private void bindToggles(final View importanceButtons, final int importance, private void bindToggles(final View importanceButtons, final int importance,
final boolean systemApp) { final boolean nonBlockable) {
((RadioGroup) importanceButtons).setOnCheckedChangeListener( ((RadioGroup) importanceButtons).setOnCheckedChangeListener(
new RadioGroup.OnCheckedChangeListener() { new RadioGroup.OnCheckedChangeListener() {
@Override @Override
@@ -250,7 +254,7 @@ public class NotificationGuts extends LinearLayout implements TunerService.Tunab
mBlock = (RadioButton) importanceButtons.findViewById(R.id.block_importance); mBlock = (RadioButton) importanceButtons.findViewById(R.id.block_importance);
mSilent = (RadioButton) importanceButtons.findViewById(R.id.silent_importance); mSilent = (RadioButton) importanceButtons.findViewById(R.id.silent_importance);
mReset = (RadioButton) importanceButtons.findViewById(R.id.reset_importance); mReset = (RadioButton) importanceButtons.findViewById(R.id.reset_importance);
if (systemApp) { if (nonBlockable) {
mBlock.setVisibility(View.GONE); mBlock.setVisibility(View.GONE);
mReset.setText(mContext.getString(R.string.do_not_silence)); mReset.setText(mContext.getString(R.string.do_not_silence));
} else { } else {
@@ -265,7 +269,7 @@ public class NotificationGuts extends LinearLayout implements TunerService.Tunab
} }
} }
private void bindSlider(final View importanceSlider, final boolean systemApp) { private void bindSlider(final View importanceSlider, final boolean nonBlockable) {
mActiveSliderTint = ColorStateList.valueOf(Utils.getColorAccent(mContext)); mActiveSliderTint = ColorStateList.valueOf(Utils.getColorAccent(mContext));
mInactiveSliderTint = loadColorStateList(R.color.notification_guts_disabled_slider_color); mInactiveSliderTint = loadColorStateList(R.color.notification_guts_disabled_slider_color);
@@ -273,7 +277,7 @@ public class NotificationGuts extends LinearLayout implements TunerService.Tunab
mImportanceTitle = ((TextView) importanceSlider.findViewById(R.id.title)); mImportanceTitle = ((TextView) importanceSlider.findViewById(R.id.title));
mSeekBar = (SeekBar) importanceSlider.findViewById(R.id.seekbar); mSeekBar = (SeekBar) importanceSlider.findViewById(R.id.seekbar);
final int minProgress = systemApp ? final int minProgress = nonBlockable ?
NotificationListenerService.Ranking.IMPORTANCE_MIN NotificationListenerService.Ranking.IMPORTANCE_MIN
: NotificationListenerService.Ranking.IMPORTANCE_NONE; : NotificationListenerService.Ranking.IMPORTANCE_NONE;
mSeekBar.setMax(NotificationListenerService.Ranking.IMPORTANCE_MAX); mSeekBar.setMax(NotificationListenerService.Ranking.IMPORTANCE_MAX);