diff options
| -rw-r--r-- | api/system-current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/app/Notification.java | 46 | ||||
| -rw-r--r-- | core/res/AndroidManifest.xml | 6 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java | 6 |
4 files changed, 51 insertions, 8 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 7779f0b5581c..9a39b4cd74c2 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -217,6 +217,7 @@ package android { field public static final java.lang.String SIGNAL_PERSISTENT_PROCESSES = "android.permission.SIGNAL_PERSISTENT_PROCESSES"; field public static final java.lang.String STATUS_BAR = "android.permission.STATUS_BAR"; field public static final java.lang.String STOP_APP_SWITCHES = "android.permission.STOP_APP_SWITCHES"; + field public static final java.lang.String SUBSTITUTE_NOTIFICATION_APP_NAME = "android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"; field public static final java.lang.String SYSTEM_ALERT_WINDOW = "android.permission.SYSTEM_ALERT_WINDOW"; field public static final java.lang.String TETHER_PRIVILEGED = "android.permission.TETHER_PRIVILEGED"; field public static final java.lang.String TRANSMIT_IR = "android.permission.TRANSMIT_IR"; diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 052874f77ce6..bf72d7be263a 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -25,6 +25,8 @@ import android.annotation.SystemApi; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.ColorStateList; import android.graphics.Bitmap; @@ -960,6 +962,12 @@ public class Notification implements Parcelable */ public static final String EXTRA_CONTAINS_CUSTOM_VIEW = "android.contains.customView"; + /** + * @SystemApi + * @hide + */ + public static final String EXTRA_SUBSTITUTE_APP_NAME = "android.substName"; + private Icon mSmallIcon; private Icon mLargeIcon; @@ -3269,14 +3277,38 @@ public class Notification implements Parcelable } } - private void bindHeaderAppName(RemoteViews contentView) { - CharSequence appName = mContext.getPackageManager() - .getApplicationLabel(mContext.getApplicationInfo()); - - if (TextUtils.isEmpty(appName)) { - return; + private String loadHeaderAppName() { + CharSequence name = null; + final PackageManager pm = mContext.getPackageManager(); + if (mN.extras.containsKey(EXTRA_SUBSTITUTE_APP_NAME)) { + // only system packages which lump together a bunch of unrelated stuff + // may substitute a different name to make the purpose of the + // notification more clear. the correct package label should always + // be accessible via SystemUI. + final String pkg = mContext.getPackageName(); + final String subName = mN.extras.getString(EXTRA_SUBSTITUTE_APP_NAME); + if (PackageManager.PERMISSION_GRANTED == pm.checkPermission( + android.Manifest.permission.SUBSTITUTE_NOTIFICATION_APP_NAME, pkg)) { + name = subName; + } else { + Log.w(TAG, "warning: pkg " + + pkg + " attempting to substitute app name '" + subName + + "' without holding perm " + + android.Manifest.permission.SUBSTITUTE_NOTIFICATION_APP_NAME); + } + } + if (TextUtils.isEmpty(name)) { + name = pm.getApplicationLabel(mContext.getApplicationInfo()); + } + if (TextUtils.isEmpty(name)) { + // still nothing? + return null; } - contentView.setTextViewText(R.id.app_name_text, appName); + + return String.valueOf(name); + } + private void bindHeaderAppName(RemoteViews contentView) { + contentView.setTextViewText(R.id.app_name_text, loadHeaderAppName()); contentView.setTextColor(R.id.app_name_text, resolveContrastColor()); } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 778f79761441..1ed93ccfc34b 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -3008,6 +3008,12 @@ <permission android:name="android.permission.UPDATE_LOCK_TASK_PACKAGES" android:protectionLevel="signature|setup" /> + <!-- @SystemApi Allows an application to replace the app name displayed alongside notifications + in the N-release and later. + @hide <p>Not for use by third-party applications.</p> --> + <permission android:name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME" + android:protectionLevel="signature|privileged" /> + <application android:process="system" android:persistent="true" android:hasCode="false" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 11a7048cefa0..75b76db9cbd3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -1575,7 +1575,11 @@ public abstract class BaseStatusBar extends SystemUI implements row.setRemoteInputController(mRemoteInputController); row.setOnExpandClickListener(this); - // Get the app name + // Get the app name. + // Note that Notification.Builder#bindHeaderAppName has similar logic + // but since this field is used in the guts, it must be accurate. + // Therefore we will only show the application label, or, failing that, the + // package name. No substitutions. final String pkg = sbn.getPackageName(); String appname = pkg; try { |