Don't accept resource references in string fields

Detect it when a developer accidentally uses @string/... in string fields
and log an error rather than publishing shortcuts with wrong values.

Bug 30140672

Change-Id: I98a60afd7f52282019a94a7a8c30a85ea4c7806b
diff --git a/services/core/java/com/android/server/pm/ShortcutParser.java b/services/core/java/com/android/server/pm/ShortcutParser.java
index 0762c0b..3f302d6 100644
--- a/services/core/java/com/android/server/pm/ShortcutParser.java
+++ b/services/core/java/com/android/server/pm/ShortcutParser.java
@@ -29,6 +29,7 @@
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.Slog;
+import android.util.TypedValue;
 import android.util.Xml;
 
 import com.android.internal.R;
@@ -260,7 +261,12 @@
         final TypedArray sa = service.mContext.getResources().obtainAttributes(attrs,
                 R.styleable.ShortcutCategories);
         try {
-            return sa.getString(R.styleable.ShortcutCategories_name);
+            if (sa.getType(R.styleable.ShortcutCategories_name) == TypedValue.TYPE_STRING) {
+                return sa.getNonResourceString(R.styleable.ShortcutCategories_name);
+            } else {
+                Log.w(TAG, "android:name for shortcut category must be string literal.");
+                return null;
+            }
         } finally {
             sa.recycle();
         }
@@ -272,7 +278,11 @@
         final TypedArray sa = service.mContext.getResources().obtainAttributes(attrs,
                 R.styleable.Shortcut);
         try {
-            final String id = sa.getString(R.styleable.Shortcut_shortcutId);
+            if (sa.getType(R.styleable.Shortcut_shortcutId) != TypedValue.TYPE_STRING) {
+                Log.w(TAG, "android:shortcutId must be string literal. activity=" + activity);
+                return null;
+            }
+            final String id = sa.getNonResourceString(R.styleable.Shortcut_shortcutId);
             final boolean enabled = sa.getBoolean(R.styleable.Shortcut_enabled, true);
             final int iconResId = sa.getResourceId(R.styleable.Shortcut_icon, 0);
             final int titleResId = sa.getResourceId(R.styleable.Shortcut_shortcutShortLabel, 0);
@@ -281,11 +291,11 @@
                     R.styleable.Shortcut_shortcutDisabledMessage, 0);
 
             if (TextUtils.isEmpty(id)) {
-                Slog.w(TAG, "Shortcut ID must be provided. activity=" + activity);
+                Log.w(TAG, "android:shortcutId must be provided. activity=" + activity);
                 return null;
             }
             if (titleResId == 0) {
-                Slog.w(TAG, "Shortcut title must be provided. activity=" + activity);
+                Log.w(TAG, "android:shortcutShortLabel must be provided. activity=" + activity);
                 return null;
             }