diff options
| author | 2016-04-14 13:53:18 +0000 | |
|---|---|---|
| committer | 2016-04-14 13:53:19 +0000 | |
| commit | 3af45bd2d06303bfaf8ba28324ca976e6f96ece3 (patch) | |
| tree | c77de979d92080491bf59dc2fddd824c0ddb8b1e | |
| parent | cd8f2737cc550ef1461c74a5c748777fa0c97379 (diff) | |
| parent | 732bd6cb2736c9ae091f2b5b136570fc5d579224 (diff) | |
Merge "Allow system apps to substitute a different app name in notifications." into nyc-dev
| -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 {  |