Merge "Clean up unused resources" into klp-dev
diff --git a/Android.mk b/Android.mk
index 8bc4d5d..0957fae 100644
--- a/Android.mk
+++ b/Android.mk
@@ -653,7 +653,7 @@
 
 ## SDK version identifiers used in the published docs
   # major[.minor] version for current SDK. (full releases only)
-framework_docs_SDK_VERSION:=4.3
+framework_docs_SDK_VERSION:=4.4
   # release version (ie "Release x")  (full releases only)
 framework_docs_SDK_REL_ID:=1
 
diff --git a/api/current.txt b/api/current.txt
index 81aec5e..9251d39 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -1226,6 +1226,8 @@
     field public static final int windowTitleBackgroundStyle = 16842844; // 0x101005c
     field public static final int windowTitleSize = 16842842; // 0x101005a
     field public static final int windowTitleStyle = 16842843; // 0x101005b
+    field public static final int windowTranslucentNavigation = 16843760; // 0x10103f0
+    field public static final int windowTranslucentStatus = 16843759; // 0x10103ef
     field public static final int writePermission = 16842760; // 0x1010008
     field public static final int x = 16842924; // 0x10100ac
     field public static final int xlargeScreens = 16843455; // 0x10102bf
@@ -1758,10 +1760,12 @@
     field public static final int Theme_DeviceDefault_Light_NoActionBar = 16974124; // 0x103012c
     field public static final int Theme_DeviceDefault_Light_NoActionBar_Fullscreen = 16974125; // 0x103012d
     field public static final int Theme_DeviceDefault_Light_NoActionBar_Overscan = 16974304; // 0x10301e0
+    field public static final int Theme_DeviceDefault_Light_NoActionBar_TranslucentDecor = 16974308; // 0x10301e4
     field public static final int Theme_DeviceDefault_Light_Panel = 16974139; // 0x103013b
     field public static final int Theme_DeviceDefault_NoActionBar = 16974121; // 0x1030129
     field public static final int Theme_DeviceDefault_NoActionBar_Fullscreen = 16974122; // 0x103012a
     field public static final int Theme_DeviceDefault_NoActionBar_Overscan = 16974303; // 0x10301df
+    field public static final int Theme_DeviceDefault_NoActionBar_TranslucentDecor = 16974307; // 0x10301e3
     field public static final int Theme_DeviceDefault_Panel = 16974138; // 0x103013a
     field public static final int Theme_DeviceDefault_Wallpaper = 16974140; // 0x103013c
     field public static final int Theme_DeviceDefault_Wallpaper_NoTitleBar = 16974141; // 0x103013d
@@ -1785,10 +1789,12 @@
     field public static final int Theme_Holo_Light_NoActionBar = 16974064; // 0x10300f0
     field public static final int Theme_Holo_Light_NoActionBar_Fullscreen = 16974065; // 0x10300f1
     field public static final int Theme_Holo_Light_NoActionBar_Overscan = 16974302; // 0x10301de
+    field public static final int Theme_Holo_Light_NoActionBar_TranslucentDecor = 16974306; // 0x10301e2
     field public static final int Theme_Holo_Light_Panel = 16973948; // 0x103007c
     field public static final int Theme_Holo_NoActionBar = 16973932; // 0x103006c
     field public static final int Theme_Holo_NoActionBar_Fullscreen = 16973933; // 0x103006d
     field public static final int Theme_Holo_NoActionBar_Overscan = 16974301; // 0x10301dd
+    field public static final int Theme_Holo_NoActionBar_TranslucentDecor = 16974305; // 0x10301e1
     field public static final int Theme_Holo_Panel = 16973947; // 0x103007b
     field public static final int Theme_Holo_Wallpaper = 16973949; // 0x103007d
     field public static final int Theme_Holo_Wallpaper_NoTitleBar = 16973950; // 0x103007e
@@ -7249,6 +7255,7 @@
     method public abstract java.util.List<android.content.pm.InstrumentationInfo> queryInstrumentation(java.lang.String, int);
     method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentActivities(android.content.Intent, int);
     method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], android.content.Intent, int);
+    method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentContentProviders(android.content.Intent, int);
     method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentServices(android.content.Intent, int);
     method public abstract java.util.List<android.content.pm.PermissionInfo> queryPermissionsByGroup(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
     method public abstract deprecated void removePackageFromPreferred(java.lang.String);
@@ -7277,6 +7284,7 @@
     field public static final java.lang.String FEATURE_CAMERA_AUTOFOCUS = "android.hardware.camera.autofocus";
     field public static final java.lang.String FEATURE_CAMERA_FLASH = "android.hardware.camera.flash";
     field public static final java.lang.String FEATURE_CAMERA_FRONT = "android.hardware.camera.front";
+    field public static final java.lang.String FEATURE_CONSUMER_IR = "android.hardware.consumerir";
     field public static final java.lang.String FEATURE_DEVICE_ADMIN = "android.software.device_admin";
     field public static final java.lang.String FEATURE_FAKETOUCH = "android.hardware.faketouch";
     field public static final java.lang.String FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT = "android.hardware.faketouch.multitouch.distinct";
@@ -7413,6 +7421,7 @@
     ctor public ProviderInfo();
     ctor public ProviderInfo(android.content.pm.ProviderInfo);
     method public int describeContents();
+    method public void dump(android.util.Printer, java.lang.String);
     field public static final android.os.Parcelable.Creator CREATOR;
     field public static final int FLAG_SINGLE_USER = 1073741824; // 0x40000000
     field public java.lang.String authority;
@@ -7446,6 +7455,7 @@
     field public java.lang.CharSequence nonLocalizedLabel;
     field public int preferredOrder;
     field public int priority;
+    field public android.content.pm.ProviderInfo providerInfo;
     field public java.lang.String resolvePackageName;
     field public android.content.pm.ServiceInfo serviceInfo;
     field public int specificIndex;
@@ -13352,34 +13362,29 @@
   }
 
   public final class RemoteController {
-    ctor public RemoteController(android.content.Context) throws java.lang.IllegalArgumentException;
-    ctor public RemoteController(android.content.Context, android.os.Looper) throws java.lang.IllegalArgumentException;
-    method public int clearArtworkConfiguration();
+    ctor public RemoteController(android.content.Context, android.media.RemoteController.OnClientUpdateListener) throws java.lang.IllegalArgumentException;
+    ctor public RemoteController(android.content.Context, android.media.RemoteController.OnClientUpdateListener, android.os.Looper) throws java.lang.IllegalArgumentException;
+    method public boolean clearArtworkConfiguration();
     method public android.media.RemoteController.MetadataEditor editMetadata();
     method public long getEstimatedMediaPosition();
-    method public int seekTo(long);
-    method public int sendMediaKeyEvent(android.view.KeyEvent);
-    method public int setArtworkConfiguration(int, int);
-    method public void setOnClientUpdateListener(android.media.RemoteController.OnClientUpdateListener);
-    method public int setSynchronizationMode(int);
-    field public static final int ERROR = -1; // 0xffffffff
-    field public static final int ERROR_BAD_VALUE = -2; // 0xfffffffe
+    method public boolean seekTo(long) throws java.lang.IllegalArgumentException;
+    method public boolean sendMediaKeyEvent(android.view.KeyEvent) throws java.lang.IllegalArgumentException;
+    method public boolean setArtworkConfiguration(int, int) throws java.lang.IllegalArgumentException;
+    method public boolean setSynchronizationMode(int) throws java.lang.IllegalArgumentException;
     field public static final int POSITION_SYNCHRONIZATION_CHECK = 1; // 0x1
     field public static final int POSITION_SYNCHRONIZATION_NONE = 0; // 0x0
-    field public static final int SUCCESS = 0; // 0x0
   }
 
   public class RemoteController.MetadataEditor extends android.media.MediaMetadataEditor {
     method public synchronized void apply();
   }
 
-  public static abstract class RemoteController.OnClientUpdateListener {
-    ctor public RemoteController.OnClientUpdateListener();
-    method public void onClientChange(boolean);
-    method public void onClientMetadataUpdate(android.media.RemoteController.MetadataEditor);
-    method public void onClientPlaybackStateUpdate(int);
-    method public void onClientPlaybackStateUpdate(int, long, long, float);
-    method public void onClientTransportControlUpdate(int);
+  public static abstract interface RemoteController.OnClientUpdateListener {
+    method public abstract void onClientChange(boolean);
+    method public abstract void onClientMetadataUpdate(android.media.RemoteController.MetadataEditor);
+    method public abstract void onClientPlaybackStateUpdate(int);
+    method public abstract void onClientPlaybackStateUpdate(int, long, long, float);
+    method public abstract void onClientTransportControlUpdate(int);
   }
 
   public final class ResourceBusyException extends android.media.MediaDrmException {
@@ -19302,7 +19307,7 @@
     field public static final android.print.PrintAttributes.MediaSize OM_PA_KAI;
     field public static final android.print.PrintAttributes.MediaSize PRC_1;
     field public static final android.print.PrintAttributes.MediaSize PRC_10;
-    field public static final android.print.PrintAttributes.MediaSize PRC_16k;
+    field public static final android.print.PrintAttributes.MediaSize PRC_16K;
     field public static final android.print.PrintAttributes.MediaSize PRC_2;
     field public static final android.print.PrintAttributes.MediaSize PRC_3;
     field public static final android.print.PrintAttributes.MediaSize PRC_4;
@@ -19367,12 +19372,6 @@
     method public android.print.PrintDocumentInfo.Builder setPageCount(int);
   }
 
-  public class PrintFileDocumentAdapter extends android.print.PrintDocumentAdapter {
-    ctor public PrintFileDocumentAdapter(android.content.Context, java.io.File, android.print.PrintDocumentInfo);
-    method public void onLayout(android.print.PrintAttributes, android.print.PrintAttributes, android.os.CancellationSignal, android.print.PrintDocumentAdapter.LayoutResultCallback, android.os.Bundle);
-    method public void onWrite(android.print.PageRange[], android.os.ParcelFileDescriptor, android.os.CancellationSignal, android.print.PrintDocumentAdapter.WriteResultCallback);
-  }
-
   public final class PrintJob {
     method public void cancel();
     method public android.print.PrintJobId getId();
@@ -19402,10 +19401,8 @@
     method public android.print.PageRange[] getPages();
     method public android.print.PrinterId getPrinterId();
     method public int getState();
-    method public java.lang.String getTag();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator CREATOR;
-    field public static final int PRINT_JOB_ID_UNDEFINED = -1; // 0xffffffff
     field public static final int STATE_BLOCKED = 4; // 0x4
     field public static final int STATE_CANCELED = 7; // 0x7
     field public static final int STATE_COMPLETED = 5; // 0x5
@@ -19500,6 +19497,7 @@
     method public android.printservice.PrintDocument getDocument();
     method public android.print.PrintJobId getId();
     method public android.print.PrintJobInfo getInfo();
+    method public java.lang.String getTag();
     method public boolean isBlocked();
     method public boolean isCancelled();
     method public boolean isCompleted();
@@ -20987,6 +20985,7 @@
     field public static final java.lang.String EXTRA_ERROR = "error";
     field public static final java.lang.String EXTRA_INFO = "info";
     field public static final java.lang.String EXTRA_LOADING = "loading";
+    field public static final java.lang.String PROVIDER_INTERFACE = "android.content.action.DOCUMENTS_PROVIDER";
   }
 
   public static final class DocumentsContract.Document {
@@ -24482,6 +24481,7 @@
     method public java.util.List<android.content.pm.InstrumentationInfo> queryInstrumentation(java.lang.String, int);
     method public java.util.List<android.content.pm.ResolveInfo> queryIntentActivities(android.content.Intent, int);
     method public java.util.List<android.content.pm.ResolveInfo> queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], android.content.Intent, int);
+    method public java.util.List<android.content.pm.ResolveInfo> queryIntentContentProviders(android.content.Intent, int);
     method public java.util.List<android.content.pm.ResolveInfo> queryIntentServices(android.content.Intent, int);
     method public java.util.List<android.content.pm.PermissionInfo> queryPermissionsByGroup(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
     method public void removePackageFromPreferred(java.lang.String);
@@ -28401,8 +28401,6 @@
     field public static final int SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 512; // 0x200
     field public static final int SYSTEM_UI_FLAG_LAYOUT_STABLE = 256; // 0x100
     field public static final int SYSTEM_UI_FLAG_LOW_PROFILE = 1; // 0x1
-    field public static final int SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION = 8192; // 0x2000
-    field public static final int SYSTEM_UI_FLAG_TRANSPARENT_STATUS = 4096; // 0x1000
     field public static final int SYSTEM_UI_FLAG_VISIBLE = 0; // 0x0
     field public static final int SYSTEM_UI_LAYOUT_FLAGS = 1536; // 0x600
     field public static final int TEXT_ALIGNMENT_CENTER = 4; // 0x4
@@ -29138,6 +29136,8 @@
     field public static final int FLAG_SHOW_WHEN_LOCKED = 524288; // 0x80000
     field public static final int FLAG_SPLIT_TOUCH = 8388608; // 0x800000
     field public static final int FLAG_TOUCHABLE_WHEN_WAKING = 64; // 0x40
+    field public static final int FLAG_TRANSLUCENT_NAVIGATION = 134217728; // 0x8000000
+    field public static final int FLAG_TRANSLUCENT_STATUS = 67108864; // 0x4000000
     field public static final int FLAG_TURN_SCREEN_ON = 2097152; // 0x200000
     field public static final int FLAG_WATCH_OUTSIDE_TOUCH = 262144; // 0x40000
     field public static final int FORMAT_CHANGED = 8; // 0x8
diff --git a/cmds/media/src/com/android/commands/media/Media.java b/cmds/media/src/com/android/commands/media/Media.java
index 56af7d6..92c6a51 100644
--- a/cmds/media/src/com/android/commands/media/Media.java
+++ b/cmds/media/src/com/android/commands/media/Media.java
@@ -140,6 +140,11 @@
         }
 
         @Override
+        public void setEnabled(boolean enabled) {
+            System.out.println("New enable state= " + (enabled ? "enabled" : "disabled"));
+        }
+
+        @Override
         public void setPlaybackState(int generationId, int state, long stateChangeTimeMs,
                 long currentPosMs, float speed) {
             System.out.println("New state: id=" + generationId + " state=" + state
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 55c66726..b505d4f 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -585,6 +585,22 @@
     }
 
     @Override
+    public List<ResolveInfo> queryIntentContentProvidersAsUser(
+            Intent intent, int flags, int userId) {
+        try {
+            return mPM.queryIntentContentProviders(intent,
+                    intent.resolveTypeIfNeeded(mContext.getContentResolver()), flags, userId);
+        } catch (RemoteException e) {
+            throw new RuntimeException("Package manager has died", e);
+        }
+    }
+
+    @Override
+    public List<ResolveInfo> queryIntentContentProviders(Intent intent, int flags) {
+        return queryIntentContentProvidersAsUser(intent, flags, mContext.getUserId());
+    }
+
+    @Override
     public ProviderInfo resolveContentProvider(String name,
                                                int flags) {
         try {
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index acd4ffa..267fb2a 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -123,6 +123,9 @@
     List<ResolveInfo> queryIntentServices(in Intent intent,
             String resolvedType, int flags, int userId);
 
+    List<ResolveInfo> queryIntentContentProviders(in Intent intent,
+            String resolvedType, int flags, int userId);
+
     /**
      * This implements getInstalledPackages via a "last returned row"
      * mechanism that is not exposed in the API. This is to get around the IPC
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 9203af9..8b8c58b 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -915,6 +915,14 @@
 
     /**
      * Feature for {@link #getSystemAvailableFeatures} and
+     * {@link #hasSystemFeature}: The device is capable of communicating with
+     * consumer IR devices.
+     */
+    @SdkConstant(SdkConstantType.FEATURE)
+    public static final String FEATURE_CONSUMER_IR = "android.hardware.consumerir";
+
+    /**
+     * Feature for {@link #getSystemAvailableFeatures} and
      * {@link #hasSystemFeature}: The device supports one or more methods of
      * reporting current location.
      */
@@ -2202,6 +2210,24 @@
     public abstract List<ResolveInfo> queryIntentServicesAsUser(Intent intent,
             int flags, int userId);
 
+    /** {@hide} */
+    public abstract List<ResolveInfo> queryIntentContentProvidersAsUser(
+            Intent intent, int flags, int userId);
+
+    /**
+     * Retrieve all providers that can match the given intent.
+     *
+     * @param intent An intent containing all of the desired specification
+     *            (action, data, type, category, and/or component).
+     * @param flags Additional option flags.
+     * @return A List&lt;ResolveInfo&gt; containing one entry for each matching
+     *         ProviderInfo. These are ordered from best to worst match. If
+     *         there are no matching providers, an empty list is returned.
+     * @see #GET_INTENT_FILTERS
+     * @see #GET_RESOLVED_FILTER
+     */
+    public abstract List<ResolveInfo> queryIntentContentProviders(Intent intent, int flags);
+
     /**
      * Find a single content provider by its base path name.
      *
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index b489ee9e..17d13e5 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -2819,7 +2819,14 @@
                 continue;
             }
 
-            if (parser.getName().equals("meta-data")) {
+            if (parser.getName().equals("intent-filter")) {
+                ProviderIntentInfo intent = new ProviderIntentInfo(outInfo);
+                if (!parseIntent(res, parser, attrs, true, intent, outError)) {
+                    return false;
+                }
+                outInfo.intents.add(intent);
+
+            } else if (parser.getName().equals("meta-data")) {
                 if ((outInfo.metaData=parseMetaData(res, parser, attrs,
                         outInfo.metaData, outError)) == null) {
                     return false;
@@ -3982,7 +3989,7 @@
         return si;
     }
 
-    public final static class Provider extends Component {
+    public final static class Provider extends Component<ProviderIntentInfo> {
         public final ProviderInfo info;
         public boolean syncable;
 
@@ -4116,6 +4123,24 @@
         }
     }
 
+    public static final class ProviderIntentInfo extends IntentInfo {
+        public final Provider provider;
+
+        public ProviderIntentInfo(Provider provider) {
+            this.provider = provider;
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder(128);
+            sb.append("ProviderIntentInfo{");
+            sb.append(Integer.toHexString(System.identityHashCode(this)));
+            sb.append(' ');
+            provider.appendComponentShortName(sb);
+            sb.append('}');
+            return sb.toString();
+        }
+    }
+
     /**
      * @hide
      */
diff --git a/core/java/android/content/pm/ProviderInfo.java b/core/java/android/content/pm/ProviderInfo.java
index a534176..f6ea058 100644
--- a/core/java/android/content/pm/ProviderInfo.java
+++ b/core/java/android/content/pm/ProviderInfo.java
@@ -19,6 +19,7 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.os.PatternMatcher;
+import android.util.Printer;
 
 /**
  * Holds information about a specific
@@ -112,7 +113,13 @@
         flags = orig.flags;
         isSyncable = orig.isSyncable;
     }
-    
+
+    public void dump(Printer pw, String prefix) {
+        super.dumpFront(pw, prefix);
+        pw.println(prefix + "authority=" + authority);
+        pw.println(prefix + "flags=0x" + Integer.toHexString(flags));
+    }
+
     public int describeContents() {
         return 0;
     }
diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java
index e360e40..1ff41c0 100644
--- a/core/java/android/content/pm/ResolveInfo.java
+++ b/core/java/android/content/pm/ResolveInfo.java
@@ -23,6 +23,7 @@
 import android.os.Parcelable;
 import android.text.TextUtils;
 import android.util.Printer;
+import android.util.Slog;
 
 import java.text.Collator;
 import java.util.Comparator;
@@ -34,20 +35,30 @@
  * &lt;intent&gt; tags.
  */
 public class ResolveInfo implements Parcelable {
+    private static final String TAG = "ResolveInfo";
+
     /**
-     * The activity or broadcast receiver that corresponds to this resolution match,
-     * if this resolution is for an activity or broadcast receiver. One and only one of this and
-     * serviceInfo must be non-null.
+     * The activity or broadcast receiver that corresponds to this resolution
+     * match, if this resolution is for an activity or broadcast receiver.
+     * Exactly one of {@link #activityInfo}, {@link #serviceInfo}, or
+     * {@link #providerInfo} will be non-null.
      */
     public ActivityInfo activityInfo;
     
     /**
-     * The service that corresponds to this resolution match, if this
-     * resolution is for a service. One and only one of this and
-     * activityInfo must be non-null.
+     * The service that corresponds to this resolution match, if this resolution
+     * is for a service. Exactly one of {@link #activityInfo},
+     * {@link #serviceInfo}, or {@link #providerInfo} will be non-null.
      */
     public ServiceInfo serviceInfo;
-    
+
+    /**
+     * The provider that corresponds to this resolution match, if this
+     * resolution is for a provider. Exactly one of {@link #activityInfo},
+     * {@link #serviceInfo}, or {@link #providerInfo} will be non-null.
+     */
+    public ProviderInfo providerInfo;
+
     /**
      * The IntentFilter that was matched for this ResolveInfo.
      */
@@ -120,6 +131,13 @@
      */
     public boolean system;
 
+    private ComponentInfo getComponentInfo() {
+        if (activityInfo != null) return activityInfo;
+        if (serviceInfo != null) return serviceInfo;
+        if (providerInfo != null) return providerInfo;
+        throw new IllegalStateException("Missing ComponentInfo!");
+    }
+
     /**
      * Retrieve the current textual label associated with this resolution.  This
      * will call back on the given PackageManager to load the label from
@@ -142,7 +160,7 @@
                 return label.toString().trim();
             }
         }
-        ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo;
+        ComponentInfo ci = getComponentInfo();
         ApplicationInfo ai = ci.applicationInfo;
         if (labelRes != 0) {
             label = pm.getText(ci.packageName, labelRes, ai);
@@ -176,7 +194,7 @@
                 return dr;
             }
         }
-        ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo;
+        ComponentInfo ci = getComponentInfo();
         ApplicationInfo ai = ci.applicationInfo;
         if (icon != 0) {
             dr = pm.getDrawable(ci.packageName, icon, ai);
@@ -196,8 +214,8 @@
      */
     public final int getIconResource() {
         if (icon != 0) return icon;
-        if (activityInfo != null) return activityInfo.getIconResource();
-        if (serviceInfo != null) return serviceInfo.getIconResource();
+        final ComponentInfo ci = getComponentInfo();
+        if (ci != null) return ci.getIconResource();
         return 0;
     }
 
@@ -225,6 +243,9 @@
         } else if (serviceInfo != null) {
             pw.println(prefix + "ServiceInfo:");
             serviceInfo.dump(pw, prefix + "  ");
+        } else if (providerInfo != null) {
+            pw.println(prefix + "ProviderInfo:");
+            providerInfo.dump(pw, prefix + "  ");
         }
     }
     
@@ -234,6 +255,7 @@
     public ResolveInfo(ResolveInfo orig) {
         activityInfo = orig.activityInfo;
         serviceInfo = orig.serviceInfo;
+        providerInfo = orig.providerInfo;
         filter = orig.filter;
         priority = orig.priority;
         preferredOrder = orig.preferredOrder;
@@ -247,7 +269,7 @@
     }
 
     public String toString() {
-        ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo;
+        final ComponentInfo ci = getComponentInfo();
         StringBuilder sb = new StringBuilder(128);
         sb.append("ResolveInfo{");
         sb.append(Integer.toHexString(System.identityHashCode(this)));
@@ -278,6 +300,9 @@
         } else if (serviceInfo != null) {
             dest.writeInt(2);
             serviceInfo.writeToParcel(dest, parcelableFlags);
+        } else if (providerInfo != null) {
+            dest.writeInt(3);
+            providerInfo.writeToParcel(dest, parcelableFlags);
         } else {
             dest.writeInt(0);
         }
@@ -309,18 +334,21 @@
     };
 
     private ResolveInfo(Parcel source) {
+        activityInfo = null;
+        serviceInfo = null;
+        providerInfo = null;
         switch (source.readInt()) {
             case 1:
                 activityInfo = ActivityInfo.CREATOR.createFromParcel(source);
-                serviceInfo = null;
                 break;
             case 2:
                 serviceInfo = ServiceInfo.CREATOR.createFromParcel(source);
-                activityInfo = null;
+                break;
+            case 3:
+                providerInfo = ProviderInfo.CREATOR.createFromParcel(source);
                 break;
             default:
-                activityInfo = null;
-                serviceInfo = null;
+                Slog.w(TAG, "Missing ComponentInfo!");
                 break;
         }
         if (source.readInt() != 0) {
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index 85fa7d6..4fe2c4d 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -487,6 +487,12 @@
      * Gain factor from electrons to raw units when
      * ISO=100
      * </p>
+     *
+     * <b>Optional</b> - This value may be null on some devices.
+     *
+     * <b>{@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL}</b> -
+     * Present on all devices that report being FULL level hardware devices in the
+     * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL HARDWARE_LEVEL} key.
      */
     public static final Key<Rational> SENSOR_BASE_GAIN_FACTOR =
             new Key<Rational>("android.sensor.baseGainFactor", Rational.class);
@@ -502,6 +508,12 @@
      * values above this, it can be a mix of analog and
      * digital
      * </p>
+     *
+     * <b>Optional</b> - This value may be null on some devices.
+     *
+     * <b>{@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL}</b> -
+     * Present on all devices that report being FULL level hardware devices in the
+     * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL HARDWARE_LEVEL} key.
      */
     public static final Key<Integer> SENSOR_MAX_ANALOG_SENSITIVITY =
             new Key<Integer>("android.sensor.maxAnalogSensitivity", int.class);
diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java
index a9a72b0..7095e4d 100644
--- a/core/java/android/hardware/camera2/CameraDevice.java
+++ b/core/java/android/hardware/camera2/CameraDevice.java
@@ -197,26 +197,33 @@
      * if the format is user-visible, it must be one of android.scaler.availableFormats;
      * and the size must be one of android.scaler.available[Processed|Jpeg]Sizes).</p>
      *
-     * <p>To change the output, the camera device must be idle. The device is considered
-     * to be idle once all in-flight and pending capture requests have been processed,
-     * and all output image buffers from the captures have been sent to their destination
-     * Surfaces.</p>
+     * <p>When this method is called with valid Surfaces, the device will transition to the {@link
+     * StateListener#onBusy busy state}. Once configuration is complete, the device will transition
+     * into the {@link StateListener#onIdle idle state}. Capture requests using the newly-configured
+     * Surfaces may then be submitted with {@link #capture}, {@link #captureBurst}, {@link
+     * #setRepeatingRequest}, or {@link #setRepeatingBurst}.</p>
      *
-     * <p>To reach an idle state without cancelling any submitted captures, first
-     * stop any repeating request/burst with {@link #stopRepeating}, and then
-     * wait for the {@link StateListener#onIdle} callback to be
-     * called. To idle as fast as possible, use {@link #flush} and wait for the
-     * idle callback.</p>
+     * <p>If this method is called while the camera device is still actively processing previously
+     * submitted captures, then the following sequence of events occurs: The device transitions to
+     * the busy state and calls the {@link StateListener#onBusy} callback. Second, if a repeating
+     * request is set it is cleared.  Third, the device finishes up all in-flight and pending
+     * requests. Finally, once the device is idle, it then reconfigures its outputs, and calls the
+     * {@link StateListener#onIdle} method once it is again ready to accept capture
+     * requests. Therefore, no submitted work is discarded. To idle as fast as possible, use {@link
+     * #flush} and wait for the idle callback before calling configureOutputs. This will discard
+     * work, but reaches the new configuration sooner.</p>
      *
      * <p>Using larger resolution outputs, or more outputs, can result in slower
      * output rate from the device.</p>
      *
-     * <p>Configuring the outputs with an empty or null list will transition
-     * the camera into an {@link StateListener#onUnconfigured unconfigured state}.
-     * </p>
+     * <p>Configuring the outputs with an empty or null list will transition the camera into an
+     * {@link StateListener#onUnconfigured unconfigured state} instead of the {@link
+     * StateListener#onIdle idle state}.  </p>
      *
      * <p>Calling configureOutputs with the same arguments as the last call to
-     * configureOutputs has no effect.</p>
+     * configureOutputs has no effect, and the {@link StateListener#onBusy busy}
+     * and {@link StateListener#onIdle idle} state transitions will happen
+     * immediately.</p>
      *
      * @param outputs The new set of Surfaces that should be made available as
      * targets for captured image data.
@@ -228,7 +235,10 @@
      * @throws IllegalStateException if the camera device is not idle, or
      *                               if the camera device has been closed
      *
+     * @see StateListener#onBusy
      * @see StateListener#onIdle
+     * @see StateListener#onActive
+     * @see StateListener#onUnconfigured
      * @see #stopRepeating
      * @see #flush
      */
@@ -516,31 +526,6 @@
     public void waitUntilIdle() throws CameraAccessException;
 
     /**
-     * Set the listener object to call when an asynchronous device event occurs,
-     * such as errors or idle notifications.
-     *
-     * <p>The events reported here are device-wide; notifications about
-     * individual capture requests or capture results are reported through
-     * {@link CaptureListener}.</p>
-     *
-     * <p>If the camera device is idle when the listener is set, then the
-     * {@link StateListener#onIdle} method will be immediately called,
-     * even if the device has never been active before.
-     * </p>
-     *
-     * @param listener the CameraDeviceListener to send device-level event
-     * notifications to. Setting this to null will stop notifications.
-     * @param handler the handler on which the listener should be invoked, or
-     * {@code null} to use the current thread's {@link android.os.Looper looper}.
-     *
-     * @throws IllegalArgumentException if handler is null, the listener is
-     * not null, and the calling thread has no looper
-     *
-     * @hide
-     */
-    public void setDeviceListener(StateListener listener, Handler handler);
-
-    /**
      * Flush all captures currently pending and in-progress as fast as
      * possible.
      *
@@ -577,13 +562,24 @@
     public void flush() throws CameraAccessException;
 
     /**
-     * Close the connection to this camera device. After this call, all calls to
+     * Close the connection to this camera device.
+     *
+     * <p>After this call, all calls to
      * the camera device interface will throw a {@link IllegalStateException},
-     * except for calls to close().
+     * except for calls to close(). Once the device has fully shut down, the
+     * {@link StateListener#onClosed} callback will be called, and the camera is
+     * free to be re-opened.</p>
+     *
+     * <p>After this call, besides the final {@link StateListener#onClosed} call, no calls to the
+     * device's {@link StateListener} will occur, and any remaining submitted capture requests will
+     * not fire their {@link CaptureListener} callbacks.</p>
+     *
+     * <p>To shut down as fast as possible, call the {@link #flush} method and then {@link #close}
+     * once the flush completes. This will discard some capture requests, but results in faster
+     * shutdown.</p>
      */
     @Override
     public void close();
-    // TODO: We should decide on the behavior of in-flight requests should be on close.
 
     /**
      * <p>A listener for tracking the progress of a {@link CaptureRequest}
@@ -713,6 +709,9 @@
      * A listener for notifications about the state of a camera
      * device.
      *
+     * <p>A listener must be provided to the {@link CameraManager#openCamera}
+     * method to open a camera device.</p>
+     *
      * <p>These events include notifications about the device becoming idle (
      * allowing for {@link #configureOutputs} to be called), about device
      * disconnection, and about unexpected device errors.</p>
@@ -722,7 +721,7 @@
      * the {@link #capture}, {@link #captureBurst}, {@link
      * #setRepeatingRequest}, or {@link #setRepeatingBurst} methods.
      *
-     * @see #setDeviceListener
+     * @see CameraManager#openCamera
      */
     public static abstract class StateListener {
        /**
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index f5ee367..65b6c7a 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -197,6 +197,8 @@
      * {@link #openCamera}.
      *
      * @param cameraId The unique identifier of the camera device to open
+     * @param listener The listener for the camera. Must not be null.
+     * @param handler  The handler to call the listener on. Must not be null.
      *
      * @throws CameraAccessException if the camera is disabled by device policy,
      * or too many camera devices are already open, or the cameraId does not match
@@ -204,11 +206,14 @@
      *
      * @throws SecurityException if the application does not have permission to
      * access the camera
+     * @throws IllegalArgumentException if listener or handler is null.
      *
      * @see #getCameraIdList
      * @see android.app.admin.DevicePolicyManager#setCameraDisabled
      */
-    private CameraDevice openCamera(String cameraId) throws CameraAccessException {
+    private void openCameraDeviceUserAsync(String cameraId,
+            CameraDevice.StateListener listener, Handler handler)
+            throws CameraAccessException {
         try {
 
             synchronized (mLock) {
@@ -216,7 +221,10 @@
                 ICameraDeviceUser cameraUser;
 
                 android.hardware.camera2.impl.CameraDevice device =
-                        new android.hardware.camera2.impl.CameraDevice(cameraId);
+                        new android.hardware.camera2.impl.CameraDevice(
+                                cameraId,
+                                listener,
+                                handler);
 
                 BinderHolder holder = new BinderHolder();
                 mCameraService.connectDevice(device.getCallbacks(),
@@ -225,10 +233,9 @@
                 cameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder());
 
                 // TODO: factor out listener to be non-nested, then move setter to constructor
+                // For now, calling setRemoteDevice will fire initial
+                // onOpened/onUnconfigured callbacks.
                 device.setRemoteDevice(cameraUser);
-
-                return device;
-
             }
 
         } catch (NumberFormatException e) {
@@ -238,7 +245,6 @@
             throw e.asChecked();
         } catch (RemoteException e) {
             // impossible
-            return null;
         }
     }
 
@@ -303,16 +309,7 @@
             }
         }
 
-        final CameraDevice camera = openCamera(cameraId);
-        camera.setDeviceListener(listener, handler);
-
-        // TODO: make truly async in the camera service
-        handler.post(new Runnable() {
-            @Override
-            public void run() {
-                listener.onOpened(camera);
-            }
-        });
+        openCameraDeviceUserAsync(cameraId, listener, handler);
     }
 
     /**
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index c9626f1..dbd0457 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -60,11 +60,6 @@
 
     @Override
     public <T> T get(Key<T> key) {
-        if (key == STATISTICS_FACES) { // Don't throw IllegalArgumentException
-            // TODO: Implement android.statistics.faces
-            return null;
-        }
-
         return mResults.get(key);
     }
 
@@ -727,6 +722,12 @@
      * The thermal diode being queried should be inside the sensor PCB, or
      * somewhere close to it.
      * </p>
+     *
+     * <b>Optional</b> - This value may be null on some devices.
+     *
+     * <b>{@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL}</b> -
+     * Present on all devices that report being FULL level hardware devices in the
+     * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL HARDWARE_LEVEL} key.
      */
     public static final Key<Float> SENSOR_TEMPERATURE =
             new Key<Float>("android.sensor.temperature", float.class);
diff --git a/core/java/android/hardware/camera2/Face.java b/core/java/android/hardware/camera2/Face.java
index ef068ca..ded8839d 100644
--- a/core/java/android/hardware/camera2/Face.java
+++ b/core/java/android/hardware/camera2/Face.java
@@ -58,6 +58,9 @@
      * Create a new face with all fields set.
      *
      * <p>The id, leftEyePosition, rightEyePosition, and mouthPosition are considered optional.
+     * They are only required when the {@link CaptureResult} reports that the value of key
+     * {@link CaptureResult#STATISTICS_FACE_DETECT_MODE} is
+     * {@link CameraMetadata#STATISTICS_FACE_DETECT_MODE_FULL}.
      * If the id is {@value #ID_UNSUPPORTED} then the leftEyePosition, rightEyePosition, and
      * mouthPositions are guaranteed to be {@code null}. Otherwise, each of leftEyePosition,
      * rightEyePosition, and mouthPosition may be independently null or not-null.</p>
@@ -107,7 +110,11 @@
      * <p>The id, leftEyePosition, rightEyePosition, and mouthPosition are considered optional.
      * If the id is {@value #ID_UNSUPPORTED} then the leftEyePosition, rightEyePosition, and
      * mouthPositions are guaranteed to be {@code null}. Otherwise, each of leftEyePosition,
-     * rightEyePosition, and mouthPosition may be independently null or not-null.</p>
+     * rightEyePosition, and mouthPosition may be independently null or not-null. When devices
+     * report the value of key {@link CaptureResult#STATISTICS_FACE_DETECT_MODE} as
+     * {@link CameraMetadata#STATISTICS_FACE_DETECT_MODE_SIMPLE} in {@link CaptureResult},
+     * the face id of each face is expected to be {@value #ID_UNSUPPORTED}, the leftEyePosition,
+     * rightEyePosition, and mouthPositions are expected to be {@code null} for each face.</p>
      *
      * @param bounds Bounds of the face.
      * @param score Confidence level between {@value #SCORE_MIN}-{@value #SCORE_MAX}.
@@ -168,7 +175,10 @@
      * <p>This is an optional field, may not be supported on all devices.
      * If the id is {@value #ID_UNSUPPORTED} then the leftEyePosition, rightEyePosition, and
      * mouthPositions are guaranteed to be {@code null}. Otherwise, each of leftEyePosition,
-     * rightEyePosition, and mouthPosition may be independently null or not-null.</p>
+     * rightEyePosition, and mouthPosition may be independently null or not-null. When devices
+     * report the value of key {@link CaptureResult#STATISTICS_FACE_DETECT_MODE} as
+     * {@link CameraMetadata#STATISTICS_FACE_DETECT_MODE_SIMPLE} in {@link CaptureResult},
+     * the face id of each face is expected to be {@value #ID_UNSUPPORTED}.</p>
      *
      * <p>This value will either be {@value #ID_UNSUPPORTED} or
      * otherwise greater than {@code 0}.</p>
@@ -219,7 +229,7 @@
      * field, may not be supported on all devices. If not
      * supported, the value will always be set to null.
      * This value will  always be null only if {@link #getId()} returns
-     * {@value #ID_UNSUPPORTED}.</p> them are.
+     * {@value #ID_UNSUPPORTED}.</p>
      * </p>
      *
      * @return The mouth position, or {@code null} if unknown.
diff --git a/core/java/android/hardware/camera2/impl/CameraDevice.java b/core/java/android/hardware/camera2/impl/CameraDevice.java
index 463063c..c5d0999 100644
--- a/core/java/android/hardware/camera2/impl/CameraDevice.java
+++ b/core/java/android/hardware/camera2/impl/CameraDevice.java
@@ -55,8 +55,10 @@
     private final Object mLock = new Object();
     private final CameraDeviceCallbacks mCallbacks = new CameraDeviceCallbacks();
 
-    private StateListener mDeviceListener;
-    private Handler mDeviceHandler;
+    private final StateListener mDeviceListener;
+    private final Handler mDeviceHandler;
+
+    private boolean mIdle = true;
 
     private final SparseArray<CaptureListenerHolder> mCaptureListenerMap =
             new SparseArray<CaptureListenerHolder>();
@@ -67,8 +69,72 @@
 
     private final String mCameraId;
 
-    public CameraDevice(String cameraId) {
+    // Runnables for all state transitions, except error, which needs the
+    // error code argument
+
+    private final Runnable mCallOnOpened = new Runnable() {
+        public void run() {
+            if (!CameraDevice.this.isClosed()) {
+                mDeviceListener.onOpened(CameraDevice.this);
+            }
+        }
+    };
+
+    private final Runnable mCallOnUnconfigured = new Runnable() {
+        public void run() {
+            if (!CameraDevice.this.isClosed()) {
+                mDeviceListener.onUnconfigured(CameraDevice.this);
+            }
+        }
+    };
+
+    private final Runnable mCallOnActive = new Runnable() {
+        public void run() {
+            if (!CameraDevice.this.isClosed()) {
+                mDeviceListener.onActive(CameraDevice.this);
+            }
+        }
+    };
+
+    private final Runnable mCallOnBusy = new Runnable() {
+        public void run() {
+            if (!CameraDevice.this.isClosed()) {
+                mDeviceListener.onBusy(CameraDevice.this);
+            }
+        }
+    };
+
+    private final Runnable mCallOnClosed = new Runnable() {
+        public void run() {
+            if (!CameraDevice.this.isClosed()) {
+                mDeviceListener.onClosed(CameraDevice.this);
+            }
+        }
+    };
+
+    private final Runnable mCallOnIdle = new Runnable() {
+        public void run() {
+            if (!CameraDevice.this.isClosed()) {
+                mDeviceListener.onIdle(CameraDevice.this);
+            }
+        }
+    };
+
+    private final Runnable mCallOnDisconnected = new Runnable() {
+        public void run() {
+            if (!CameraDevice.this.isClosed()) {
+                mDeviceListener.onDisconnected(CameraDevice.this);
+            }
+        }
+    };
+
+    public CameraDevice(String cameraId, StateListener listener, Handler handler) {
+        if (cameraId == null || listener == null || handler == null) {
+            throw new IllegalArgumentException("Null argument given");
+        }
         mCameraId = cameraId;
+        mDeviceListener = listener;
+        mDeviceHandler = handler;
         TAG = String.format("CameraDevice-%s-JV", mCameraId);
         DEBUG = Log.isLoggable(TAG, Log.DEBUG);
     }
@@ -79,7 +145,12 @@
 
     public void setRemoteDevice(ICameraDeviceUser remoteDevice) {
         // TODO: Move from decorator to direct binder-mediated exceptions
-        mRemoteDevice = CameraBinderDecorator.newInstance(remoteDevice);
+        synchronized(mLock) {
+            mRemoteDevice = CameraBinderDecorator.newInstance(remoteDevice);
+
+            mDeviceHandler.post(mCallOnOpened);
+            mDeviceHandler.post(mCallOnUnconfigured);
+        }
     }
 
     @Override
@@ -89,7 +160,13 @@
 
     @Override
     public void configureOutputs(List<Surface> outputs) throws CameraAccessException {
+        // Treat a null input the same an empty list
+        if (outputs == null) {
+            outputs = new ArrayList<Surface>();
+        }
         synchronized (mLock) {
+            checkIfCameraClosed();
+
             HashSet<Surface> addSet = new HashSet<Surface>(outputs);    // Streams to create
             List<Integer> deleteList = new ArrayList<Integer>();        // Streams to delete
 
@@ -105,9 +182,13 @@
                 }
             }
 
-            try {
-                // TODO: mRemoteDevice.beginConfigure
+            mDeviceHandler.post(mCallOnBusy);
+            stopRepeating();
 
+            try {
+                mRemoteDevice.waitUntilIdle();
+
+                // TODO: mRemoteDevice.beginConfigure
                 // Delete all streams first (to free up HW resources)
                 for (Integer streamId : deleteList) {
                     mRemoteDevice.deleteStream(streamId);
@@ -126,7 +207,7 @@
             } catch (CameraRuntimeException e) {
                 if (e.getReason() == CAMERA_IN_USE) {
                     throw new IllegalStateException("The camera is currently busy." +
-                            " You must call waitUntilIdle before trying to reconfigure.");
+                            " You must wait until the previous operation completes.");
                 }
 
                 throw e.asChecked();
@@ -134,6 +215,12 @@
                 // impossible
                 return;
             }
+
+            if (outputs.size() > 0) {
+                mDeviceHandler.post(mCallOnIdle);
+            } else {
+                mDeviceHandler.post(mCallOnUnconfigured);
+            }
         }
     }
 
@@ -141,6 +228,7 @@
     public CaptureRequest.Builder createCaptureRequest(int templateType)
             throws CameraAccessException {
         synchronized (mLock) {
+            checkIfCameraClosed();
 
             CameraMetadataNative templatedRequest = new CameraMetadataNative();
 
@@ -188,7 +276,7 @@
         }
 
         synchronized (mLock) {
-
+            checkIfCameraClosed();
             int requestId;
 
             try {
@@ -208,6 +296,11 @@
                 mRepeatingRequestIdStack.add(requestId);
             }
 
+            if (mIdle) {
+                mDeviceHandler.post(mCallOnActive);
+            }
+            mIdle = false;
+
             return requestId;
         }
     }
@@ -233,7 +326,7 @@
     public void stopRepeating() throws CameraAccessException {
 
         synchronized (mLock) {
-
+            checkIfCameraClosed();
             while (!mRepeatingRequestIdStack.isEmpty()) {
                 int requestId = mRepeatingRequestIdStack.pop();
 
@@ -270,20 +363,11 @@
     }
 
     @Override
-    public void setDeviceListener(StateListener listener, Handler handler) {
-        synchronized (mLock) {
-            if (listener != null) {
-                handler = checkHandler(handler);
-            }
-
-            mDeviceListener = listener;
-            mDeviceHandler = handler;
-        }
-    }
-
-    @Override
     public void flush() throws CameraAccessException {
         synchronized (mLock) {
+            checkIfCameraClosed();
+
+            mDeviceHandler.post(mCallOnBusy);
             try {
                 mRemoteDevice.flush();
             } catch (CameraRuntimeException e) {
@@ -297,9 +381,6 @@
 
     @Override
     public void close() {
-
-        // TODO: every method should throw IllegalStateException after close has been called
-
         synchronized (mLock) {
 
             try {
@@ -312,8 +393,11 @@
                 // impossible
             }
 
-            mRemoteDevice = null;
+            if (mRemoteDevice != null) {
+                mDeviceHandler.post(mCallOnClosed);
+            }
 
+            mRemoteDevice = null;
         }
     }
 
@@ -399,49 +483,44 @@
 
         @Override
         public void onCameraError(final int errorCode) {
-            synchronized (mLock) {
-                if (CameraDevice.this.mDeviceListener == null) return;
-                final StateListener listener = CameraDevice.this.mDeviceListener;
-                Runnable r = null;
+            Runnable r = null;
+            if (isClosed()) return;
+
+            synchronized(mLock) {
                 switch (errorCode) {
                     case ERROR_CAMERA_DISCONNECTED:
-                        r = new Runnable() {
-                            public void run() {
-                                listener.onDisconnected(CameraDevice.this);
-                            }
-                        };
+                        r = mCallOnDisconnected;
                         break;
+                    default:
+                        Log.e(TAG, "Unknown error from camera device: " + errorCode);
+                        // no break
                     case ERROR_CAMERA_DEVICE:
                     case ERROR_CAMERA_SERVICE:
                         r = new Runnable() {
                             public void run() {
-                                listener.onError(CameraDevice.this, errorCode);
+                                if (!CameraDevice.this.isClosed()) {
+                                    mDeviceListener.onError(CameraDevice.this, errorCode);
+                                }
                             }
                         };
                         break;
-                    default:
-                        Log.e(TAG, "Unknown error from camera device: " + errorCode);
                 }
-                if (r != null) {
-                    CameraDevice.this.mDeviceHandler.post(r);
-                }
+                CameraDevice.this.mDeviceHandler.post(r);
             }
         }
 
         @Override
         public void onCameraIdle() {
+            if (isClosed()) return;
+
             if (DEBUG) {
                 Log.d(TAG, "Camera now idle");
             }
             synchronized (mLock) {
-                if (CameraDevice.this.mDeviceListener == null) return;
-                final StateListener listener = CameraDevice.this.mDeviceListener;
-                Runnable r = new Runnable() {
-                    public void run() {
-                        listener.onIdle(CameraDevice.this);
-                    }
-                };
-                CameraDevice.this.mDeviceHandler.post(r);
+                if (!CameraDevice.this.mIdle) {
+                    CameraDevice.this.mDeviceHandler.post(mCallOnIdle);
+                }
+                CameraDevice.this.mIdle = true;
             }
         }
 
@@ -461,14 +540,18 @@
                 return;
             }
 
+            if (isClosed()) return;
+
             // Dispatch capture start notice
             holder.getHandler().post(
                 new Runnable() {
                     public void run() {
-                        holder.getListener().onCaptureStarted(
-                            CameraDevice.this,
-                            holder.getRequest(),
-                            timestamp);
+                        if (!CameraDevice.this.isClosed()) {
+                            holder.getListener().onCaptureStarted(
+                                CameraDevice.this,
+                                holder.getRequest(),
+                                timestamp);
+                        }
                     }
                 });
         }
@@ -503,6 +586,8 @@
                 return;
             }
 
+            if (isClosed()) return;
+
             final CaptureRequest request = holder.getRequest();
             final CaptureResult resultAsCapture = new CaptureResult(result, request, requestId);
 
@@ -510,10 +595,12 @@
                 new Runnable() {
                     @Override
                     public void run() {
-                        holder.getListener().onCaptureCompleted(
-                            CameraDevice.this,
-                            request,
-                            resultAsCapture);
+                        if (!CameraDevice.this.isClosed()){
+                            holder.getListener().onCaptureCompleted(
+                                CameraDevice.this,
+                                request,
+                                resultAsCapture);
+                        }
                     }
                 });
         }
@@ -541,4 +628,10 @@
             throw new IllegalStateException("CameraDevice was already closed");
         }
     }
+
+    private boolean isClosed() {
+        synchronized(mLock) {
+            return (mRemoteDevice == null);
+        }
+    }
 }
diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
index 6d04bf8..adccbc5 100644
--- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
+++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
@@ -16,7 +16,13 @@
 
 package android.hardware.camera2.impl;
 
+import android.graphics.ImageFormat;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraMetadata;
+import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.Face;
 import android.hardware.camera2.Rational;
 import android.os.Parcelable;
 import android.os.Parcel;
@@ -35,6 +41,9 @@
 public class CameraMetadataNative extends CameraMetadata implements Parcelable {
 
     private static final String TAG = "CameraMetadataJV";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
+    // this should be in sync with HAL_PIXEL_FORMAT_BLOB defined in graphics.h
+    private static final int NATIVE_JPEG_FORMAT = 0x21;
 
     public CameraMetadataNative() {
         super();
@@ -83,16 +92,21 @@
     @SuppressWarnings("unchecked")
     @Override
     public <T> T get(Key<T> key) {
-        int tag = key.getTag();
-        byte[] values = readValues(tag);
-        if (values == null) {
+
+        if (key == CaptureResult.STATISTICS_FACES) {
+            /**
+             * FIXME: Workaround for HAL bug that's missing FACE_DETECT_MODE
+             */
+            Log.w(TAG, "Expected non-null android.statistics.faceDetectMode");
             return null;
         }
 
-        int nativeType = getNativeType(tag);
+        T value = getOverride(key);
+        if (value != null) {
+            return value;
+        }
 
-        ByteBuffer buffer = ByteBuffer.wrap(values).order(ByteOrder.nativeOrder());
-        return unpackSingle(buffer, key.getType(), nativeType);
+        return getBase(key);
     }
 
     public void readFromParcel(Parcel in) {
@@ -109,24 +123,11 @@
      * type to the key.
      */
     public <T> void set(Key<T> key, T value) {
-        int tag = key.getTag();
-
-        if (value == null) {
-            writeValues(tag, null);
+        if (setOverride(key, value)) {
             return;
         }
 
-        int nativeType = getNativeType(tag);
-
-        int size = packSingle(value, null, key.getType(), nativeType, /* sizeOnly */true);
-
-        // TODO: Optimization. Cache the byte[] and reuse if the size is big enough.
-        byte[] values = new byte[size];
-
-        ByteBuffer buffer = ByteBuffer.wrap(values).order(ByteOrder.nativeOrder());
-        packSingle(value, buffer, key.getType(), nativeType, /*sizeOnly*/false);
-
-        writeValues(tag, values);
+        setBase(key, value);
     }
 
     // Keep up-to-date with camera_metadata.h
@@ -400,11 +401,13 @@
             int remaining = buffer.remaining();
             int arraySize = remaining / elementSize;
 
-            Log.v(TAG,
-                    String.format(
+            if (VERBOSE) {
+                Log.v(TAG,
+                        String.format(
                             "Attempting to unpack array (count = %d, element size = %d, bytes " +
-                                    "remaining = %d) for type %s",
+                            "remaining = %d) for type %s",
                             arraySize, elementSize, remaining, type));
+            }
 
             array = Array.newInstance(componentType, arraySize);
             for (int i = 0; i < arraySize; ++i) {
@@ -432,6 +435,157 @@
         return (T) array;
     }
 
+    private <T> T getBase(Key<T> key) {
+        int tag = key.getTag();
+        byte[] values = readValues(tag);
+        if (values == null) {
+            return null;
+        }
+
+        int nativeType = getNativeType(tag);
+
+        ByteBuffer buffer = ByteBuffer.wrap(values).order(ByteOrder.nativeOrder());
+        return unpackSingle(buffer, key.getType(), nativeType);
+    }
+
+    // Need overwrite some metadata that has different definitions between native
+    // and managed sides.
+    @SuppressWarnings("unchecked")
+    private <T> T getOverride(Key<T> key) {
+        if (key == CameraCharacteristics.SCALER_AVAILABLE_FORMATS) {
+            return (T) getAvailableFormats();
+        } else if (key == CaptureResult.STATISTICS_FACES) {
+            return (T) getFaces();
+        }
+
+        // For other keys, get() falls back to getBase()
+        return null;
+    }
+
+    private int[] getAvailableFormats() {
+        int[] availableFormats = getBase(CameraCharacteristics.SCALER_AVAILABLE_FORMATS);
+        for (int i = 0; i < availableFormats.length; i++) {
+            // JPEG has different value between native and managed side, need override.
+            if (availableFormats[i] == NATIVE_JPEG_FORMAT) {
+                availableFormats[i] = ImageFormat.JPEG;
+            }
+        }
+        return availableFormats;
+    }
+
+    private Face[] getFaces() {
+        final int FACE_LANDMARK_SIZE = 6;
+
+        Integer faceDetectMode = getBase(CaptureResult.STATISTICS_FACE_DETECT_MODE);
+        if (faceDetectMode == null) {
+            throw new AssertionError("Expect non-null face detect mode");
+        }
+
+        if (faceDetectMode == CaptureResult.STATISTICS_FACE_DETECT_MODE_OFF) {
+            return new Face[0];
+        }
+        if (faceDetectMode != CaptureResult.STATISTICS_FACE_DETECT_MODE_SIMPLE &&
+                faceDetectMode != CaptureResult.STATISTICS_FACE_DETECT_MODE_FULL) {
+            throw new AssertionError("Unknown face detect mode: " + faceDetectMode);
+        }
+
+        // Face scores and rectangles are required by SIMPLE and FULL mode.
+        byte[] faceScores = getBase(CaptureResult.STATISTICS_FACE_SCORES);
+        Rect[] faceRectangles = getBase(CaptureResult.STATISTICS_FACE_RECTANGLES);
+        if (faceScores == null || faceRectangles == null) {
+            throw new AssertionError("Expect face scores and rectangles to be non-null");
+        } else if (faceScores.length != faceRectangles.length) {
+            throw new AssertionError(
+                    String.format("Face score size(%d) doesn match face rectangle size(%d)!",
+                            faceScores.length, faceRectangles.length));
+        }
+
+        // Face id and landmarks are only required by FULL mode.
+        int[] faceIds = getBase(CaptureResult.STATISTICS_FACE_IDS);
+        int[] faceLandmarks = getBase(CaptureResult.STATISTICS_FACE_LANDMARKS);
+        int numFaces = faceScores.length;
+        if (faceDetectMode == CaptureResult.STATISTICS_FACE_DETECT_MODE_FULL) {
+            if (faceIds == null || faceLandmarks == null) {
+                throw new AssertionError("Expect face ids and landmarks to be non-null for " +
+                        "FULL mode");
+            } else if (faceIds.length != numFaces ||
+                    faceLandmarks.length != numFaces * FACE_LANDMARK_SIZE) {
+                throw new AssertionError(
+                        String.format("Face id size(%d), or face landmark size(%d) don't match " +
+                                "face number(%d)!",
+                                faceIds.length, faceLandmarks.length * FACE_LANDMARK_SIZE,
+                                numFaces));
+            }
+        }
+
+        Face[] faces = new Face[numFaces];
+        if (faceDetectMode == CaptureResult.STATISTICS_FACE_DETECT_MODE_SIMPLE) {
+            for (int i = 0; i < numFaces; i++) {
+                faces[i] = new Face(faceRectangles[i], faceScores[i]);
+            }
+        } else {
+            // CaptureResult.STATISTICS_FACE_DETECT_MODE_FULL
+            for (int i = 0; i < numFaces; i++) {
+                Point leftEye = new Point(faceLandmarks[i*6], faceLandmarks[i*6+1]);
+                Point rightEye = new Point(faceLandmarks[i*6+2], faceLandmarks[i*6+3]);
+                Point mouth = new Point(faceLandmarks[i*6+4], faceLandmarks[i*6+5]);
+                faces[i] = new Face(faceRectangles[i], faceScores[i], faceIds[i],
+                        leftEye, rightEye, mouth);
+            }
+        }
+        return faces;
+    }
+
+    private <T> void setBase(Key<T> key, T value) {
+        int tag = key.getTag();
+
+        if (value == null) {
+            writeValues(tag, null);
+            return;
+        }
+
+        int nativeType = getNativeType(tag);
+
+        int size = packSingle(value, null, key.getType(), nativeType, /* sizeOnly */true);
+
+        // TODO: Optimization. Cache the byte[] and reuse if the size is big enough.
+        byte[] values = new byte[size];
+
+        ByteBuffer buffer = ByteBuffer.wrap(values).order(ByteOrder.nativeOrder());
+        packSingle(value, buffer, key.getType(), nativeType, /*sizeOnly*/false);
+
+        writeValues(tag, values);
+    }
+
+    // Set the camera metadata override.
+    private <T> boolean setOverride(Key<T> key, T value) {
+        if (key == CameraCharacteristics.SCALER_AVAILABLE_FORMATS) {
+            return setAvailableFormats((int[]) value);
+        }
+
+        // For other keys, set() falls back to setBase().
+        return false;
+    }
+
+    private boolean setAvailableFormats(int[] value) {
+        int[] availableFormat = value;
+        if (value == null) {
+            // Let setBase() to handle the null value case.
+            return false;
+        }
+
+        int[] newValues = new int[availableFormat.length];
+        for (int i = 0; i < availableFormat.length; i++) {
+            newValues[i] = availableFormat[i];
+            if (availableFormat[i] == ImageFormat.JPEG) {
+                newValues[i] = NATIVE_JPEG_FORMAT;
+            }
+        }
+
+        setBase(CameraCharacteristics.SCALER_AVAILABLE_FORMATS, newValues);
+        return true;
+    }
+
     private long mMetadataPtr; // native CameraMetadata*
 
     private native long nativeAllocate();
@@ -535,7 +689,7 @@
      * @hide
      */
     public byte[] readValues(int tag) {
-     // TODO: Optimization. Native code returns a ByteBuffer instead.
+        // TODO: Optimization. Native code returns a ByteBuffer instead.
         return nativeReadValues(tag);
     }
 
@@ -565,8 +719,9 @@
                     "Expected values array to be the same size as the enumTypes values "
                             + values.length + " for type " + enumType);
         }
-
-        Log.v(TAG, "Registered enum values for type " + enumType + " values");
+        if (VERBOSE) {
+            Log.v(TAG, "Registered enum values for type " + enumType + " values");
+        }
 
         sEnumValues.put(enumType, values);
     }
@@ -654,14 +809,18 @@
     static {
         nativeClassInit();
 
-        Log.v(TAG, "Shall register metadata marshalers");
+        if (VERBOSE) {
+            Log.v(TAG, "Shall register metadata marshalers");
+        }
 
         // load built-in marshallers
         registerMarshaler(new MetadataMarshalRect());
         registerMarshaler(new MetadataMarshalSize());
         registerMarshaler(new MetadataMarshalString());
 
-        Log.v(TAG, "Registered metadata marshalers");
+        if (VERBOSE) {
+            Log.v(TAG, "Registered metadata marshalers");
+        }
     }
 
 }
diff --git a/core/java/android/print/PrintAttributes.java b/core/java/android/print/PrintAttributes.java
index 959380d..e1a9cb7 100644
--- a/core/java/android/print/PrintAttributes.java
+++ b/core/java/android/print/PrintAttributes.java
@@ -22,10 +22,13 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.text.TextUtils;
+import android.util.ArrayMap;
 import android.util.Log;
 
 import com.android.internal.R;
 
+import java.util.Map;
+
 /**
  * This class represents the attributes of a print job.
  */
@@ -267,6 +270,9 @@
     public static final class MediaSize {
         private static final String LOG_TAG = "MediaSize";
 
+        private static final Map<String, MediaSize> sIdToMediaSizeMap =
+                new ArrayMap<String, MediaSize>();
+
         /**
          * Unknown media size in portrait mode.
          * <p>
@@ -276,7 +282,7 @@
          */
         public static final MediaSize UNKNOWN_PORTRAIT =
                 new MediaSize("UNKNOWN_PORTRAIT", "android",
-                        R.string.mediasize_unknown_portrait, Integer.MAX_VALUE, 1);
+                        R.string.mediasize_unknown_portrait, 1, Integer.MAX_VALUE);
 
         /**
          * Unknown media size in landscape mode.
@@ -287,7 +293,7 @@
          */
         public static final MediaSize UNKNOWN_LANDSCAPE =
                 new MediaSize("UNKNOWN_LANDSCAPE", "android",
-                        R.string.mediasize_unknown_landscape, 1, Integer.MAX_VALUE);
+                        R.string.mediasize_unknown_landscape, Integer.MAX_VALUE, 1);
 
         // ISO sizes
 
@@ -494,8 +500,8 @@
                         R.string.mediasize_chinese_prc_10, 12756, 18032);
 
         /** Chinese PRC 16k media size: 146mm x 215mm (5.749" x 8.465") */
-        public static final MediaSize PRC_16k =
-                new MediaSize("PRC_16k", "android",
+        public static final MediaSize PRC_16K =
+                new MediaSize("PRC_16K", "android",
                         R.string.mediasize_chinese_prc_16k, 5749, 8465);
         /** Chinese Pa Kai media size: 267mm x 389mm (10.512" x 15.315") */
         public static final MediaSize OM_PA_KAI =
@@ -651,6 +657,9 @@
             mWidthMils = widthMils;
             mHeightMils = heightMils;
             mLabel = null;
+
+            // Build this mapping only for predefined media sizes.
+            sIdToMediaSizeMap.put(mId, this);
         }
 
         /**
@@ -854,6 +863,18 @@
             builder.append("}");
             return builder.toString();
         }
+
+        /**
+         * Gets a standard media size given its id.
+         *
+         * @param id The media size id.
+         * @return The media size for the given id or null.
+         *
+         * @hide
+         */
+        public static MediaSize getStandardMediaSizeById(String id) {
+            return sIdToMediaSizeMap.get(id);
+        }
     }
 
     /**
diff --git a/core/java/android/print/PrintFileDocumentAdapter.java b/core/java/android/print/PrintFileDocumentAdapter.java
index c3a23a5..5d655bf 100644
--- a/core/java/android/print/PrintFileDocumentAdapter.java
+++ b/core/java/android/print/PrintFileDocumentAdapter.java
@@ -41,6 +41,8 @@
  * spooling the data, so you can delete the file if it is a
  * temporary one. To achieve this one must override {@link #onFinish()}
  * and delete the file yourself.
+ *
+ * @hide
  */
 public class PrintFileDocumentAdapter extends PrintDocumentAdapter {
 
diff --git a/core/java/android/print/PrintJobInfo.java b/core/java/android/print/PrintJobInfo.java
index e5d06a2..ccb4f44 100644
--- a/core/java/android/print/PrintJobInfo.java
+++ b/core/java/android/print/PrintJobInfo.java
@@ -26,9 +26,6 @@
  */
 public final class PrintJobInfo implements Parcelable {
 
-    /** Undefined print job id. */
-    public static final int PRINT_JOB_ID_UNDEFINED = -1;
-
     /**
      * Constant for matching any print job state.
      *
@@ -356,6 +353,8 @@
      * Gets the optional tag assigned by a print service.
      *
      * @return The tag.
+     *
+     * @hide
      */
     public String getTag() {
         return mTag;
diff --git a/core/java/android/print/PrintManager.java b/core/java/android/print/PrintManager.java
index 0859fdd..9c7c1fe 100644
--- a/core/java/android/print/PrintManager.java
+++ b/core/java/android/print/PrintManager.java
@@ -57,6 +57,8 @@
 
     private static final String LOG_TAG = "PrintManager";
 
+    private static final boolean DEBUG = false;
+
     /** @hide */
     public static final int APP_ID_ANY = -2;
 
@@ -350,6 +352,16 @@
 
         private Handler mHandler; // Strong reference OK - cleared in finish()
 
+        private LayoutSpec mLastLayoutSpec;
+
+        private WriteSpec mLastWriteSpec;
+
+        private boolean mStartReqeusted;
+        private boolean mStarted;
+
+        private boolean mFinishRequested;
+        private boolean mFinished;
+
         public PrintDocumentAdapterDelegate(PrintDocumentAdapter documentAdapter, Looper looper) {
             mDocumentAdapter = documentAdapter;
             mHandler = new MyHandler(looper);
@@ -357,47 +369,102 @@
 
         @Override
         public void start() {
-            mHandler.sendEmptyMessage(MyHandler.MSG_START);
+            synchronized (mLock) {
+                // Started or finished - nothing to do.
+                if (mStartReqeusted || mFinishRequested) {
+                    return;
+                }
+
+                mStartReqeusted = true;
+
+                doPendingWorkLocked();
+            }
         }
 
         @Override
         public void layout(PrintAttributes oldAttributes, PrintAttributes newAttributes,
                 ILayoutResultCallback callback, Bundle metadata, int sequence) {
             synchronized (mLock) {
-                if (mLayoutOrWriteCancellation != null) {
-                    mLayoutOrWriteCancellation.cancel();
+                // Start not called or finish called - nothing to do.
+                if (!mStartReqeusted || mFinishRequested) {
+                    return;
                 }
+
+                // Layout cancels write and overrides layout.
+                if (mLastWriteSpec != null) {
+                    IoUtils.closeQuietly(mLastWriteSpec.fd);
+                    mLastWriteSpec = null;
+                }
+
+                mLastLayoutSpec = new LayoutSpec();
+                mLastLayoutSpec.callback = callback;
+                mLastLayoutSpec.oldAttributes = oldAttributes;
+                mLastLayoutSpec.newAttributes = newAttributes;
+                mLastLayoutSpec.metadata = metadata;
+                mLastLayoutSpec.sequence = sequence;
+
+                // Cancel the previous cancellable operation.When the
+                // cancellation completes we will do the pending work.
+                if (cancelPreviousCancellableOperationLocked()) {
+                    return;
+                }
+
+                doPendingWorkLocked();
             }
-            SomeArgs args = SomeArgs.obtain();
-            args.arg1 = oldAttributes;
-            args.arg2 = newAttributes;
-            args.arg3 = callback;
-            args.arg4 = metadata;
-            args.argi1 = sequence;
-            mHandler.removeMessages(MyHandler.MSG_LAYOUT);
-            mHandler.obtainMessage(MyHandler.MSG_LAYOUT, args).sendToTarget();
         }
 
         @Override
         public void write(PageRange[] pages, ParcelFileDescriptor fd,
                 IWriteResultCallback callback, int sequence) {
             synchronized (mLock) {
-                if (mLayoutOrWriteCancellation != null) {
-                    mLayoutOrWriteCancellation.cancel();
+                // Start not called or finish called - nothing to do.
+                if (!mStartReqeusted || mFinishRequested) {
+                    return;
                 }
+
+                // Write cancels previous writes.
+                if (mLastWriteSpec != null) {
+                    IoUtils.closeQuietly(mLastWriteSpec.fd);
+                    mLastWriteSpec = null;
+                }
+
+                mLastWriteSpec = new WriteSpec();
+                mLastWriteSpec.callback = callback;
+                mLastWriteSpec.pages = pages;
+                mLastWriteSpec.fd = fd;
+                mLastWriteSpec.sequence = sequence;
+
+                // Cancel the previous cancellable operation.When the
+                // cancellation completes we will do the pending work.
+                if (cancelPreviousCancellableOperationLocked()) {
+                    return;
+                }
+
+                doPendingWorkLocked();
             }
-            SomeArgs args = SomeArgs.obtain();
-            args.arg1 = pages;
-            args.arg2 = fd;
-            args.arg3 = callback;
-            args.argi1 = sequence;
-            mHandler.removeMessages(MyHandler.MSG_WRITE);
-            mHandler.obtainMessage(MyHandler.MSG_WRITE, args).sendToTarget();
         }
 
         @Override
         public void finish() {
-            mHandler.sendEmptyMessage(MyHandler.MSG_FINISH);
+            synchronized (mLock) {
+                // Start not called or finish called - nothing to do.
+                if (!mStartReqeusted || mFinishRequested) {
+                    return;
+                }
+
+                mFinishRequested = true;
+
+                // When the current write or layout complete we
+                // will do the pending work.
+                if (mLastLayoutSpec != null || mLastWriteSpec != null) {
+                    if (DEBUG) {
+                        Log.i(LOG_TAG, "Waiting for current operation");
+                    }
+                    return;
+                }
+
+                doPendingWorkLocked();
+            }
         }
 
         private boolean isFinished() {
@@ -407,7 +474,49 @@
         private void doFinish() {
             mDocumentAdapter = null;
             mHandler = null;
-            mLayoutOrWriteCancellation = null;
+            synchronized (mLock) {
+                mLayoutOrWriteCancellation = null;
+            }
+        }
+
+        private boolean cancelPreviousCancellableOperationLocked() {
+            if (mLayoutOrWriteCancellation != null) {
+                mLayoutOrWriteCancellation.cancel();
+                if (DEBUG) {
+                    Log.i(LOG_TAG, "Cancelling previous operation");
+                }
+                return true;
+            }
+            return false;
+        }
+
+        private void doPendingWorkLocked() {
+            if (mStartReqeusted && !mStarted) {
+                mStarted = true;
+                mHandler.sendEmptyMessage(MyHandler.MSG_START);
+            } else if (mLastLayoutSpec != null) {
+                mHandler.sendEmptyMessage(MyHandler.MSG_LAYOUT);
+            } else if (mLastWriteSpec != null) {
+                mHandler.sendEmptyMessage(MyHandler.MSG_WRITE);
+            } else if (mFinishRequested && !mFinished) {
+                mFinished = true;
+                mHandler.sendEmptyMessage(MyHandler.MSG_FINISH);
+            }
+        }
+
+        private class LayoutSpec {
+            ILayoutResultCallback callback;
+            PrintAttributes oldAttributes;
+            PrintAttributes newAttributes;
+            Bundle metadata;
+            int sequence;
+        }
+
+        private class WriteSpec {
+            IWriteResultCallback callback;
+            PageRange[] pages;
+            ParcelFileDescriptor fd;
+            int sequence;
         }
 
         private final class MyHandler extends Handler {
@@ -431,41 +540,52 @@
                     } break;
 
                     case MSG_LAYOUT: {
-                        SomeArgs args = (SomeArgs) message.obj;
-                        PrintAttributes oldAttributes = (PrintAttributes) args.arg1;
-                        PrintAttributes newAttributes = (PrintAttributes) args.arg2;
-                        ILayoutResultCallback callback = (ILayoutResultCallback) args.arg3;
-                        Bundle metadata = (Bundle) args.arg4;
-                        final int sequence = args.argi1;
-                        args.recycle();
+                        final CancellationSignal cancellation;
+                        final LayoutSpec layoutSpec;
 
-                        CancellationSignal cancellation = new CancellationSignal();
                         synchronized (mLock) {
+                            layoutSpec = mLastLayoutSpec;
+                            mLastLayoutSpec = null;
+                            cancellation = new CancellationSignal();
                             mLayoutOrWriteCancellation = cancellation;
                         }
 
-                        mDocumentAdapter.onLayout(oldAttributes, newAttributes, cancellation,
-                                new MyLayoutResultCallback(callback, sequence), metadata);
+                        if (layoutSpec != null) {
+                            if (DEBUG) {
+                                Log.i(LOG_TAG, "Performing layout");
+                            }
+                            mDocumentAdapter.onLayout(layoutSpec.oldAttributes,
+                                    layoutSpec.newAttributes, cancellation,
+                                    new MyLayoutResultCallback(layoutSpec.callback,
+                                            layoutSpec.sequence), layoutSpec.metadata);
+                        }
                     } break;
 
                     case MSG_WRITE: {
-                        SomeArgs args = (SomeArgs) message.obj;
-                        PageRange[] pages = (PageRange[]) args.arg1;
-                        ParcelFileDescriptor fd = (ParcelFileDescriptor) args.arg2;
-                        IWriteResultCallback callback = (IWriteResultCallback) args.arg3;
-                        final int sequence = args.argi1;
-                        args.recycle();
+                        final CancellationSignal cancellation;
+                        final WriteSpec writeSpec;
 
-                        CancellationSignal cancellation = new CancellationSignal();
                         synchronized (mLock) {
+                            writeSpec= mLastWriteSpec;
+                            mLastWriteSpec = null;
+                            cancellation = new CancellationSignal();
                             mLayoutOrWriteCancellation = cancellation;
                         }
 
-                        mDocumentAdapter.onWrite(pages, fd, cancellation,
-                                new MyWriteResultCallback(callback, fd, sequence));
+                        if (writeSpec != null) {
+                            if (DEBUG) {
+                                Log.i(LOG_TAG, "Performing write");
+                            }
+                            mDocumentAdapter.onWrite(writeSpec.pages, writeSpec.fd,
+                                    cancellation, new MyWriteResultCallback(writeSpec.callback,
+                                            writeSpec.fd, writeSpec.sequence));
+                        }
                     } break;
 
                     case MSG_FINISH: {
+                        if (DEBUG) {
+                            Log.i(LOG_TAG, "Performing finish");
+                        }
                         mDocumentAdapter.onFinish();
                         doFinish();
                     } break;
@@ -533,6 +653,7 @@
             private void clearLocked() {
                 mLayoutOrWriteCancellation = null;
                 mCallback = null;
+                doPendingWorkLocked();
             }
         }
 
@@ -598,6 +719,7 @@
                 IoUtils.closeQuietly(mFd);
                 mCallback = null;
                 mFd = null;
+                doPendingWorkLocked();
             }
         }
     }
diff --git a/core/java/android/printservice/PrintJob.java b/core/java/android/printservice/PrintJob.java
index 721e31e..d1dbedf 100644
--- a/core/java/android/printservice/PrintJob.java
+++ b/core/java/android/printservice/PrintJob.java
@@ -301,6 +301,18 @@
         return false;
     }
 
+    /**
+     * Gets the print job tag.
+     *
+     * @return tag The tag or null.
+     *
+     * @see #setTag(String)
+     */
+    public String getTag() {
+        PrintService.throwIfNotCalledOnMainThread();
+        return getInfo().getTag();
+    }
+
     @Override
     public boolean equals(Object obj) {
         if (this == obj) {
diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java
index 8bf6e4f..1c14c38 100644
--- a/core/java/android/provider/DocumentsContract.java
+++ b/core/java/android/provider/DocumentsContract.java
@@ -70,8 +70,14 @@
     }
 
     /** {@hide} */
+    @Deprecated
     public static final String META_DATA_DOCUMENT_PROVIDER = "android.content.DOCUMENT_PROVIDER";
 
+    /**
+     * Intent action used to identify {@link DocumentsProvider} instances.
+     */
+    public static final String PROVIDER_INTERFACE = "android.content.action.DOCUMENTS_PROVIDER";
+
     /** {@hide} */
     public static final String ACTION_MANAGE_ROOT = "android.provider.action.MANAGE_ROOT";
     /** {@hide} */
@@ -561,7 +567,7 @@
 
         final ProviderInfo info = context.getPackageManager()
                 .resolveContentProvider(uri.getAuthority(), PackageManager.GET_META_DATA);
-        if (info.metaData != null && info.metaData.containsKey(
+        if (info != null && info.metaData != null && info.metaData.containsKey(
                 DocumentsContract.META_DATA_DOCUMENT_PROVIDER)) {
             return true;
         }
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 989e287..50777fd 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2441,9 +2441,7 @@
             SCREEN_BRIGHTNESS_MODE,
             SCREEN_AUTO_BRIGHTNESS_ADJ,
             VIBRATE_INPUT_DEVICES,
-            MODE_RINGER,                // moved to global
             MODE_RINGER_STREAMS_AFFECTED,
-            MUTE_STREAMS_AFFECTED,
             VOLUME_VOICE,
             VOLUME_SYSTEM,
             VOLUME_RING,
@@ -5940,7 +5938,6 @@
         public static final String[] SETTINGS_TO_BACKUP = {
             BUGREPORT_IN_POWER_MENU,
             STAY_ON_WHILE_PLUGGED_IN,
-            MODE_RINGER,
             AUTO_TIME,
             AUTO_TIME_ZONE,
             POWER_SOUNDS_ENABLED,
diff --git a/core/java/android/text/DynamicLayout.java b/core/java/android/text/DynamicLayout.java
index 122f8a1..06935ae 100644
--- a/core/java/android/text/DynamicLayout.java
+++ b/core/java/android/text/DynamicLayout.java
@@ -502,17 +502,19 @@
         }
 
         mNumberOfBlocks = newNumberOfBlocks;
+        int newFirstChangedBlock;
         final int deltaLines = newLineCount - (endLine - startLine + 1);
         if (deltaLines != 0) {
             // Display list whose index is >= mIndexFirstChangedBlock is valid
             // but it needs to update its drawing location.
-            mIndexFirstChangedBlock = firstBlock + numAddedBlocks;
-            for (int i = mIndexFirstChangedBlock; i < mNumberOfBlocks; i++) {
+            newFirstChangedBlock = firstBlock + numAddedBlocks;
+            for (int i = newFirstChangedBlock; i < mNumberOfBlocks; i++) {
                 mBlockEndLines[i] += deltaLines;
             }
         } else {
-            mIndexFirstChangedBlock = mNumberOfBlocks;
+            newFirstChangedBlock = mNumberOfBlocks;
         }
+        mIndexFirstChangedBlock = Math.min(mIndexFirstChangedBlock, newFirstChangedBlock);
 
         int blockIndex = firstBlock;
         if (createBlockBefore) {
diff --git a/core/java/android/text/SpannableStringBuilder.java b/core/java/android/text/SpannableStringBuilder.java
index 6efde05..34274a6 100644
--- a/core/java/android/text/SpannableStringBuilder.java
+++ b/core/java/android/text/SpannableStringBuilder.java
@@ -1293,23 +1293,29 @@
     public boolean equals(Object o) {
         if (o instanceof Spanned &&
                 toString().equals(o.toString())) {
+            Spanned other = (Spanned) o;
             // Check span data
-            Object[] otherSpans = ((Spanned) o).getSpans(0,
-                    ((Spanned) o).length(), Object.class);
+            Object[] otherSpans = other.getSpans(0, other.length(), Object.class);
             if (mSpanCount == otherSpans.length) {
                 for (int i = 0; i < mSpanCount; ++i) {
                     Object thisSpan = mSpans[i];
                     Object otherSpan = otherSpans[i];
-                    if (!thisSpan.equals(otherSpan) ||
-                            getSpanStart(thisSpan) != getSpanStart(otherSpan) ||
-                            getSpanEnd(thisSpan) != getSpanEnd(otherSpan) ||
-                            getSpanFlags(thisSpan) != getSpanFlags(otherSpan)) {
+                    if (thisSpan == this) {
+                        if (other != otherSpan ||
+                                getSpanStart(thisSpan) != other.getSpanStart(otherSpan) ||
+                                getSpanEnd(thisSpan) != other.getSpanEnd(otherSpan) ||
+                                getSpanFlags(thisSpan) != other.getSpanFlags(otherSpan)) {
+                            return false;
+                        }
+                    } else if (!thisSpan.equals(otherSpan) ||
+                            getSpanStart(thisSpan) != other.getSpanStart(otherSpan) ||
+                            getSpanEnd(thisSpan) != other.getSpanEnd(otherSpan) ||
+                            getSpanFlags(thisSpan) != other.getSpanFlags(otherSpan)) {
                         return false;
                     }
                 }
                 return true;
             }
-
         }
         return false;
     }
@@ -1321,7 +1327,9 @@
         hash = hash * 31 + mSpanCount;
         for (int i = 0; i < mSpanCount; ++i) {
             Object span = mSpans[i];
-            hash = hash * 31 + span.hashCode();
+            if (span != this) {
+                hash = hash * 31 + span.hashCode();
+            }
             hash = hash * 31 + getSpanStart(span);
             hash = hash * 31 + getSpanEnd(span);
             hash = hash * 31 + getSpanFlags(span);
diff --git a/core/java/android/text/SpannableStringInternal.java b/core/java/android/text/SpannableStringInternal.java
index 9b24a2e..456a3e5 100644
--- a/core/java/android/text/SpannableStringInternal.java
+++ b/core/java/android/text/SpannableStringInternal.java
@@ -363,23 +363,29 @@
     public boolean equals(Object o) {
         if (o instanceof Spanned &&
                 toString().equals(o.toString())) {
+            Spanned other = (Spanned) o;
             // Check span data
-            Object[] otherSpans = ((Spanned) o).getSpans(0,
-                    ((Spanned) o).length(), Object.class);
+            Object[] otherSpans = other.getSpans(0, other.length(), Object.class);
             if (mSpanCount == otherSpans.length) {
                 for (int i = 0; i < mSpanCount; ++i) {
                     Object thisSpan = mSpans[i];
                     Object otherSpan = otherSpans[i];
-                    if (!thisSpan.equals(otherSpan) ||
-                            getSpanStart(thisSpan) != getSpanStart(otherSpan) ||
-                            getSpanEnd(thisSpan) != getSpanEnd(otherSpan) ||
-                            getSpanFlags(thisSpan) != getSpanFlags(otherSpan)) {
+                    if (thisSpan == this) {
+                        if (other != otherSpan ||
+                                getSpanStart(thisSpan) != other.getSpanStart(otherSpan) ||
+                                getSpanEnd(thisSpan) != other.getSpanEnd(otherSpan) ||
+                                getSpanFlags(thisSpan) != other.getSpanFlags(otherSpan)) {
+                            return false;
+                        }
+                    } else if (!thisSpan.equals(otherSpan) ||
+                            getSpanStart(thisSpan) != other.getSpanStart(otherSpan) ||
+                            getSpanEnd(thisSpan) != other.getSpanEnd(otherSpan) ||
+                            getSpanFlags(thisSpan) != other.getSpanFlags(otherSpan)) {
                         return false;
                     }
                 }
                 return true;
             }
-
         }
         return false;
     }
@@ -391,7 +397,9 @@
         hash = hash * 31 + mSpanCount;
         for (int i = 0; i < mSpanCount; ++i) {
             Object span = mSpans[i];
-            hash = hash * 31 + span.hashCode();
+            if (span != this) {
+                hash = hash * 31 + span.hashCode();
+            }
             hash = hash * 31 + getSpanStart(span);
             hash = hash * 31 + getSpanEnd(span);
             hash = hash * 31 + getSpanFlags(span);
diff --git a/core/java/android/transition/ChangeText.java b/core/java/android/transition/ChangeText.java
index b1be70f..8677a56 100644
--- a/core/java/android/transition/ChangeText.java
+++ b/core/java/android/transition/ChangeText.java
@@ -179,8 +179,8 @@
             startSelectionStart = startSelectionEnd = endSelectionStart = endSelectionEnd = -1;
         }
         if (!startText.equals(endText)) {
-            final int startColor = (Integer) startVals.get(PROPNAME_TEXT_COLOR);
-            final int endColor = (Integer) endVals.get(PROPNAME_TEXT_COLOR);
+            final int startColor;
+            final int endColor;
             if (mChangeBehavior != CHANGE_BEHAVIOR_IN) {
                 view.setText(startText);
                 if (view instanceof EditText) {
@@ -189,6 +189,7 @@
             }
             Animator anim;
             if (mChangeBehavior == CHANGE_BEHAVIOR_KEEP) {
+                startColor = endColor = 0;
                 anim = ValueAnimator.ofFloat(0, 1);
                 anim.addListener(new AnimatorListenerAdapter() {
                     @Override
@@ -203,6 +204,8 @@
                     }
                 });
             } else {
+                startColor = (Integer) startVals.get(PROPNAME_TEXT_COLOR);
+                endColor = (Integer) endVals.get(PROPNAME_TEXT_COLOR);
                 // Fade out start text
                 ValueAnimator outAnim = null, inAnim = null;
                 if (mChangeBehavior == CHANGE_BEHAVIOR_OUT_IN ||
diff --git a/core/java/android/transition/TransitionInflater.java b/core/java/android/transition/TransitionInflater.java
index eeb6cba..4af0f51 100644
--- a/core/java/android/transition/TransitionInflater.java
+++ b/core/java/android/transition/TransitionInflater.java
@@ -169,7 +169,7 @@
             } else if ("recolor".equals(name)) {
                 transition = new Recolor();
                 newTransition = true;
-            } else if ("set".equals(name)) {
+            } else if ("transitionSet".equals(name)) {
                 transition = new TransitionSet();
                 TypedArray a = mContext.obtainStyledAttributes(attrs,
                         com.android.internal.R.styleable.TransitionSet);
diff --git a/core/java/android/transition/TransitionManager.java b/core/java/android/transition/TransitionManager.java
index 9be91d0..404709c 100644
--- a/core/java/android/transition/TransitionManager.java
+++ b/core/java/android/transition/TransitionManager.java
@@ -240,12 +240,7 @@
                     }
                     transition.playTransition(sceneRoot);
 
-                    // Returning false from onPreDraw() skips the current frame. This is
-                    // necessary to avoid artifacts caused by resetting target views
-                    // to their proper end states for capturing. Waiting until the next
-                    // frame to draw allows these views to have their mid-transition
-                    // values set on them again and avoid artifacts.
-                    return false;
+                    return true;
                 }
             };
             observer.addOnPreDrawListener(listener);
diff --git a/core/java/android/transition/TransitionSet.java b/core/java/android/transition/TransitionSet.java
index 79cd8b6..4545e3b 100644
--- a/core/java/android/transition/TransitionSet.java
+++ b/core/java/android/transition/TransitionSet.java
@@ -30,6 +30,22 @@
  * others play {@link #ORDERING_SEQUENTIAL}. For example, {@link AutoTransition}
  * uses a TransitionSet to sequentially play a Fade(Fade.OUT), followed by
  * a {@link ChangeBounds}, followed by a Fade(Fade.OUT) transition.
+ *
+ * <p>A TransitionSet can be described in a resource file by using the
+ * tag <code>transitionSet</code>, along with the standard
+ * attributes of {@link android.R.styleable#TransitionSet} and
+ * {@link android.R.styleable#Transition}. Child transitions of the
+ * TransitionSet object can be loaded by adding those child tags inside the
+ * enclosing <code>transitionSet</code> tag. For example, the following xml
+ * describes a TransitionSet that plays a Fade and then a ChangeBounds
+ * transition on the affected view targets:</p>
+ * <pre>
+ *     &lt;transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
+ *             android:ordering="sequential"&gt;
+ *         &lt;fade/&gt;
+ *         &lt;changeBounds/&gt;
+ *     &lt;/transitionSet&gt;
+ * </pre>
  */
 public class TransitionSet extends Transition {
 
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index fd45866..9d4af00 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -274,4 +274,11 @@
      * @return The magnification spec if such or null.
      */
     MagnificationSpec getCompatibleMagnificationSpecForWindow(in IBinder windowToken);
+
+    /**
+     * Sets the current touch exploration state.
+     *
+     * @param enabled Whether touch exploration is enabled.
+     */
+    void setTouchExplorationEnabled(boolean enabled);
 }
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index f763d19..caeb1d8 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -2448,24 +2448,6 @@
     public static final int SYSTEM_UI_FLAG_IMMERSIVE = 0x00000800;
 
     /**
-     * Flag for {@link #setSystemUiVisibility(int)}: View would like the status bar to have
-     * transparency.
-     *
-     * <p>The transparency request may be denied if the bar is in another mode with a specific
-     * style, like {@link #SYSTEM_UI_FLAG_IMMERSIVE immersive mode}.
-     */
-    public static final int SYSTEM_UI_FLAG_TRANSPARENT_STATUS = 0x00001000;
-
-    /**
-     * Flag for {@link #setSystemUiVisibility(int)}: View would like the navigation bar to have
-     * transparency.
-     *
-     * <p>The transparency request may be denied if the bar is in another mode with a specific
-     * style, like {@link #SYSTEM_UI_FLAG_IMMERSIVE immersive mode}.
-     */
-    public static final int SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION = 0x00002000;
-
-    /**
      * @deprecated Use {@link #SYSTEM_UI_FLAG_LOW_PROFILE} instead.
      */
     public static final int STATUS_BAR_HIDDEN = SYSTEM_UI_FLAG_LOW_PROFILE;
@@ -2626,6 +2608,26 @@
 
     /**
      * @hide
+     *
+     * NOTE: This flag may only be used in subtreeSystemUiVisibility. It is masked
+     * out of the public fields to keep the undefined bits out of the developer's way.
+     *
+     * Flag to specify that the status bar is displayed in translucent mode.
+     */
+    public static final int STATUS_BAR_TRANSLUCENT = 0x40000000;
+
+    /**
+     * @hide
+     *
+     * NOTE: This flag may only be used in subtreeSystemUiVisibility. It is masked
+     * out of the public fields to keep the undefined bits out of the developer's way.
+     *
+     * Flag to specify that the navigation bar is displayed in translucent mode.
+     */
+    public static final int NAVIGATION_BAR_TRANSLUCENT = 0x80000000;
+
+    /**
+     * @hide
      */
     public static final int PUBLIC_STATUS_BAR_VISIBILITY_MASK = 0x0000FFFF;
 
@@ -16934,9 +16936,7 @@
      * @param visibility  Bitwise-or of flags {@link #SYSTEM_UI_FLAG_LOW_PROFILE},
      * {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION}, {@link #SYSTEM_UI_FLAG_FULLSCREEN},
      * {@link #SYSTEM_UI_FLAG_LAYOUT_STABLE}, {@link #SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION},
-     * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, {@link #SYSTEM_UI_FLAG_IMMERSIVE},
-     * {@link #SYSTEM_UI_FLAG_TRANSPARENT_STATUS},
-     * and {@link #SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION}.
+     * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, and {@link #SYSTEM_UI_FLAG_IMMERSIVE}.
      */
     public void setSystemUiVisibility(int visibility) {
         if (visibility != mSystemUiVisibility) {
@@ -16952,9 +16952,7 @@
      * @return  Bitwise-or of flags {@link #SYSTEM_UI_FLAG_LOW_PROFILE},
      * {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION}, {@link #SYSTEM_UI_FLAG_FULLSCREEN},
      * {@link #SYSTEM_UI_FLAG_LAYOUT_STABLE}, {@link #SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION},
-     * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, {@link #SYSTEM_UI_FLAG_IMMERSIVE},
-     * {@link #SYSTEM_UI_FLAG_TRANSPARENT_STATUS},
-     * and {@link #SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION}.
+     * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, and {@link #SYSTEM_UI_FLAG_IMMERSIVE}.
      */
     public int getSystemUiVisibility() {
         return mSystemUiVisibility;
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 7e3ee5f..beb7366 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -754,6 +754,11 @@
             attrs.systemUiVisibility = mWindowAttributes.systemUiVisibility;
             attrs.subtreeSystemUiVisibility = mWindowAttributes.subtreeSystemUiVisibility;
             mWindowAttributesChangesFlag = mWindowAttributes.copyFrom(attrs);
+            if ((mWindowAttributesChangesFlag
+                    & WindowManager.LayoutParams.TRANSLUCENT_FLAGS_CHANGED) != 0) {
+                // Recompute system ui visibility.
+                mAttachInfo.mRecomputeGlobalAttributes = true;
+            }
             if (mWindowAttributes.packageName == null) {
                 mWindowAttributes.packageName = mBasePackageName;
             }
@@ -1026,6 +1031,7 @@
             mView.dispatchCollectViewAttributes(attachInfo, 0);
             attachInfo.mSystemUiVisibility &= ~attachInfo.mDisabledSystemUiVisibility;
             WindowManager.LayoutParams params = mWindowAttributes;
+            attachInfo.mSystemUiVisibility |= getImpliedSystemUiVisibility(params);
             if (attachInfo.mKeepScreenOn != oldScreenOn
                     || attachInfo.mSystemUiVisibility != params.subtreeSystemUiVisibility
                     || attachInfo.mHasSystemUiListeners != params.hasSystemUiListeners) {
@@ -1039,6 +1045,18 @@
         return false;
     }
 
+    private int getImpliedSystemUiVisibility(WindowManager.LayoutParams params) {
+        int vis = 0;
+        // Translucent decor window flags imply stable system ui visibility.
+        if ((params.flags & WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) != 0) {
+            vis |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
+        }
+        if ((params.flags & WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) != 0) {
+            vis |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
+        }
+        return vis;
+    }
+
     private boolean measureHierarchy(final View host, final WindowManager.LayoutParams lp,
             final Resources res, final int desiredWindowWidth, final int desiredWindowHeight) {
         int childWidthMeasureSpec;
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 815b97c..0ce4da5 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -838,6 +838,44 @@
          */
         public static final int FLAG_LAYOUT_IN_OVERSCAN = 0x02000000;
 
+        /**
+         * Window flag: request a translucent status bar with minimal system-provided
+         * background protection.
+         *
+         * <p>This flag can be controlled in your theme through the
+         * {@link android.R.attr#windowTranslucentStatus} attribute; this attribute
+         * is automatically set for you in the standard translucent decor themes
+         * such as
+         * {@link android.R.style#Theme_Holo_NoActionBar_TranslucentDecor},
+         * {@link android.R.style#Theme_Holo_Light_NoActionBar_TranslucentDecor},
+         * {@link android.R.style#Theme_DeviceDefault_NoActionBar_TranslucentDecor}, and
+         * {@link android.R.style#Theme_DeviceDefault_Light_NoActionBar_TranslucentDecor}.</p>
+         *
+         * <p>When this flag is enabled for a window, it automatically sets
+         * the system UI visibility flags {@link View#SYSTEM_UI_FLAG_LAYOUT_STABLE} and
+         * {@link View#SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}.</p>
+         */
+        public static final int FLAG_TRANSLUCENT_STATUS = 0x04000000;
+
+        /**
+         * Window flag: request a translucent navigation bar with minimal system-provided
+         * background protection.
+         *
+         * <p>This flag can be controlled in your theme through the
+         * {@link android.R.attr#windowTranslucentNavigation} attribute; this attribute
+         * is automatically set for you in the standard translucent decor themes
+         * such as
+         * {@link android.R.style#Theme_Holo_NoActionBar_TranslucentDecor},
+         * {@link android.R.style#Theme_Holo_Light_NoActionBar_TranslucentDecor},
+         * {@link android.R.style#Theme_DeviceDefault_NoActionBar_TranslucentDecor}, and
+         * {@link android.R.style#Theme_DeviceDefault_Light_NoActionBar_TranslucentDecor}.</p>
+         *
+         * <p>When this flag is enabled for a window, it automatically sets
+         * the system UI visibility flags {@link View#SYSTEM_UI_FLAG_LAYOUT_STABLE} and
+         * {@link View#SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION}.</p>
+         */
+        public static final int FLAG_TRANSLUCENT_NAVIGATION = 0x08000000;
+
         // ----- HIDDEN FLAGS.
         // These start at the high bit and go down.
 
@@ -956,7 +994,11 @@
             @ViewDebug.FlagToString(mask = FLAG_HARDWARE_ACCELERATED, equals = FLAG_HARDWARE_ACCELERATED,
                     name = "FLAG_HARDWARE_ACCELERATED"),
             @ViewDebug.FlagToString(mask = FLAG_LOCAL_FOCUS_MODE, equals = FLAG_LOCAL_FOCUS_MODE,
-                    name = "FLAG_LOCAL_FOCUS_MODE")
+                    name = "FLAG_LOCAL_FOCUS_MODE"),
+            @ViewDebug.FlagToString(mask = FLAG_TRANSLUCENT_STATUS, equals = FLAG_TRANSLUCENT_STATUS,
+                    name = "FLAG_TRANSLUCENT_STATUS"),
+            @ViewDebug.FlagToString(mask = FLAG_TRANSLUCENT_NAVIGATION, equals = FLAG_TRANSLUCENT_NAVIGATION,
+                    name = "FLAG_TRANSLUCENT_NAVIGATION")
         })
         public int flags;
 
@@ -1046,6 +1088,11 @@
          * {@hide} */
         public static final int PRIVATE_FLAG_SYSTEM_ERROR = 0x00000100;
 
+        /** Window flag: maintain the previous translucent decor state when this window
+         * becomes top-most.
+         * {@hide} */
+        public static final int PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR = 0x00000200;
+
         /**
          * Control flags that are private to the platform.
          * @hide
@@ -1576,6 +1623,8 @@
         /** {@hide} */
         public static final int USER_ACTIVITY_TIMEOUT_CHANGED = 1<<18;
         /** {@hide} */
+        public static final int TRANSLUCENT_FLAGS_CHANGED = 1<<19;
+        /** {@hide} */
         public static final int EVERYTHING_CHANGED = 0xffffffff;
 
         // internal buffer to backup/restore parameters under compatibility mode.
@@ -1621,6 +1670,10 @@
                 changes |= TYPE_CHANGED;
             }
             if (flags != o.flags) {
+                final int diff = flags ^ o.flags;
+                if ((diff & (FLAG_TRANSLUCENT_STATUS | FLAG_TRANSLUCENT_NAVIGATION)) != 0) {
+                    changes |= TRANSLUCENT_FLAGS_CHANGED;
+                }
                 flags = o.flags;
                 changes |= FLAGS_CHANGED;
             }
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 79aec90..c5a1b86c 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -1186,4 +1186,11 @@
      * @return True if the window is a top level one.
      */
     public boolean isTopLevelWindow(int windowType);
+
+    /**
+     * Sets the current touch exploration state.
+     *
+     * @param enabled Whether touch exploration is enabled.
+     */
+    public void setTouchExplorationEnabled(boolean enabled);
 }
diff --git a/core/java/android/view/accessibility/AccessibilityEvent.java b/core/java/android/view/accessibility/AccessibilityEvent.java
index 7e2bffa..f635eee 100644
--- a/core/java/android/view/accessibility/AccessibilityEvent.java
+++ b/core/java/android/view/accessibility/AccessibilityEvent.java
@@ -910,10 +910,20 @@
 
     /**
      * Sets the performed action that triggered this event.
+     * <p>
+     * Valid actions are defined in {@link AccessibilityNodeInfo}:
+     * <ul>
+     * <li>{@link AccessibilityNodeInfo#ACTION_ACCESSIBILITY_FOCUS}
+     * <li>{@link AccessibilityNodeInfo#ACTION_CLEAR_ACCESSIBILITY_FOCUS}
+     * <li>{@link AccessibilityNodeInfo#ACTION_CLEAR_FOCUS}
+     * <li>{@link AccessibilityNodeInfo#ACTION_CLEAR_SELECTION}
+     * <li>{@link AccessibilityNodeInfo#ACTION_CLICK}
+     * <li>etc.
+     * </ul>
      *
      * @param action The action.
-     *
      * @throws IllegalStateException If called from an AccessibilityService.
+     * @see AccessibilityNodeInfo#performAction(int)
      */
     public void setAction(int action) {
         enforceNotSealed();
diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java
index 0fd4e33..16daba0 100644
--- a/core/java/android/webkit/WebViewFactory.java
+++ b/core/java/android/webkit/WebViewFactory.java
@@ -28,19 +28,6 @@
  * @hide
  */
 public final class WebViewFactory {
-    private static final boolean DEFAULT_TO_EXPERIMENTAL_WEBVIEW = true;
-    // REMEMBER: property names must be <= 31 chars total.
-    private static final String EXPERIMENTAL_PROPERTY_DEFAULT_OFF = "persist.sys.webview.exp";
-    private static final String EXPERIMENTAL_PROPERTY_DEFAULT_ON =
-            "persist.sys.webview." + Build.ID;
-
-    // Modify the persisted property name when the new webview is on-by-default, so that any user
-    // setting override only lives as long as that build.
-    private static final String LONG_PROPERTY_NAME = DEFAULT_TO_EXPERIMENTAL_WEBVIEW ?
-            EXPERIMENTAL_PROPERTY_DEFAULT_ON : EXPERIMENTAL_PROPERTY_DEFAULT_OFF;
-    private static final String WEBVIEW_EXPERIMENTAL_PROPERTY =
-            LONG_PROPERTY_NAME.length() > SystemProperties.PROP_NAME_MAX ?
-            LONG_PROPERTY_NAME.substring(0, SystemProperties.PROP_NAME_MAX) : LONG_PROPERTY_NAME;
 
     private static final String FORCE_PROVIDER_PROPERTY = "webview.force_provider";
     private static final String FORCE_PROVIDER_PROPERTY_VALUE_CHROMIUM = "chromium";
@@ -73,32 +60,25 @@
     private static final Object sProviderLock = new Object();
 
     public static boolean isExperimentalWebViewAvailable() {
-        try {
-            // Pass false so we don't initialize the class at this point, as this will be wasted if
-            // it's not enabled.
-            Class.forName(CHROMIUM_WEBVIEW_FACTORY, false, WebViewFactory.class.getClassLoader());
-            return true;
-        } catch (ClassNotFoundException e) {
-            return false;
-        }
+        // TODO: Remove callers of this method then remove it.
+        return false;  // Hide the toggle in Developer Settings.
     }
 
     /** @hide */
     public static void setUseExperimentalWebView(boolean enable) {
-        SystemProperties.set(WEBVIEW_EXPERIMENTAL_PROPERTY, enable ? "true" : "false");
-        Log.i(LOGTAG, "Use Experimental WebView changed: "
-                + SystemProperties.get(WebViewFactory.WEBVIEW_EXPERIMENTAL_PROPERTY, ""));
+        // TODO: Remove callers of this method then remove it.
     }
 
     /** @hide */
     public static boolean useExperimentalWebView() {
-        return SystemProperties.getBoolean(WEBVIEW_EXPERIMENTAL_PROPERTY,
-            DEFAULT_TO_EXPERIMENTAL_WEBVIEW);
+        // TODO: Remove callers of this method then remove it.
+        return isChromiumWebViewEnabled();
     }
 
     /** @hide */
     public static boolean isUseExperimentalWebViewSet() {
-        return !SystemProperties.get(WEBVIEW_EXPERIMENTAL_PROPERTY).isEmpty();
+        // TODO: Remove callers of this method then remove it.
+        return false;  // User has not modifed Developer Settings
     }
 
     static WebViewFactoryProvider getProvider() {
@@ -140,21 +120,20 @@
 
     // We allow a system property to specify that we should use the experimental Chromium powered
     // WebView. This enables us to switch between implementations at runtime.
-    private static boolean isExperimentalWebViewEnabled() {
-        if (!isExperimentalWebViewAvailable()) return false;
+    private static boolean isChromiumWebViewEnabled() {
         String forceProviderName = SystemProperties.get(FORCE_PROVIDER_PROPERTY);
-        if (forceProviderName.isEmpty()) return useExperimentalWebView();
+        if (forceProviderName.isEmpty()) return true;
 
         Log.i(LOGTAG, String.format("Provider overridden by property: %s=%s",
                 FORCE_PROVIDER_PROPERTY, forceProviderName));
         if (forceProviderName.equals(FORCE_PROVIDER_PROPERTY_VALUE_CHROMIUM)) return true;
         if (forceProviderName.equals(FORCE_PROVIDER_PROPERTY_VALUE_CLASSIC)) return false;
         Log.e(LOGTAG, String.format("Unrecognized provider: %s", forceProviderName));
-        return useExperimentalWebView();
+        return true;
     }
 
     private static Class<WebViewFactoryProvider> getFactoryClass() throws ClassNotFoundException {
-        if (isExperimentalWebViewEnabled()) {
+        if (isChromiumWebViewEnabled()) {
             return (Class<WebViewFactoryProvider>) Class.forName(CHROMIUM_WEBVIEW_FACTORY);
         } else  {
             return (Class<WebViewFactoryProvider>) Class.forName(DEFAULT_WEBVIEW_FACTORY);
diff --git a/core/java/android/widget/FastScroller.java b/core/java/android/widget/FastScroller.java
index e2f6d7d..a70bcdb 100644
--- a/core/java/android/widget/FastScroller.java
+++ b/core/java/android/widget/FastScroller.java
@@ -33,6 +33,7 @@
 import android.util.IntProperty;
 import android.util.MathUtils;
 import android.util.Property;
+import android.util.TypedValue;
 import android.view.Gravity;
 import android.view.MotionEvent;
 import android.view.View;
@@ -471,11 +472,11 @@
         final Resources res = context.getResources();
         final int minSize = res.getDimensionPixelSize(R.dimen.fastscroll_overlay_size);
         final ColorStateList textColor = ta.getColorStateList(TEXT_COLOR);
-        final float textSize = res.getDimension(R.dimen.fastscroll_overlay_text_size);
+        final float textSize = res.getDimensionPixelSize(R.dimen.fastscroll_overlay_text_size);
         final TextView textView = new TextView(context);
         textView.setLayoutParams(params);
         textView.setTextColor(textColor);
-        textView.setTextSize(textSize);
+        textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
         textView.setSingleLine(true);
         textView.setEllipsize(TruncateAt.MIDDLE);
         textView.setGravity(Gravity.CENTER);
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index 3e53b91..9e35a23 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -27,6 +27,7 @@
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuffColorFilter;
 import android.graphics.RectF;
+import android.graphics.Xfermode;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
@@ -73,6 +74,7 @@
 
     // these are applied to the drawable
     private ColorFilter mColorFilter;
+    private Xfermode mXfermode;
     private int mAlpha = 255;
     private int mViewAlphaScale = 256;
     private boolean mColorMod = false;
@@ -1125,6 +1127,18 @@
     }
 
     /**
+     * @hide Candidate for future API inclusion
+     */
+    public final void setXfermode(Xfermode mode) {
+        if (mXfermode != mode) {
+            mXfermode = mode;
+            mColorMod = true;
+            applyColorMod();
+            invalidate();
+        }
+    }
+
+    /**
      * Returns the active color filter for this ImageView.
      *
      * @return the active color filter for this ImageView
@@ -1200,6 +1214,7 @@
         if (mDrawable != null && mColorMod) {
             mDrawable = mDrawable.mutate();
             mDrawable.setColorFilter(mColorFilter);
+            mDrawable.setXfermode(mXfermode);
             mDrawable.setAlpha(mAlpha * mViewAlphaScale >> 8);
         }
     }
diff --git a/core/java/com/android/internal/widget/SubtitleView.java b/core/java/com/android/internal/widget/SubtitleView.java
index e30c1ff..ccedf63 100644
--- a/core/java/com/android/internal/widget/SubtitleView.java
+++ b/core/java/com/android/internal/widget/SubtitleView.java
@@ -113,10 +113,10 @@
         // TODO: Move these to a default style.
         final Resources res = getContext().getResources();
         final DisplayMetrics m = res.getDisplayMetrics();
-        mCornerRadius = res.getDimension(com.android.internal.R.dimen.subtitle_corner_radius);
-        mOutlineWidth = res.getDimension(com.android.internal.R.dimen.subtitle_outline_width);
-        mShadowRadius = res.getDimension(com.android.internal.R.dimen.subtitle_shadow_radius);
-        mShadowOffsetX = res.getDimension(com.android.internal.R.dimen.subtitle_shadow_offset);
+        mCornerRadius = res.getDimensionPixelSize(com.android.internal.R.dimen.subtitle_corner_radius);
+        mOutlineWidth = res.getDimensionPixelSize(com.android.internal.R.dimen.subtitle_outline_width);
+        mShadowRadius = res.getDimensionPixelSize(com.android.internal.R.dimen.subtitle_shadow_radius);
+        mShadowOffsetX = res.getDimensionPixelSize(com.android.internal.R.dimen.subtitle_shadow_offset);
         mShadowOffsetY = mShadowOffsetX;
 
         mTextPaint = new TextPaint();
@@ -169,9 +169,12 @@
         invalidate();
     }
 
+    /**
+     * Sets the text size in pixels.
+     *
+     * @param size the text size in pixels
+     */
     public void setTextSize(float size) {
-        final DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();
-        final float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, size, metrics);
         if (mTextPaint.getTextSize() != size) {
             mTextPaint.setTextSize(size);
             mInnerPaddingX = (int) (size * INNER_PADDING_RATIO + 0.5f);
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 0d757f7..da6219f 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -514,6 +514,9 @@
     }
 
     SkAutoTUnref<SkData> data(SkData::NewFromFD(descriptor));
+    if (data.get() == NULL) {
+        return nullObjectReturn("NewFromFD failed in nativeDecodeFileDescriptor");
+    }
     SkAutoTUnref<SkMemoryStream> stream(new SkMemoryStream(data));
 
     /* Allow purgeable iff we own the FD, i.e., in the puregeable and
diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp
index 73f3639..a0c50fa 100644
--- a/core/jni/android/graphics/TextLayoutCache.cpp
+++ b/core/jni/android/graphics/TextLayoutCache.cpp
@@ -868,6 +868,7 @@
     hb_shape(font, mBuffer, NULL, 0);
     hb_font_destroy(font);
 
+    mShapingPaint.setTypeface(paint->getTypeface());
     return baseGlyphCount;
 }
 
diff --git a/core/res/res/drawable/edit_text_holo_light.xml b/core/res/res/drawable/edit_text_holo_light.xml
index 5bdcbd9..9e913e9 100644
--- a/core/res/res/drawable/edit_text_holo_light.xml
+++ b/core/res/res/drawable/edit_text_holo_light.xml
@@ -27,7 +27,7 @@
     <item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/textfield_default_holo_light" />
     <item android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/textfield_disabled_holo_light" />
     <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_activated_holo_light" />
-    <iten android:state_enabled="true" android:state_activated="true" android:drawable="@drawable/textfield_focused_holo_light" />
+    <item android:state_enabled="true" android:state_activated="true" android:drawable="@drawable/textfield_focused_holo_light" />
     <item android:state_enabled="true" android:drawable="@drawable/textfield_default_holo_light" />
     <item android:state_focused="true" android:drawable="@drawable/textfield_disabled_focused_holo_light" />
     <item android:drawable="@drawable/textfield_disabled_holo_light" />
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
index 995b4af..4a39904 100644
--- a/core/res/res/values-mn-rMN/strings.xml
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -609,7 +609,7 @@
     <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Блютүүт тохиргоонд хандах"</string>
     <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Апп нь дотоод блютүүт таблетын тохиргоог харах боломжтой ба хос болох төхөөрөмжтэй холболтыг зөвшөөрөх болон хийх боломжтой"</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Апп нь утасны дотоод блютүүтыг тохируулах боломжтой ба гадаад төхөөрөмжийг олох болон хос үүсгэх боломжтой."</string>
-    <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Аппликешнд Блютүүт хоallow Bluetooth pairing by Application"</string>
+    <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Аппликешнд bluetooth хослол хийхийг зөвшөөрнө"</string>
     <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Апп-д хэрэглэгчтэй харьцахгүйгээр зайны төхөөрөмжүүдтэй хослох боломж олгоно."</string>
     <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Апп-д хэрэглэгчтэй харьцахгүйгээр зайны төхөөрөмжүүдтэй хослох боломж олгоно."</string>
     <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-д холбогдох болон салах"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index c3dc4ff..9ee8bae 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -439,6 +439,14 @@
              or later. -->
         <attr name="windowCloseOnTouchOutside" format="boolean" />
 
+        <!-- Flag indicating whether this window requests a translucent status bar.  Corresponds
+             to {@link android.view.WindowManager.LayoutParams#FLAG_TRANSLUCENT_STATUS}. -->
+        <attr name="windowTranslucentStatus" format="boolean" />
+
+        <!-- Flag indicating whether this window requests a translucent navigation bar.  Corresponds
+             to {@link android.view.WindowManager.LayoutParams#FLAG_TRANSLUCENT_NAVIGATION}. -->
+        <attr name="windowTranslucentNavigation" format="boolean" />
+
         <!-- ============ -->
         <!-- Alert Dialog styles -->
         <!-- ============ -->
@@ -1594,6 +1602,8 @@
         <attr name="windowSplitActionBar" />
         <attr name="windowEnableSplitTouch" />
         <attr name="windowCloseOnTouchOutside" />
+        <attr name="windowTranslucentStatus" />
+        <attr name="windowTranslucentNavigation" />
         <!-- The minimum width the window is allowed to be, along the major
              axis of the screen.  That is, when in landscape.  Can be either
              an absolute dimension or a fraction of the screen size in that
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index ea42f38..429a8a4 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -585,8 +585,8 @@
     <!-- Disable lockscreen rotation by default -->
     <bool name="config_enableLockScreenRotation">false</bool>
 
-    <!-- Disable lockscreen transparent bars by default -->
-    <bool name="config_enableLockScreenTransparentBars">false</bool>
+    <!-- Disable lockscreen translucent decor by default -->
+    <bool name="config_enableLockScreenTranslucentDecor">false</bool>
 
     <!-- Enable puk unlockscreen by default.
          If unlock screen is disabled, the puk should be unlocked through Emergency Dialer -->
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 431fe82..4635733 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2078,5 +2078,12 @@
   <public type="attr" name="requireDeviceUnlock" id="0x010103ec" />
   <public type="attr" name="apduServiceBanner" id="0x010103ed" />
   <public type="attr" name="accessibilityLiveRegion" id="0x010103ee" />
+  <public type="attr" name="windowTranslucentStatus" id="0x010103ef" />
+  <public type="attr" name="windowTranslucentNavigation" id="0x010103f0" />
+
+  <public type="style" name="Theme.Holo.NoActionBar.TranslucentDecor" id="0x010301e1" />
+  <public type="style" name="Theme.Holo.Light.NoActionBar.TranslucentDecor" id="0x010301e2" />
+  <public type="style" name="Theme.DeviceDefault.NoActionBar.TranslucentDecor" id="0x010301e3" />
+  <public type="style" name="Theme.DeviceDefault.Light.NoActionBar.TranslucentDecor" id="0x010301e4" />
 
 </resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index a403345..ad9144c 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1290,7 +1290,7 @@
   <java-symbol type="bool" name="config_disableMenuKeyInLockScreen" />
   <java-symbol type="bool" name="config_enableLockBeforeUnlockScreen" />
   <java-symbol type="bool" name="config_enableLockScreenRotation" />
-  <java-symbol type="bool" name="config_enableLockScreenTransparentBars" />
+  <java-symbol type="bool" name="config_enableLockScreenTranslucentDecor" />
   <java-symbol type="bool" name="config_lidControlsSleep" />
   <java-symbol type="bool" name="config_reverseDefaultRotation" />
   <java-symbol type="bool" name="config_showNavigationBar" />
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index eb39926..4c80e7d 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -178,6 +178,8 @@
         <item name="windowActionBar">false</item>
         <item name="windowActionModeOverlay">false</item>
         <item name="windowCloseOnTouchOutside">false</item>
+        <item name="windowTranslucentStatus">false</item>
+        <item name="windowTranslucentNavigation">false</item>
 
         <!-- Define these here; ContextThemeWrappers around themes that define them should
              always clear these values. -->
@@ -1584,6 +1586,15 @@
         <item name="android:windowContentOverlay">@null</item>
     </style>
 
+    <!-- Variant of the holographic (dark) theme that has no title bar and translucent
+         system decor.  This theme sets {@link android.R.attr#windowTranslucentStatus} and
+         {@link android.R.attr#windowTranslucentNavigation} to true. -->
+    <style name="Theme.Holo.NoActionBar.TranslucentDecor">
+        <item name="android:windowTranslucentStatus">true</item>
+        <item name="android:windowTranslucentNavigation">true</item>
+        <item name="android:windowContentOverlay">@null</item>
+    </style>
+
     <!-- Variant of the holographic (light) theme with no action bar. -->
     <style name="Theme.Holo.Light.NoActionBar">
         <item name="android:windowActionBar">false</item>
@@ -1608,6 +1619,15 @@
         <item name="android:windowContentOverlay">@null</item>
     </style>
 
+    <!-- Variant of the holographic (light) theme that has no title bar and translucent
+         system decor.  This theme sets {@link android.R.attr#windowTranslucentStatus} and
+         {@link android.R.attr#windowTranslucentNavigation} to true. -->
+    <style name="Theme.Holo.Light.NoActionBar.TranslucentDecor">
+        <item name="android:windowTranslucentStatus">true</item>
+        <item name="android:windowTranslucentNavigation">true</item>
+        <item name="android:windowContentOverlay">@null</item>
+    </style>
+
     <!-- Dialog themes for Holo -->
     <eat-comment />
 
diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml
index 87b1c9d..721c6b0 100644
--- a/core/res/res/values/themes_device_defaults.xml
+++ b/core/res/res/values/themes_device_defaults.xml
@@ -216,6 +216,12 @@
     <style name="Theme.DeviceDefault.NoActionBar.Overscan" parent="Theme.Holo.NoActionBar.Overscan" >
     </style>
 
+    <!-- Variant of {@link #Theme_DeviceDefault} that has no title bar and translucent
+         system decor.  This theme sets {@link android.R.attr#windowTranslucentStatus} and
+         {@link android.R.attr#windowTranslucentNavigation} to true. -->
+    <style name="Theme.DeviceDefault.NoActionBar.TranslucentDecor" parent="Theme.Holo.NoActionBar.TranslucentDecor" >
+    </style>
+
     <!-- Variant of {@link #Theme_DeviceDefault} with a light-colored style -->
     <style name="Theme.DeviceDefault.Light" parent="Theme.Holo.Light" >
         <!-- Text styles -->
@@ -376,6 +382,12 @@
     <style name="Theme.DeviceDefault.Light.NoActionBar.Overscan"
            parent="Theme.Holo.Light.NoActionBar.Overscan" >
     </style>
+    <!-- Variant of {@link #Theme_DeviceDefault_Light} that has no title bar and translucent
+         system decor.  This theme sets {@link android.R.attr#windowTranslucentStatus} and
+         {@link android.R.attr#windowTranslucentNavigation} to true. -->
+    <style name="Theme.DeviceDefault.Light.NoActionBar.TranslucentDecor"
+           parent="Theme.Holo.Light.NoActionBar.TranslucentDecor" >
+    </style>
     <!-- DeviceDefault theme for dialog windows and activities. This changes the window to be
     floating (not fill the entire screen), and puts a frame around its contents. You can set this
     theme on an activity if you would like to make an activity that looks like a Dialog. -->
diff --git a/graphics/java/android/graphics/Path.java b/graphics/java/android/graphics/Path.java
index ef858eb..5b04a91 100644
--- a/graphics/java/android/graphics/Path.java
+++ b/graphics/java/android/graphics/Path.java
@@ -78,7 +78,11 @@
             mLastDirection = null;
             if (rects != null) rects.setEmpty();
         }
+        // We promised not to change this, so preserve it around the native
+        // call, which does now reset fill type.
+        final FillType fillType = getFillType();
         native_reset(mNativePath);
+        setFillType(fillType);
     }
 
     /**
diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java
index 5ceab36..98e3386 100644
--- a/graphics/java/android/graphics/drawable/BitmapDrawable.java
+++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java
@@ -28,6 +28,7 @@
 import android.graphics.PixelFormat;
 import android.graphics.Rect;
 import android.graphics.Shader;
+import android.graphics.Xfermode;
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
 import android.util.LayoutDirection;
@@ -531,6 +532,14 @@
     }
 
     /**
+     * @hide Candidate for future API inclusion
+     */
+    public void setXfermode(Xfermode xfermode) {
+        mBitmapState.mPaint.setXfermode(xfermode);
+        invalidateSelf();
+    }
+
+    /**
      * A mutable BitmapDrawable still shares its Bitmap with any other Drawable
      * that comes from the same resource.
      *
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index 8135716..8a3d940 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -17,6 +17,7 @@
 package android.graphics.drawable;
 
 import android.graphics.Insets;
+import android.graphics.Xfermode;
 import android.os.Trace;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -428,6 +429,15 @@
     public abstract void setColorFilter(ColorFilter cf);
 
     /**
+     * @hide Consider for future API inclusion
+     */
+    public void setXfermode(Xfermode mode) {
+        // Base implementation drops it on the floor for compatibility. Whee!
+        // TODO: For this to be included in the API proper, all framework drawables need impls.
+        // For right now only BitmapDrawable has it.
+    }
+
+    /**
      * Specify a color and porterduff mode to be the colorfilter for this
      * drawable.
      */
diff --git a/graphics/tests/graphicstests/src/android/graphics/PathTest.java b/graphics/tests/graphicstests/src/android/graphics/PathTest.java
new file mode 100644
index 0000000..96200bc
--- /dev/null
+++ b/graphics/tests/graphicstests/src/android/graphics/PathTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2013 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 android.graphics;
+
+import android.test.suitebuilder.annotation.SmallTest;
+import junit.framework.TestCase;
+
+
+public class PathTest extends TestCase {
+
+    @SmallTest
+    public void testResetPreservesFillType() throws Exception {
+        Path path = new Path();
+
+        final Path.FillType defaultFillType = path.getFillType();
+        final Path.FillType fillType = Path.FillType.INVERSE_EVEN_ODD;
+        assertFalse(fillType.equals(defaultFillType));  // Sanity check for the test itself.
+
+        path.setFillType(fillType);
+        path.reset();
+        assertEquals(path.getFillType(), fillType);
+    }
+}
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index c8ee5ad..680e73a 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -24,6 +24,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.media.RemoteController.OnClientUpdateListener;
 import android.os.Binder;
 import android.os.Build;
 import android.os.Handler;
@@ -2270,7 +2271,9 @@
      * Registers a {@link RemoteController} instance for it to receive media metadata updates
      * and playback state information from applications using {@link RemoteControlClient}, and
      * control their playback.
-     * <p>Registration requires the {@link Manifest.permission#MEDIA_CONTENT_CONTROL} permission.
+     * <p>Registration requires the {@link OnClientUpdateListener} listener to be one of the
+     * enabled notification listeners (see
+     * {@link android.service.notification.NotificationListenerService}).
      * @param rctlr the object to register.
      * @return true if the {@link RemoteController} was successfully registered, false if an
      *     error occurred, due to an internal system error, or insufficient permissions.
@@ -2280,14 +2283,17 @@
             return false;
         }
         IAudioService service = getService();
+        final RemoteController.OnClientUpdateListener l = rctlr.getUpdateListener();
+        final ComponentName listenerComponent = new ComponentName(mContext, l.getClass());
         try {
             int[] artworkDimensions = rctlr.getArtworkSize();
-            boolean reg = service.registerRemoteControlDisplay(rctlr.getRcDisplay(),
-                    artworkDimensions[0]/*w*/, artworkDimensions[1]/*h*/);
+            boolean reg = service.registerRemoteController(rctlr.getRcDisplay(),
+                    artworkDimensions[0]/*w*/, artworkDimensions[1]/*h*/,
+                    listenerComponent);
             rctlr.setIsRegistered(reg);
             return reg;
         } catch (RemoteException e) {
-            Log.e(TAG, "Dead object in registerRemoteControlDisplay " + e);
+            Log.e(TAG, "Dead object in registerRemoteController " + e);
             return false;
         }
     }
@@ -2318,6 +2324,7 @@
      * artwork size directly, or
      * {@link #remoteControlDisplayUsesBitmapSize(IRemoteControlDisplay, int, int)} later if artwork
      * is not yet needed.
+     * <p>Registration requires the {@link Manifest.permission#MEDIA_CONTENT_CONTROL} permission.
      * @param rcd the IRemoteControlDisplay
      */
     public void registerRemoteControlDisplay(IRemoteControlDisplay rcd) {
@@ -2328,6 +2335,7 @@
     /**
      * @hide
      * Registers a remote control display that will be sent information by remote control clients.
+     * <p>Registration requires the {@link Manifest.permission#MEDIA_CONTENT_CONTROL} permission.
      * @param rcd
      * @param w the maximum width of the expected bitmap. Negative values indicate it is
      *   useless to send artwork.
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 49c838c..79814d1 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -48,6 +48,7 @@
 import android.database.ContentObserver;
 import android.media.MediaPlayer.OnCompletionListener;
 import android.media.MediaPlayer.OnErrorListener;
+import android.net.Uri;
 import android.os.Binder;
 import android.os.Build;
 import android.os.Bundle;
@@ -87,6 +88,7 @@
 import java.util.ArrayList;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -4162,17 +4164,13 @@
     //==========================================================================================
     // RemoteControlDisplay / RemoteControlClient / Remote info
     //==========================================================================================
+    public boolean registerRemoteController(IRemoteControlDisplay rcd, int w, int h,
+            ComponentName listenerComp) {
+        return mMediaFocusControl.registerRemoteController(rcd, w, h, listenerComp);
+    }
+
     public boolean registerRemoteControlDisplay(IRemoteControlDisplay rcd, int w, int h) {
-        if (PackageManager.PERMISSION_GRANTED == mContext.checkCallingOrSelfPermission(
-                android.Manifest.permission.MEDIA_CONTENT_CONTROL)) {
-            mMediaFocusControl.registerRemoteControlDisplay(rcd, w, h);
-            return true;
-        } else {
-            Log.w(TAG, "Access denied to process: " + Binder.getCallingPid() +
-                    ", must have permission " + android.Manifest.permission.MEDIA_CONTENT_CONTROL +
-                    " to register IRemoteControlDisplay");
-            return false;
-        }
+        return mMediaFocusControl.registerRemoteControlDisplay(rcd, w, h);
     }
 
     public void unregisterRemoteControlDisplay(IRemoteControlDisplay rcd) {
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index e3b87dd..8c05089 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -133,6 +133,8 @@
 
     /**
      * Register an IRemoteControlDisplay.
+     * Success of registration is subject to a check on
+     *   the android.Manifest.permission.MEDIA_CONTENT_CONTROL permission.
      * Notify all IRemoteControlClient of the new display and cause the RemoteControlClient
      * at the top of the stack to update the new display with its information.
      * @param rcd the IRemoteControlDisplay to register. No effect if null.
@@ -142,6 +144,16 @@
      *   display doesn't need to receive artwork.
      */
     boolean registerRemoteControlDisplay(in IRemoteControlDisplay rcd, int w, int h);
+
+    /**
+     * Like registerRemoteControlDisplay, but with success being subject to a check on
+     *   the android.Manifest.permission.MEDIA_CONTENT_CONTROL permission, and if it fails,
+     *   success is subject to listenerComp being one of the ENABLED_NOTIFICATION_LISTENERS
+     *   components.
+     */
+    boolean registerRemoteController(in IRemoteControlDisplay rcd, int w, int h,
+            in ComponentName listenerComp);
+
     /**
      * Unregister an IRemoteControlDisplay.
      * No effect if the IRemoteControlDisplay hasn't been successfully registered.
diff --git a/media/java/android/media/IRemoteControlClient.aidl b/media/java/android/media/IRemoteControlClient.aidl
index 999b8ba..aa142d6 100644
--- a/media/java/android/media/IRemoteControlClient.aidl
+++ b/media/java/android/media/IRemoteControlClient.aidl
@@ -56,6 +56,7 @@
     void unplugRemoteControlDisplay(IRemoteControlDisplay rcd);
     void setBitmapSizeForDisplay(IRemoteControlDisplay rcd, int w, int h);
     void setWantsSyncForDisplay(IRemoteControlDisplay rcd, boolean wantsSync);
+    void enableRemoteControlDisplay(IRemoteControlDisplay rcd, boolean enabled);
     void seekTo(int clientGeneration, long timeMs);
     void updateMetadata(int clientGeneration, int key, in Rating value);
 }
\ No newline at end of file
diff --git a/media/java/android/media/IRemoteControlDisplay.aidl b/media/java/android/media/IRemoteControlDisplay.aidl
index 583f436..1609030 100644
--- a/media/java/android/media/IRemoteControlDisplay.aidl
+++ b/media/java/android/media/IRemoteControlDisplay.aidl
@@ -41,6 +41,12 @@
             boolean clearing);
 
     /**
+     * Sets whether the controls of this display are enabled
+     * @param if false, the display shouldn't any commands
+     */
+    void setEnabled(boolean enabled);
+
+    /**
      * Sets the playback information (state, position and speed) of a client.
      * @param generationId the current generation ID as known by this client
      * @param state the current playback state, one of the following values:
diff --git a/media/java/android/media/MediaFocusControl.java b/media/java/android/media/MediaFocusControl.java
index 2a7a731..07d91ac 100644
--- a/media/java/android/media/MediaFocusControl.java
+++ b/media/java/android/media/MediaFocusControl.java
@@ -17,6 +17,7 @@
 package android.media;
 
 import android.app.Activity;
+import android.app.ActivityManager;
 import android.app.AppOpsManager;
 import android.app.KeyguardManager;
 import android.app.PendingIntent;
@@ -30,6 +31,8 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
+import android.database.ContentObserver;
+import android.net.Uri;
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.Handler;
@@ -45,6 +48,7 @@
 import android.telephony.PhoneStateListener;
 import android.telephony.TelephonyManager;
 import android.util.Log;
+import android.util.Slog;
 import android.view.KeyEvent;
 
 import java.io.FileDescriptor;
@@ -78,6 +82,7 @@
     private final AppOpsManager mAppOps;
     private final KeyguardManager mKeyguardManager;
     private final AudioService mAudioService;
+    private final NotificationListenerObserver mNotifListenerObserver;
 
     protected MediaFocusControl(Looper looper, Context cntxt,
             VolumeController volumeCtrl, AudioService as) {
@@ -111,6 +116,7 @@
         mAppOps = (AppOpsManager)mContext.getSystemService(Context.APP_OPS_SERVICE);
         mKeyguardManager =
                 (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
+        mNotifListenerObserver = new NotificationListenerObserver();
 
         mHasRemotePlayback = false;
         mMainRemoteIsActive = false;
@@ -125,6 +131,189 @@
     }
 
     //==========================================================================================
+    // Management of RemoteControlDisplay registration permissions
+    //==========================================================================================
+    private final static Uri ENABLED_NOTIFICATION_LISTENERS_URI =
+            Settings.Secure.getUriFor(Settings.Secure.ENABLED_NOTIFICATION_LISTENERS);
+
+    private class NotificationListenerObserver extends ContentObserver {
+
+        NotificationListenerObserver() {
+            super(mEventHandler);
+            mContentResolver.registerContentObserver(Settings.Secure.getUriFor(
+                    Settings.Secure.ENABLED_NOTIFICATION_LISTENERS), false, this);
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            if (!ENABLED_NOTIFICATION_LISTENERS_URI.equals(uri) || selfChange) {
+                return;
+            }
+            if (DEBUG_RC) { Log.d(TAG, "NotificationListenerObserver.onChange()"); }
+            postReevaluateRemoteControlDisplays();
+        }
+    }
+
+    private final static int RCD_REG_FAILURE = 0;
+    private final static int RCD_REG_SUCCESS_PERMISSION = 1;
+    private final static int RCD_REG_SUCCESS_ENABLED_NOTIF = 2;
+
+    /**
+     * Checks a caller's authorization to register an IRemoteControlDisplay.
+     * Authorization is granted if one of the following is true:
+     * <ul>
+     * <li>the caller has android.Manifest.permission.MEDIA_CONTENT_CONTROL permission</li>
+     * <li>the caller's listener is one of the enabled notification listeners</li>
+     * </ul>
+     * @return RCD_REG_FAILURE if it's not safe to proceed with the IRemoteControlDisplay
+     *     registration.
+     */
+    private int checkRcdRegistrationAuthorization(ComponentName listenerComp) {
+        // MEDIA_CONTENT_CONTROL permission check
+        if (PackageManager.PERMISSION_GRANTED == mContext.checkCallingOrSelfPermission(
+                android.Manifest.permission.MEDIA_CONTENT_CONTROL)) {
+            if (DEBUG_RC) { Log.d(TAG, "ok to register Rcd: has MEDIA_CONTENT_CONTROL permission");}
+            return RCD_REG_SUCCESS_PERMISSION;
+        }
+
+        // ENABLED_NOTIFICATION_LISTENERS settings check
+        if (listenerComp != null) {
+            // this call is coming from an app, can't use its identity to read secure settings
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                final int currentUser = ActivityManager.getCurrentUser();
+                final String enabledNotifListeners = Settings.Secure.getStringForUser(
+                        mContext.getContentResolver(),
+                        Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
+                        currentUser);
+                if (enabledNotifListeners != null) {
+                    final String[] components = enabledNotifListeners.split(":");
+                    for (int i=0; i<components.length; i++) {
+                        final ComponentName component =
+                                ComponentName.unflattenFromString(components[i]);
+                        if (component != null) {
+                            if (listenerComp.equals(component)) {
+                                if (DEBUG_RC) { Log.d(TAG, "ok to register RCC: " + component +
+                                        " is authorized notification listener"); }
+                                return RCD_REG_SUCCESS_ENABLED_NOTIF;
+                            }
+                        }
+                    }
+                }
+                if (DEBUG_RC) { Log.d(TAG, "not ok to register RCD, " + listenerComp +
+                        " is not in list of ENABLED_NOTIFICATION_LISTENERS"); }
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+            }
+        }
+
+        return RCD_REG_FAILURE;
+    }
+
+    protected boolean registerRemoteController(IRemoteControlDisplay rcd, int w, int h,
+            ComponentName listenerComp) {
+        int reg = checkRcdRegistrationAuthorization(listenerComp);
+        if (reg != RCD_REG_FAILURE) {
+            registerRemoteControlDisplay_int(rcd, w, h, listenerComp);
+            return true;
+        } else {
+            Slog.w(TAG, "Access denied to process: " + Binder.getCallingPid() +
+                    ", must have permission " + android.Manifest.permission.MEDIA_CONTENT_CONTROL +
+                    " or be an enabled NotificationListenerService for registerRemoteController");
+            return false;
+        }
+    }
+
+    protected boolean registerRemoteControlDisplay(IRemoteControlDisplay rcd, int w, int h) {
+        int reg = checkRcdRegistrationAuthorization(null);
+        if (reg != RCD_REG_FAILURE) {
+            registerRemoteControlDisplay_int(rcd, w, h, null);
+            return true;
+        } else {
+            Slog.w(TAG, "Access denied to process: " + Binder.getCallingPid() +
+                    ", must have permission " + android.Manifest.permission.MEDIA_CONTENT_CONTROL +
+                    " to register IRemoteControlDisplay");
+            return false;
+        }
+    }
+
+    private void postReevaluateRemoteControlDisplays() {
+        sendMsg(mEventHandler, MSG_REEVALUATE_RCD, SENDMSG_QUEUE, 0, 0, null, 0);
+    }
+
+    private void onReevaluateRemoteControlDisplays() {
+        if (DEBUG_RC) { Log.d(TAG, "onReevaluateRemoteControlDisplays()"); }
+        // read which components are enabled notification listeners
+        final int currentUser = ActivityManager.getCurrentUser();
+        final String enabledNotifListeners = Settings.Secure.getStringForUser(
+                mContext.getContentResolver(),
+                Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
+                currentUser);
+        if (DEBUG_RC) { Log.d(TAG, " > enabled list: " + enabledNotifListeners); }
+        synchronized(mAudioFocusLock) {
+            synchronized(mRCStack) {
+                // check whether the "enable" status of each RCD with a notification listener
+                // has changed
+                final String[] enabledComponents;
+                if (enabledNotifListeners == null) {
+                    enabledComponents = null;
+                } else {
+                    enabledComponents = enabledNotifListeners.split(":");
+                }
+                final Iterator<DisplayInfoForServer> displayIterator = mRcDisplays.iterator();
+                while (displayIterator.hasNext()) {
+                    final DisplayInfoForServer di =
+                            (DisplayInfoForServer) displayIterator.next();
+                    if (di.mClientNotifListComp != null) {
+                        boolean wasEnabled = di.mEnabled;
+                        di.mEnabled = isComponentInStringArray(di.mClientNotifListComp,
+                                enabledComponents);
+                        if (wasEnabled != di.mEnabled){
+                            try {
+                                // tell the RCD whether it's enabled
+                                di.mRcDisplay.setEnabled(di.mEnabled);
+                                // tell the RCCs about the change for this RCD
+                                enableRemoteControlDisplayForClient_syncRcStack(
+                                        di.mRcDisplay, di.mEnabled);
+                                // when enabling, refresh the information on the display
+                                if (di.mEnabled) {
+                                    sendMsg(mEventHandler, MSG_RCDISPLAY_INIT_INFO, SENDMSG_QUEUE,
+                                            di.mArtworkExpectedWidth /*arg1*/,
+                                            di.mArtworkExpectedHeight/*arg2*/,
+                                            di.mRcDisplay /*obj*/, 0/*delay*/);
+                                }
+                            } catch (RemoteException e) {
+                                Log.e(TAG, "Error en/disabling RCD: ", e);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * @param comp a non-null ComponentName
+     * @param enabledArray may be null
+     * @return
+     */
+    private boolean isComponentInStringArray(ComponentName comp, String[] enabledArray) {
+        if (enabledArray == null || enabledArray.length == 0) {
+            if (DEBUG_RC) { Log.d(TAG, " > " + comp + " is NOT enabled"); }
+            return false;
+        }
+        final String compString = comp.flattenToString();
+        for (int i=0; i<enabledArray.length; i++) {
+            if (compString.equals(enabledArray[i])) {
+                if (DEBUG_RC) { Log.d(TAG, " > " + compString + " is enabled"); }
+                return true;
+            }
+        }
+        if (DEBUG_RC) { Log.d(TAG, " > " + compString + " is NOT enabled"); }
+        return false;
+    }
+
+    //==========================================================================================
     // Internal event handling
     //==========================================================================================
 
@@ -140,6 +329,7 @@
     private static final int MSG_RCC_SEEK_REQUEST = 8;
     private static final int MSG_RCC_UPDATE_METADATA = 9;
     private static final int MSG_RCDISPLAY_INIT_INFO = 10;
+    private static final int MSG_REEVALUATE_RCD = 11;
 
     // sendMsg() flags
     /** If the msg is already queued, replace it with this one. */
@@ -221,6 +411,10 @@
                     onRcDisplayInitInfo((IRemoteControlDisplay)msg.obj /*newRcd*/,
                             msg.arg1/*w*/, msg.arg2/*h*/);
                     break;
+
+                case MSG_REEVALUATE_RCD:
+                    onReevaluateRemoteControlDisplays();
+                    break;
             }
         }
     }
@@ -1193,8 +1387,9 @@
                 final DisplayInfoForServer di = (DisplayInfoForServer) displayIterator.next();
                 pw.println("  IRCD: " + di.mRcDisplay +
                         "  -- w:" + di.mArtworkExpectedWidth +
-                        "  -- h:" + di.mArtworkExpectedHeight+
-                        "  -- wantsPosSync:" + di.mWantsPositionSync);
+                        "  -- h:" + di.mArtworkExpectedHeight +
+                        "  -- wantsPosSync:" + di.mWantsPositionSync +
+                        "  -- " + (di.mEnabled ? "enabled" : "disabled"));
             }
         }
     }
@@ -1834,11 +2029,13 @@
      */
     private class DisplayInfoForServer implements IBinder.DeathRecipient {
         /** may never be null */
-        private IRemoteControlDisplay mRcDisplay;
-        private IBinder mRcDisplayBinder;
+        private final IRemoteControlDisplay mRcDisplay;
+        private final IBinder mRcDisplayBinder;
         private int mArtworkExpectedWidth = -1;
         private int mArtworkExpectedHeight = -1;
         private boolean mWantsPositionSync = false;
+        private ComponentName mClientNotifListComp;
+        private boolean mEnabled = true;
 
         public DisplayInfoForServer(IRemoteControlDisplay rcd, int w, int h) {
             if (DEBUG_RC) Log.i(TAG, "new DisplayInfoForServer for " + rcd + " w=" + w + " h=" + h);
@@ -1911,6 +2108,23 @@
         }
     }
 
+    private void enableRemoteControlDisplayForClient_syncRcStack(IRemoteControlDisplay rcd,
+            boolean enabled) {
+        // let all the remote control clients know whether the given display is enabled
+        //   (so the remote control stack traversal order doesn't matter).
+        final Iterator<RemoteControlStackEntry> stackIterator = mRCStack.iterator();
+        while(stackIterator.hasNext()) {
+            RemoteControlStackEntry rcse = stackIterator.next();
+            if(rcse.mRcClient != null) {
+                try {
+                    rcse.mRcClient.enableRemoteControlDisplay(rcd, enabled);
+                } catch (RemoteException e) {
+                    Log.e(TAG, "Error connecting RCD to client: ", e);
+                }
+            }
+        }
+    }
+
     /**
      * Is the remote control display interface already registered
      * @param rcd
@@ -1937,8 +2151,11 @@
      *   display doesn't need to receive artwork.
      * @param h the maximum height of the expected bitmap. Negative or zero values indicate this
      *   display doesn't need to receive artwork.
+     * @param listenerComp the component for the listener interface, may be null if it's not needed
+     *   to verify it belongs to one of the enabled notification listeners
      */
-    protected void registerRemoteControlDisplay(IRemoteControlDisplay rcd, int w, int h) {
+    private void registerRemoteControlDisplay_int(IRemoteControlDisplay rcd, int w, int h,
+            ComponentName listenerComp) {
         if (DEBUG_RC) Log.d(TAG, ">>> registerRemoteControlDisplay("+rcd+")");
         synchronized(mAudioFocusLock) {
             synchronized(mRCStack) {
@@ -1946,6 +2163,8 @@
                     return;
                 }
                 DisplayInfoForServer di = new DisplayInfoForServer(rcd, w, h);
+                di.mEnabled = true;
+                di.mClientNotifListComp = listenerComp;
                 if (!di.init()) {
                     if (DEBUG_RC) Log.e(TAG, " error registering RCD");
                     return;
diff --git a/media/java/android/media/RemoteControlClient.java b/media/java/android/media/RemoteControlClient.java
index 497b8b3..0c00aba 100644
--- a/media/java/android/media/RemoteControlClient.java
+++ b/media/java/android/media/RemoteControlClient.java
@@ -1049,6 +1049,7 @@
         private int mArtworkExpectedWidth;
         private int mArtworkExpectedHeight;
         private boolean mWantsPositionSync = false;
+        private boolean mEnabled = true;
 
         DisplayInfoForClient(IRemoteControlDisplay rcd, int w, int h) {
             mRcDisplay = rcd;
@@ -1165,6 +1166,14 @@
             }
         }
 
+        public void enableRemoteControlDisplay(IRemoteControlDisplay rcd, boolean enabled) {
+            // only post messages, we can't block here
+            if ((mEventHandler != null) && (rcd != null)) {
+                mEventHandler.sendMessage(mEventHandler.obtainMessage(
+                        MSG_DISPLAY_ENABLE, enabled ? 1 : 0, 0/*arg2 ignored*/, rcd));
+            }
+        }
+
         public void seekTo(int generationId, long timeMs) {
             // only post messages, we can't block here
             if (mEventHandler != null) {
@@ -1227,6 +1236,7 @@
     private final static int MSG_DISPLAY_WANTS_POS_SYNC = 12;
     private final static int MSG_UPDATE_METADATA = 13;
     private final static int MSG_REQUEST_METADATA_ARTWORK = 14;
+    private final static int MSG_DISPLAY_ENABLE = 15;
 
     private class EventHandler extends Handler {
         public EventHandler(RemoteControlClient rcc, Looper looper) {
@@ -1290,6 +1300,9 @@
                 case MSG_UPDATE_METADATA:
                     onUpdateMetadata(msg.arg1, msg.arg2, msg.obj);
                     break;
+                case MSG_DISPLAY_ENABLE:
+                    onDisplayEnable((IRemoteControlDisplay)msg.obj, msg.arg1 == 1);
+                    break;
                 default:
                     Log.e(TAG, "Unknown event " + msg.what + " in RemoteControlClient handler");
             }
@@ -1315,13 +1328,15 @@
             final Iterator<DisplayInfoForClient> displayIterator = mRcDisplays.iterator();
             while (displayIterator.hasNext()) {
                 final DisplayInfoForClient di = (DisplayInfoForClient) displayIterator.next();
-                try {
-                    di.mRcDisplay.setPlaybackState(mInternalClientGenId,
-                            mPlaybackState, mPlaybackStateChangeTimeMs, mPlaybackPositionMs,
-                            mPlaybackSpeed);
-                } catch (RemoteException e) {
-                    Log.e(TAG, "Error in setPlaybackState(), dead display " + di.mRcDisplay, e);
-                    displayIterator.remove();
+                if (di.mEnabled) {
+                    try {
+                        di.mRcDisplay.setPlaybackState(mInternalClientGenId,
+                                mPlaybackState, mPlaybackStateChangeTimeMs, mPlaybackPositionMs,
+                                mPlaybackSpeed);
+                    } catch (RemoteException e) {
+                        Log.e(TAG, "Error in setPlaybackState(), dead display " + di.mRcDisplay, e);
+                        displayIterator.remove();
+                    }
                 }
             }
         }
@@ -1341,11 +1356,13 @@
             final Iterator<DisplayInfoForClient> displayIterator = mRcDisplays.iterator();
             while (displayIterator.hasNext()) {
                 final DisplayInfoForClient di = (DisplayInfoForClient) displayIterator.next();
-                try {
-                    di.mRcDisplay.setMetadata(mInternalClientGenId, mMetadata);
-                } catch (RemoteException e) {
-                    Log.e(TAG, "Error in setMetadata(), dead display " + di.mRcDisplay, e);
-                    displayIterator.remove();
+                if (di.mEnabled) {
+                    try {
+                        di.mRcDisplay.setMetadata(mInternalClientGenId, mMetadata);
+                    } catch (RemoteException e) {
+                        Log.e(TAG, "Error in setMetadata(), dead display " + di.mRcDisplay, e);
+                        displayIterator.remove();
+                    }
                 }
             }
         }
@@ -1367,13 +1384,15 @@
             final Iterator<DisplayInfoForClient> displayIterator = mRcDisplays.iterator();
             while (displayIterator.hasNext()) {
                 final DisplayInfoForClient di = (DisplayInfoForClient) displayIterator.next();
-                try {
-                    di.mRcDisplay.setTransportControlInfo(mInternalClientGenId,
-                            mTransportControlFlags, mPlaybackPositionCapabilities);
-                } catch (RemoteException e) {
-                    Log.e(TAG, "Error in setTransportControlFlags(), dead display " + di.mRcDisplay,
-                            e);
-                    displayIterator.remove();
+                if (di.mEnabled) {
+                    try {
+                        di.mRcDisplay.setTransportControlInfo(mInternalClientGenId,
+                                mTransportControlFlags, mPlaybackPositionCapabilities);
+                    } catch (RemoteException e) {
+                        Log.e(TAG, "Error in setTransportControlFlags(), dead display " + di.mRcDisplay,
+                                e);
+                        displayIterator.remove();
+                    }
                 }
             }
         }
@@ -1438,12 +1457,14 @@
             while (displayIterator.hasNext()) {
                 final DisplayInfoForClient di = (DisplayInfoForClient) displayIterator.next();
                 try {
-                    if ((di.mArtworkExpectedWidth > 0) && (di.mArtworkExpectedHeight > 0)) {
-                        Bitmap artwork = scaleBitmapIfTooBig(mOriginalArtwork,
-                                di.mArtworkExpectedWidth, di.mArtworkExpectedHeight);
-                        di.mRcDisplay.setAllMetadata(mInternalClientGenId, mMetadata, artwork);
-                    } else {
-                        di.mRcDisplay.setMetadata(mInternalClientGenId, mMetadata);
+                    if (di.mEnabled) {
+                        if ((di.mArtworkExpectedWidth > 0) && (di.mArtworkExpectedHeight > 0)) {
+                            Bitmap artwork = scaleBitmapIfTooBig(mOriginalArtwork,
+                                    di.mArtworkExpectedWidth, di.mArtworkExpectedHeight);
+                            di.mRcDisplay.setAllMetadata(mInternalClientGenId, mMetadata, artwork);
+                        } else {
+                            di.mRcDisplay.setMetadata(mInternalClientGenId, mMetadata);
+                        }
                     }
                 } catch (RemoteException e) {
                     Log.e(TAG, "Error when setting metadata, dead display " + di.mRcDisplay, e);
@@ -1578,8 +1599,10 @@
                         ((di.mArtworkExpectedWidth != w) || (di.mArtworkExpectedHeight != h))) {
                     di.mArtworkExpectedWidth = w;
                     di.mArtworkExpectedHeight = h;
-                    if (!sendArtworkToDisplay(di)) {
-                        displayIterator.remove();
+                    if (di.mEnabled) {
+                        if (!sendArtworkToDisplay(di)) {
+                            displayIterator.remove();
+                        }
                     }
                     break;
                 }
@@ -1597,11 +1620,13 @@
             //  that gets upated, and whether the list has one entry that wants position sync
             while (displayIterator.hasNext()) {
                 final DisplayInfoForClient di = (DisplayInfoForClient) displayIterator.next();
-                if (di.mRcDisplay.asBinder().equals(rcd.asBinder())) {
-                    di.mWantsPositionSync = wantsSync;
-                }
-                if (di.mWantsPositionSync) {
-                    newNeedsPositionSync = true;
+                if (di.mEnabled) {
+                    if (di.mRcDisplay.asBinder().equals(rcd.asBinder())) {
+                        di.mWantsPositionSync = wantsSync;
+                    }
+                    if (di.mWantsPositionSync) {
+                        newNeedsPositionSync = true;
+                    }
                 }
             }
             mNeedsPositionSync = newNeedsPositionSync;
@@ -1612,6 +1637,19 @@
         }
     }
 
+    /** pre-condition rcd != null */
+    private void onDisplayEnable(IRemoteControlDisplay rcd, boolean enable) {
+        synchronized(mCacheLock) {
+            final Iterator<DisplayInfoForClient> displayIterator = mRcDisplays.iterator();
+            while (displayIterator.hasNext()) {
+                final DisplayInfoForClient di = (DisplayInfoForClient) displayIterator.next();
+                if (di.mRcDisplay.asBinder().equals(rcd.asBinder())) {
+                    di.mEnabled = enable;
+                }
+            }
+        }
+    }
+
     private void onSeekTo(int generationId, long timeMs) {
         synchronized (mCacheLock) {
             if ((mCurrentClientGenId == generationId) && (mPositionUpdateListener != null)) {
diff --git a/media/java/android/media/RemoteController.java b/media/java/android/media/RemoteController.java
index 22f6343..32e85d9 100644
--- a/media/java/android/media/RemoteController.java
+++ b/media/java/android/media/RemoteController.java
@@ -42,14 +42,14 @@
  * <p>
  * A RemoteController shall be registered through
  * {@link AudioManager#registerRemoteController(RemoteController)} in order for the system to send
- * media event updates to the listener set in
- * {@link #setOnClientUpdateListener(OnClientUpdateListener)}. This listener is a subclass of
- * the {@link OnClientUpdateListener} abstract class. Override its methods to receive the
- * information published by the active {@link RemoteControlClient} instances.
- * By default an {@link OnClientUpdateListener} implementation will not receive bitmaps for album
- * art. Use {@link #setArtworkConfiguration(int, int)} to receive images as well.
+ * media event updates to the {@link OnClientUpdateListener} listener set in the class constructor.
+ * Implement the methods of the interface to receive the information published by the active
+ * {@link RemoteControlClient} instances.
+ * <br>By default an {@link OnClientUpdateListener} implementation will not receive bitmaps for
+ * album art. Use {@link #setArtworkConfiguration(int, int)} to receive images as well.
  * <p>
- * Registration requires the {@link Manifest.permission#MEDIA_CONTENT_CONTROL} permission.
+ * Registration requires the {@link OnClientUpdateListener} listener to be one of the enabled
+ * notification listeners (see {@link android.service.notification.NotificationListenerService}).
  */
 public final class RemoteController
 {
@@ -77,30 +77,39 @@
     private PendingIntent mClientPendingIntentCurrent;
     private OnClientUpdateListener mOnClientUpdateListener;
     private PlaybackInfo mLastPlaybackInfo;
-    private int mLastTransportControlFlags = TRANSPORT_UNKNOWN;
     private int mArtworkWidth = -1;
     private int mArtworkHeight = -1;
+    private boolean mEnabled = true;
 
     /**
      * Class constructor.
-     * @param context non-null the {@link Context}, must be non-null
-     * @throws java.lang.IllegalArgumentException
+     * @param context the {@link Context}, must be non-null.
+     * @param updateListener the listener to be called whenever new client information is available,
+     *     must be non-null.
+     * @throws IllegalArgumentException
      */
-    public RemoteController(Context context) throws IllegalArgumentException {
-        this(context, null);
+    public RemoteController(Context context, OnClientUpdateListener updateListener)
+            throws IllegalArgumentException {
+        this(context, updateListener, null);
     }
 
     /**
      * Class constructor.
+     * @param context the {@link Context}, must be non-null.
+     * @param updateListener the listener to be called whenever new client information is available,
+     *     must be non-null.
      * @param looper the {@link Looper} on which to run the event loop,
      *     or null to use the current thread's looper.
-     * @param context the {@link Context}, must be non-null
      * @throws java.lang.IllegalArgumentException
      */
-    public RemoteController(Context context, Looper looper) throws IllegalArgumentException {
+    public RemoteController(Context context, OnClientUpdateListener updateListener, Looper looper)
+            throws IllegalArgumentException {
         if (context == null) {
             throw new IllegalArgumentException("Invalid null Context");
         }
+        if (updateListener == null) {
+            throw new IllegalArgumentException("Invalid null OnClientUpdateListener");
+        }
         if (looper != null) {
             mEventHandler = new EventHandler(this, looper);
         } else {
@@ -111,6 +120,7 @@
                 throw new IllegalArgumentException("Calling thread not associated with a looper");
             }
         }
+        mOnClientUpdateListener = updateListener;
         mContext = context;
         mRcd = new RcDisplay();
         mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
@@ -125,31 +135,31 @@
 
 
     /**
-     * An abstract class definition for the callbacks to be invoked whenever media events, metadata
+     * Interface definition for the callbacks to be invoked whenever media events, metadata
      * and playback status are available.
      */
-    public static abstract class OnClientUpdateListener {
+    public interface OnClientUpdateListener {
         /**
-         * The method called whenever all information previously received through the other
+         * Called whenever all information, previously received through the other
          * methods of the listener, is no longer valid and is about to be refreshed.
          * This is typically called whenever a new {@link RemoteControlClient} has been selected
          * by the system to have its media information published.
          * @param clearing true if there is no selected RemoteControlClient and no information
          *     is available.
          */
-        public void onClientChange(boolean clearing) { }
+        public void onClientChange(boolean clearing);
 
         /**
-         * The method called whenever the playback state has changed.
+         * Called whenever the playback state has changed.
          * It is called when no information is known about the playback progress in the media and
          * the playback speed.
          * @param state one of the playback states authorized
          *     in {@link RemoteControlClient#setPlaybackState(int)}.
          */
-        public void onClientPlaybackStateUpdate(int state) { }
+        public void onClientPlaybackStateUpdate(int state);
         /**
-         * The method called whenever the playback state has changed, and playback position and
-         * speed are known.
+         * Called whenever the playback state has changed, and playback position
+         * and speed are known.
          * @param state one of the playback states authorized
          *     in {@link RemoteControlClient#setPlaybackState(int)}.
          * @param stateChangeTimeMs the system time at which the state change was reported,
@@ -161,15 +171,15 @@
          *    playing (e.g. when state is {@link RemoteControlClient#PLAYSTATE_ERROR}).
          */
         public void onClientPlaybackStateUpdate(int state, long stateChangeTimeMs,
-                long currentPosMs, float speed) { }
+                long currentPosMs, float speed);
         /**
-         * The method called whenever the transport control flags have changed.
+         * Called whenever the transport control flags have changed.
          * @param transportControlFlags one of the flags authorized
          *     in {@link RemoteControlClient#setTransportControlFlags(int)}.
          */
-        public void onClientTransportControlUpdate(int transportControlFlags) { }
+        public void onClientTransportControlUpdate(int transportControlFlags);
         /**
-         * The method called whenever new metadata is available.
+         * Called whenever new metadata is available.
          * See the {@link MediaMetadataEditor#putLong(int, long)},
          *  {@link MediaMetadataEditor#putString(int, String)},
          *  {@link MediaMetadataEditor#putBitmap(int, Bitmap)}, and
@@ -177,39 +187,9 @@
          *  can be queried.
          * @param metadataEditor the container of the new metadata.
          */
-        public void onClientMetadataUpdate(MetadataEditor metadataEditor) { }
+        public void onClientMetadataUpdate(MetadataEditor metadataEditor);
     };
 
-    /**
-     * Sets the listener to be called whenever new client information is available.
-     * This method can only be called on a registered RemoteController.
-     * @param l the update listener to be called.
-     */
-    public void setOnClientUpdateListener(OnClientUpdateListener l) {
-        synchronized(mInfoLock) {
-            mOnClientUpdateListener = l;
-            if (!mIsRegistered) {
-                // since the object is not registered, it hasn't received any information from
-                // RemoteControlClients yet, so we can exit here.
-                return;
-            }
-            if (mLastPlaybackInfo != null) {
-                sendMsg(mEventHandler, MSG_NEW_PLAYBACK_INFO, SENDMSG_REPLACE,
-                        mClientGenerationIdCurrent /*arg1*/, 0,
-                        mLastPlaybackInfo /*obj*/, 0 /*delay*/);
-            }
-            if (mLastTransportControlFlags != TRANSPORT_UNKNOWN) {
-                sendMsg(mEventHandler, MSG_NEW_TRANSPORT_INFO, SENDMSG_REPLACE,
-                        mClientGenerationIdCurrent /*arg1*/, mLastTransportControlFlags /*arg2*/,
-                        null /*obj*/, 0 /*delay*/);
-            }
-            if (mMetadataEditor != null) {
-                sendMsg(mEventHandler, MSG_NEW_METADATA, SENDMSG_QUEUE,
-                        mClientGenerationIdCurrent /*arg1*/, 0 /*arg2*/,
-                        mMetadataEditor /*obj*/, 0 /*delay*/);
-            }
-        }
-    }
 
     /**
      * @hide
@@ -256,6 +236,7 @@
         return -1;
     }
 
+
     /**
      * Send a simulated key event for a media button to be received by the current client.
      * To simulate a key press, you must first send a KeyEvent built with
@@ -280,17 +261,22 @@
      *     {@link KeyEvent#KEYCODE_MEDIA_CLOSE},
      *     {@link KeyEvent#KEYCODE_MEDIA_EJECT},
      *     or {@link KeyEvent#KEYCODE_MEDIA_AUDIO_TRACK}.
+     * @return true if the event was successfully sent, false otherwise.
+     * @throws IllegalArgumentException
      */
-    public int sendMediaKeyEvent(KeyEvent keyEvent) {
+    public boolean sendMediaKeyEvent(KeyEvent keyEvent) throws IllegalArgumentException {
         if (!MediaFocusControl.isMediaKeyCode(keyEvent.getKeyCode())) {
-            Log.e(TAG, "Cannot use sendMediaKeyEvent() for a non-media key event");
-            return ERROR_BAD_VALUE;
+            throw new IllegalArgumentException("not a media key event");
         }
         final PendingIntent pi;
         synchronized(mInfoLock) {
             if (!mIsRegistered) {
                 Log.e(TAG, "Cannot use sendMediaKeyEvent() from an unregistered RemoteController");
-                return ERROR;
+                return false;
+            }
+            if (!mEnabled) {
+                Log.e(TAG, "Cannot use sendMediaKeyEvent() from a disabled RemoteController");
+                return false;
             }
             pi = mClientPendingIntentCurrent;
         }
@@ -301,47 +287,37 @@
                 pi.send(mContext, 0, intent);
             } catch (CanceledException e) {
                 Log.e(TAG, "Error sending intent for media button down: ", e);
-                return ERROR;
+                return false;
             }
         } else {
             Log.i(TAG, "No-op when sending key click, no receiver right now");
-            return ERROR;
+            return false;
         }
-        return SUCCESS;
+        return true;
     }
 
 
-    // Error codes
-    /**
-     * Successful operation.
-     */
-    public  static final int SUCCESS            = 0;
-    /**
-     * Unspecified error.
-     */
-    public  static final int ERROR              = -1;
-    /**
-     * Operation failed due to bad parameter value.
-     */
-    public  static final int ERROR_BAD_VALUE    = -2;
-
-
     /**
      * Sets the new playback position.
      * This method can only be called on a registered RemoteController.
      * @param timeMs a 0 or positive value for the new playback position, expressed in ms.
-     * @return {@link #SUCCESS}, {@link #ERROR} or {@link #ERROR_BAD_VALUE}
+     * @return true if the command to set the playback position was successfully sent.
+     * @throws IllegalArgumentException
      */
-    public int seekTo(long timeMs) {
+    public boolean seekTo(long timeMs) throws IllegalArgumentException {
+        if (!mEnabled) {
+            Log.e(TAG, "Cannot use seekTo() from a disabled RemoteController");
+            return false;
+        }
         if (timeMs < 0) {
-            return ERROR_BAD_VALUE;
+            throw new IllegalArgumentException("illegal negative time value");
         }
         final int genId;
         synchronized (mGenLock) {
             genId = mClientGenerationIdCurrent;
         }
         mAudioManager.setRemoteControlClientPlaybackPosition(genId, timeMs);
-        return SUCCESS;
+        return true;
     }
 
 
@@ -350,9 +326,11 @@
      * @param wantBitmap
      * @param width
      * @param height
-     * @return {@link #SUCCESS}, {@link #ERROR} or {@link #ERROR_BAD_VALUE}
+     * @return true if successful
+     * @throws IllegalArgumentException
      */
-    public int setArtworkConfiguration(boolean wantBitmap, int width, int height) {
+    public boolean setArtworkConfiguration(boolean wantBitmap, int width, int height)
+            throws IllegalArgumentException {
         synchronized (mInfoLock) {
             if (wantBitmap) {
                 if ((width > 0) && (height > 0)) {
@@ -361,8 +339,7 @@
                     mArtworkWidth = width;
                     mArtworkHeight = height;
                 } else {
-                    Log.e(TAG, "Invalid dimensions");
-                    return ERROR_BAD_VALUE;
+                    throw new IllegalArgumentException("Invalid dimensions");
                 }
             } else {
                 mArtworkWidth = -1;
@@ -375,7 +352,7 @@
               //    RemoteController.getArtworkSize() when AudioManager.registerRemoteController()
               //    is called.
         }
-        return SUCCESS;
+        return true;
     }
 
     /**
@@ -383,17 +360,18 @@
      * No bitmaps will be received unless this has been specified.
      * @param width the maximum width in pixels
      * @param height  the maximum height in pixels
-     * @return {@link #SUCCESS}, {@link #ERROR} or {@link #ERROR_BAD_VALUE}
+     * @return true if the artwork dimension was successfully set.
+     * @throws IllegalArgumentException
      */
-    public int setArtworkConfiguration(int width, int height) {
+    public boolean setArtworkConfiguration(int width, int height) throws IllegalArgumentException {
         return setArtworkConfiguration(true, width, height);
     }
 
     /**
      * Prevents this RemoteController from receiving artwork images.
-     * @return {@link #SUCCESS}, {@link #ERROR}
+     * @return true if receiving artwork images was successfully disabled.
      */
-    public int clearArtworkConfiguration() {
+    public boolean clearArtworkConfiguration() {
         return setArtworkConfiguration(false, -1, -1);
     }
 
@@ -420,20 +398,20 @@
      * Set the playback position synchronization mode.
      * Must be called on a registered RemoteController.
      * @param sync {@link #POSITION_SYNCHRONIZATION_NONE} or {@link #POSITION_SYNCHRONIZATION_CHECK}
-     * @return {@link #SUCCESS}, {@link #ERROR} or {@link #ERROR_BAD_VALUE}
+     * @return true if the synchronization mode was successfully set.
+     * @throws IllegalArgumentException
      */
-    public int setSynchronizationMode(int sync) {
+    public boolean setSynchronizationMode(int sync) throws IllegalArgumentException {
         if ((sync != POSITION_SYNCHRONIZATION_NONE) || (sync != POSITION_SYNCHRONIZATION_CHECK)) {
-            Log.e(TAG, "Unknown synchronization mode");
-            return ERROR_BAD_VALUE;
+            throw new IllegalArgumentException("Unknown synchronization mode " + sync);
         }
         if (!mIsRegistered) {
             Log.e(TAG, "Cannot set synchronization mode on an unregistered RemoteController");
-            return ERROR;
+            return false;
         }
         mAudioManager.remoteControlDisplayWantsPlaybackPositionSync(mRcd,
                 POSITION_SYNCHRONIZATION_CHECK == sync);
-        return SUCCESS;
+        return true;
     }
 
 
@@ -548,6 +526,11 @@
             }
         }
 
+        public void setEnabled(boolean enabled) {
+            sendMsg(mEventHandler, MSG_DISPLAY_ENABLE, SENDMSG_REPLACE,
+                    enabled ? 1 : 0 /*arg1*/, 0, null /*obj*/, 0 /*delay*/);
+        }
+
         public void setPlaybackState(int genId, int state,
                 long stateChangeTimeMs, long currentPosMs, float speed) {
             if (DEBUG) {
@@ -642,6 +625,7 @@
     private final static int MSG_NEW_TRANSPORT_INFO = 2;
     private final static int MSG_NEW_METADATA       = 3; // msg always has non-null obj parameter
     private final static int MSG_CLIENT_CHANGE      = 4;
+    private final static int MSG_DISPLAY_ENABLE     = 5;
 
     private class EventHandler extends Handler {
 
@@ -667,6 +651,9 @@
                 case MSG_CLIENT_CHANGE:
                     onClientChange(msg.arg1, msg.arg2 == 1);
                     break;
+                case MSG_DISPLAY_ENABLE:
+                    onDisplayEnable(msg.arg1 == 1);
+                    break;
                 default:
                     Log.e(TAG, "unknown event " + msg.what);
             }
@@ -735,7 +722,6 @@
         final OnClientUpdateListener l;
         synchronized(mInfoLock) {
             l = mOnClientUpdateListener;
-            mLastTransportControlFlags = transportControlFlags;
         }
         if (l != null) {
             l.onClientTransportControlUpdate(transportControlFlags);
@@ -797,6 +783,37 @@
         }
     }
 
+    private void onDisplayEnable(boolean enabled) {
+        final OnClientUpdateListener l;
+        synchronized(mInfoLock) {
+            mEnabled = enabled;
+            l = this.mOnClientUpdateListener;
+        }
+        if (!enabled) {
+            // when disabling, reset all info sent to the user
+            final int genId;
+            synchronized (mGenLock) {
+                genId = mClientGenerationIdCurrent;
+            }
+            // send "stopped" state, happened "now", playback position is 0, speed 0.0f
+            final PlaybackInfo pi = new PlaybackInfo(RemoteControlClient.PLAYSTATE_STOPPED,
+                    SystemClock.elapsedRealtime() /*stateChangeTimeMs*/,
+                    0 /*currentPosMs*/, 0.0f /*speed*/);
+            sendMsg(mEventHandler, MSG_NEW_PLAYBACK_INFO, SENDMSG_REPLACE,
+                    genId /*arg1*/, 0 /*arg2, ignored*/, pi /*obj*/, 0 /*delay*/);
+            // send "blank" transport control info: no controls are supported
+            sendMsg(mEventHandler, MSG_NEW_TRANSPORT_INFO, SENDMSG_REPLACE,
+                    genId /*arg1*/, 0 /*arg2, no flags*/,
+                    null /*obj, ignored*/, 0 /*delay*/);
+            // send dummy metadata with empty string for title and artist, duration of 0
+            Bundle metadata = new Bundle(3);
+            metadata.putString(String.valueOf(MediaMetadataRetriever.METADATA_KEY_TITLE), "");
+            metadata.putString(String.valueOf(MediaMetadataRetriever.METADATA_KEY_ARTIST), "");
+            metadata.putLong(String.valueOf(MediaMetadataRetriever.METADATA_KEY_DURATION), 0);
+            sendMsg(mEventHandler, MSG_NEW_METADATA, SENDMSG_QUEUE,
+                    genId /*arg1*/, 0 /*arg2, ignored*/, metadata /*obj*/, 0 /*delay*/);
+        }
+    }
 
     //==================================================
     private static class PlaybackInfo {
@@ -818,7 +835,7 @@
      * Used by AudioManager to mark this instance as registered.
      * @param registered
      */
-    protected void setIsRegistered(boolean registered) {
+    void setIsRegistered(boolean registered) {
         synchronized (mInfoLock) {
             mIsRegistered = registered;
         }
@@ -829,7 +846,7 @@
      * Used by AudioManager to access binder to be registered/unregistered inside MediaFocusControl
      * @return
      */
-    protected RcDisplay getRcDisplay() {
+    RcDisplay getRcDisplay() {
         return mRcd;
     }
 
@@ -838,11 +855,19 @@
      * Used by AudioManager to read the current artwork dimension
      * @return array containing width (index 0) and height (index 1) of currently set artwork size
      */
-    protected int[] getArtworkSize() {
+    int[] getArtworkSize() {
         synchronized (mInfoLock) {
             int[] size = { mArtworkWidth, mArtworkHeight };
             return size;
         }
     }
 
+    /**
+     * @hide
+     * Used by AudioManager to access user listener receiving the client update notifications
+     * @return
+     */
+    OnClientUpdateListener getUpdateListener() {
+        return mOnClientUpdateListener;
+    }
 }
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/CameraMetadataTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/CameraMetadataTest.java
index 874e078..3f17aa9 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/CameraMetadataTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/CameraMetadataTest.java
@@ -18,9 +18,11 @@
 
 import android.os.Parcel;
 import android.test.suitebuilder.annotation.SmallTest;
-import android.graphics.ImageFormat;
+import android.graphics.Point;
 import android.graphics.Rect;
-import android.hardware.camera2.CameraMetadata;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.Face;
 import android.hardware.camera2.Rational;
 import android.hardware.camera2.Size;
 import android.hardware.camera2.impl.CameraMetadataNative;
@@ -30,9 +32,6 @@
 import java.lang.reflect.Array;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
-import java.nio.IntBuffer;
-
-import static org.junit.Assert.assertArrayEquals;
 
 /**
  * <pre>
@@ -57,6 +56,7 @@
     // Tags
     static final int ANDROID_COLOR_CORRECTION_MODE = ANDROID_COLOR_CORRECTION_START;
     static final int ANDROID_COLOR_CORRECTION_TRANSFORM = ANDROID_COLOR_CORRECTION_START + 1;
+    static final int ANDROID_COLOR_CORRECTION_GAINS = ANDROID_COLOR_CORRECTION_START + 2;
 
     static final int ANDROID_CONTROL_AE_ANTIBANDING_MODE = ANDROID_CONTROL_START;
     static final int ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION = ANDROID_CONTROL_START + 1;
@@ -131,7 +131,8 @@
     @SmallTest
     public void testGetTypeFromTag() {
         assertEquals(TYPE_BYTE, CameraMetadataNative.getNativeType(ANDROID_COLOR_CORRECTION_MODE));
-        assertEquals(TYPE_FLOAT, CameraMetadataNative.getNativeType(ANDROID_COLOR_CORRECTION_TRANSFORM));
+        assertEquals(TYPE_RATIONAL, CameraMetadataNative.getNativeType(ANDROID_COLOR_CORRECTION_TRANSFORM));
+        assertEquals(TYPE_FLOAT, CameraMetadataNative.getNativeType(ANDROID_COLOR_CORRECTION_GAINS));
         assertEquals(TYPE_BYTE, CameraMetadataNative.getNativeType(ANDROID_CONTROL_AE_ANTIBANDING_MODE));
         assertEquals(TYPE_INT32,
                 CameraMetadataNative.getNativeType(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION));
@@ -187,30 +188,30 @@
         assertEquals(false, mMetadata.isEmpty());
 
         //
-        // android.colorCorrection.transform (3x3 matrix)
+        // android.colorCorrection.colorCorrectionGains (float x 4 array)
         //
 
-        final float[] transformMatrix = new float[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
-        byte[] transformMatrixAsByteArray = new byte[transformMatrix.length * 4];
-        ByteBuffer transformMatrixByteBuffer =
-                ByteBuffer.wrap(transformMatrixAsByteArray).order(ByteOrder.nativeOrder());
-        for (float f : transformMatrix)
-            transformMatrixByteBuffer.putFloat(f);
+        final float[] colorCorrectionGains = new float[] { 1.0f, 2.0f, 3.0f, 4.0f};
+        byte[] colorCorrectionGainsAsByteArray = new byte[colorCorrectionGains.length * 4];
+        ByteBuffer colorCorrectionGainsByteBuffer =
+                ByteBuffer.wrap(colorCorrectionGainsAsByteArray).order(ByteOrder.nativeOrder());
+        for (float f : colorCorrectionGains)
+            colorCorrectionGainsByteBuffer.putFloat(f);
 
         // Read
-        assertNull(mMetadata.readValues(ANDROID_COLOR_CORRECTION_TRANSFORM));
-        mMetadata.writeValues(ANDROID_COLOR_CORRECTION_TRANSFORM, transformMatrixAsByteArray);
+        assertNull(mMetadata.readValues(ANDROID_COLOR_CORRECTION_GAINS));
+        mMetadata.writeValues(ANDROID_COLOR_CORRECTION_GAINS, colorCorrectionGainsAsByteArray);
 
         // Write
-        assertArrayEquals(transformMatrixAsByteArray,
-                mMetadata.readValues(ANDROID_COLOR_CORRECTION_TRANSFORM));
+        assertArrayEquals(colorCorrectionGainsAsByteArray,
+                mMetadata.readValues(ANDROID_COLOR_CORRECTION_GAINS));
 
         assertEquals(2, mMetadata.getEntryCount());
         assertEquals(false, mMetadata.isEmpty());
 
         // Erase
-        mMetadata.writeValues(ANDROID_COLOR_CORRECTION_TRANSFORM, null);
-        assertNull(mMetadata.readValues(ANDROID_COLOR_CORRECTION_TRANSFORM));
+        mMetadata.writeValues(ANDROID_COLOR_CORRECTION_GAINS, null);
+        assertNull(mMetadata.readValues(ANDROID_COLOR_CORRECTION_GAINS));
         assertEquals(1, mMetadata.getEntryCount());
     }
 
@@ -279,7 +280,7 @@
     @SmallTest
     public void testReadWritePrimitiveArray() {
         // int32 (n)
-        checkKeyGetAndSetArray("android.sensor.info.availableSensitivities", int[].class,
+        checkKeyGetAndSetArray("android.sensor.info.sensitivityRange", int[].class,
                 new int[] {
                         0xC0FFEE, 0xDEADF00D
                 });
@@ -379,7 +380,9 @@
                 new AvailableFormat[] {
                         AvailableFormat.RAW_SENSOR,
                         AvailableFormat.YV12,
-                        AvailableFormat.IMPLEMENTATION_DEFINED
+                        AvailableFormat.IMPLEMENTATION_DEFINED,
+                        AvailableFormat.YCbCr_420_888,
+                        AvailableFormat.BLOB
                 });
 
     }
@@ -431,12 +434,13 @@
                         AvailableFormat.RAW_SENSOR,
                         AvailableFormat.YV12,
                         AvailableFormat.IMPLEMENTATION_DEFINED,
-                        AvailableFormat.YCbCr_420_888
+                        AvailableFormat.YCbCr_420_888,
+                        AvailableFormat.BLOB
                 });
 
-        Key<AeAntibandingMode> availableFormatsKey =
-                new Key<AeAntibandingMode>("android.scaler.availableFormats",
-                        AeAntibandingMode.class);
+        Key<AvailableFormat[]> availableFormatsKey =
+                new Key<AvailableFormat[]>("android.scaler.availableFormats",
+                        AvailableFormat[].class);
         byte[] availableFormatValues = mMetadata.readValues(CameraMetadataNative
                 .getTag(availableFormatsKey.getName()));
 
@@ -444,7 +448,8 @@
                 0x20,
                 0x32315659,
                 0x22,
-                0x23
+                0x23,
+                0x21
         };
 
         ByteBuffer bf = ByteBuffer.wrap(availableFormatValues).order(ByteOrder.nativeOrder());
@@ -523,4 +528,115 @@
     <T> void compareGeneric(T expected, T actual) {
         assertEquals(expected, actual);
     }
+
+    @SmallTest
+    public void testReadWriteOverride() {
+        //
+        // android.scaler.availableFormats (int x n array)
+        //
+        int[] availableFormats = new int[] {
+                0x20,       // RAW_SENSOR
+                0x32315659, // YV12
+                0x11,       // YCrCb_420_SP
+                0x100,      // ImageFormat.JPEG
+                0x22,       // IMPLEMENTATION_DEFINED
+                0x23,       // YCbCr_420_888
+        };
+        int[] expectedIntValues = new int[] {
+                0x20,       // RAW_SENSOR
+                0x32315659, // YV12
+                0x11,       // YCrCb_420_SP
+                0x21,       // BLOB
+                0x22,       // IMPLEMENTATION_DEFINED
+                0x23,       // YCbCr_420_888
+        };
+        int availableFormatTag = CameraMetadataNative.getTag("android.scaler.availableFormats");
+
+        // Write
+        mMetadata.set(CameraCharacteristics.SCALER_AVAILABLE_FORMATS, availableFormats);
+
+        byte[] availableFormatValues = mMetadata.readValues(availableFormatTag);
+
+        ByteBuffer bf = ByteBuffer.wrap(availableFormatValues).order(ByteOrder.nativeOrder());
+
+        assertEquals(expectedIntValues.length * 4, availableFormatValues.length);
+        for (int i = 0; i < expectedIntValues.length; ++i) {
+            assertEquals(expectedIntValues[i], bf.getInt());
+        }
+        // Read
+        byte[] availableFormatsAsByteArray = new byte[expectedIntValues.length * 4];
+        ByteBuffer availableFormatsByteBuffer =
+                ByteBuffer.wrap(availableFormatsAsByteArray).order(ByteOrder.nativeOrder());
+        for (int value : expectedIntValues) {
+            availableFormatsByteBuffer.putInt(value);
+        }
+        mMetadata.writeValues(availableFormatTag, availableFormatsAsByteArray);
+
+        int[] resultFormats = mMetadata.get(CameraCharacteristics.SCALER_AVAILABLE_FORMATS);
+        assertNotNull("result available formats shouldn't be null", resultFormats);
+        assertArrayEquals(availableFormats, resultFormats);
+
+        //
+        // android.statistics.faces (Face x n array)
+        //
+        int[] expectedFaceIds = new int[] {1, 2, 3, 4, 5};
+        byte[] expectedFaceScores = new byte[] {10, 20, 30, 40, 50};
+        int numFaces = expectedFaceIds.length;
+        Rect[] expectedRects = new Rect[numFaces];
+        for (int i = 0; i < numFaces; i++) {
+            expectedRects[i] = new Rect(i*4 + 1, i * 4 + 2, i * 4 + 3, i * 4 + 4);
+        }
+        int[] expectedFaceLM = new int[] {
+                1, 2, 3, 4, 5, 6,
+                7, 8, 9, 10, 11, 12,
+                13, 14, 15, 16, 17, 18,
+                19, 20, 21, 22, 23, 24,
+                25, 26, 27, 28, 29, 30,
+        };
+        Point[] expectedFaceLMPoints = new Point[numFaces * 3];
+        for (int i = 0; i < numFaces; i++) {
+            expectedFaceLMPoints[i*3] = new Point(expectedFaceLM[i*6], expectedFaceLM[i*6+1]);
+            expectedFaceLMPoints[i*3+1] = new Point(expectedFaceLM[i*6+2], expectedFaceLM[i*6+3]);
+            expectedFaceLMPoints[i*3+2] = new Point(expectedFaceLM[i*6+4], expectedFaceLM[i*6+5]);
+        }
+
+        /**
+         * Read - FACE_DETECT_MODE == FULL
+         */
+        mMetadata.set(CaptureResult.STATISTICS_FACE_DETECT_MODE,
+                CaptureResult.STATISTICS_FACE_DETECT_MODE_FULL);
+        mMetadata.set(CaptureResult.STATISTICS_FACE_IDS, expectedFaceIds);
+        mMetadata.set(CaptureResult.STATISTICS_FACE_SCORES, expectedFaceScores);
+        mMetadata.set(CaptureResult.STATISTICS_FACE_RECTANGLES, expectedRects);
+        mMetadata.set(CaptureResult.STATISTICS_FACE_LANDMARKS, expectedFaceLM);
+        Face[] resultFaces = mMetadata.get(CaptureResult.STATISTICS_FACES);
+        assertEquals(numFaces, resultFaces.length);
+        for (int i = 0; i < numFaces; i++) {
+            assertEquals(expectedFaceIds[i], resultFaces[i].getId());
+            assertEquals(expectedFaceScores[i], resultFaces[i].getScore());
+            assertEquals(expectedRects[i], resultFaces[i].getBounds());
+            assertEquals(expectedFaceLMPoints[i*3], resultFaces[i].getLeftEyePosition());
+            assertEquals(expectedFaceLMPoints[i*3+1], resultFaces[i].getRightEyePosition());
+            assertEquals(expectedFaceLMPoints[i*3+2], resultFaces[i].getMouthPosition());
+        }
+
+        /**
+         * Read - FACE_DETECT_MODE == SIMPLE
+         */
+        mMetadata.set(CaptureResult.STATISTICS_FACE_DETECT_MODE,
+                CaptureResult.STATISTICS_FACE_DETECT_MODE_SIMPLE);
+        mMetadata.set(CaptureResult.STATISTICS_FACE_SCORES, expectedFaceScores);
+        mMetadata.set(CaptureResult.STATISTICS_FACE_RECTANGLES, expectedRects);
+        Face[] resultSimpleFaces = mMetadata.get(CaptureResult.STATISTICS_FACES);
+        assertEquals(numFaces, resultSimpleFaces.length);
+        for (int i = 0; i < numFaces; i++) {
+            assertEquals(Face.ID_UNSUPPORTED, resultSimpleFaces[i].getId());
+            assertEquals(expectedFaceScores[i], resultSimpleFaces[i].getScore());
+            assertEquals(expectedRects[i], resultSimpleFaces[i].getBounds());
+            assertNull(resultSimpleFaces[i].getLeftEyePosition());
+            assertNull(resultSimpleFaces[i].getRightEyePosition());
+            assertNull(resultSimpleFaces[i].getMouthPosition());
+        }
+
+    }
 }
diff --git a/packages/DocumentsUI/res/drawable/item_background.xml b/packages/DocumentsUI/res/drawable/item_background.xml
index 6fcab3c..ec9be6d 100644
--- a/packages/DocumentsUI/res/drawable/item_background.xml
+++ b/packages/DocumentsUI/res/drawable/item_background.xml
@@ -18,14 +18,14 @@
 
     <item android:state_window_focused="false" android:drawable="@android:color/transparent" />
 
-    <item android:state_focused="true"   android:state_activated="true" android:drawable="@*android:drawable/list_selected_holo_light" />
-    <item android:state_focused="false"  android:state_activated="true" android:drawable="@*android:drawable/list_selected_holo_light" />
+    <item android:state_focused="true"   android:state_activated="true" android:drawable="@drawable/ic_grid_card_focused" />
+    <item android:state_focused="false"  android:state_activated="true" android:drawable="@drawable/ic_grid_card_focused" />
 
-    <item android:state_focused="true"  android:state_enabled="false" android:state_pressed="true" android:drawable="@*android:drawable/list_selector_disabled_holo_light" />
-    <item android:state_focused="true"  android:state_enabled="false"                              android:drawable="@*android:drawable/list_selector_disabled_holo_light" />
-    <item android:state_focused="true"                                android:state_pressed="true" android:drawable="@*android:drawable/list_selector_background_transition_holo_light" />
-    <item android:state_focused="false"                               android:state_pressed="true" android:drawable="@*android:drawable/list_selector_background_transition_holo_light" />
-    <item android:state_focused="true"                                                             android:drawable="@*android:drawable/list_focused_holo" />
+    <item android:state_focused="true"  android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/ic_grid_card_pressed" />
+    <item android:state_focused="true"  android:state_enabled="false"                              android:drawable="@drawable/ic_grid_card_pressed" />
+    <item android:state_focused="true"                                android:state_pressed="true" android:drawable="@drawable/ic_grid_card_pressed" />
+    <item android:state_focused="false"                               android:state_pressed="true" android:drawable="@drawable/ic_grid_card_pressed" />
+    <item android:state_focused="true"                                                             android:drawable="@drawable/ic_grid_card_pressed" />
 
     <item android:drawable="@android:color/transparent" />
 
diff --git a/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml b/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml
index 851061f..adbb9da 100644
--- a/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml
+++ b/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml
@@ -64,7 +64,7 @@
             android:layout_weight="0.5"
             android:layout_marginEnd="12dp"
             android:singleLine="true"
-            android:ellipsize="marquee"
+            android:ellipsize="middle"
             android:textAlignment="viewStart"
             style="@style/TextAppearance.Medium" />
 
@@ -83,7 +83,7 @@
             android:layout_weight="0.25"
             android:layout_marginEnd="12dp"
             android:singleLine="true"
-            android:ellipsize="marquee"
+            android:ellipsize="end"
             android:textAlignment="viewStart"
             style="@style/TextAppearance.Small" />
 
@@ -95,7 +95,7 @@
             android:layout_marginEnd="12dp"
             android:minWidth="70dp"
             android:singleLine="true"
-            android:ellipsize="marquee"
+            android:ellipsize="end"
             android:textAlignment="viewEnd"
             style="@style/TextAppearance.Small" />
 
@@ -107,7 +107,7 @@
             android:layout_marginEnd="12dp"
             android:minWidth="70dp"
             android:singleLine="true"
-            android:ellipsize="marquee"
+            android:ellipsize="end"
             android:textAlignment="viewEnd"
             style="@style/TextAppearance.Small" />
 
diff --git a/packages/DocumentsUI/res/layout/item_doc_grid.xml b/packages/DocumentsUI/res/layout/item_doc_grid.xml
index bb5dce1..3aef1cd 100644
--- a/packages/DocumentsUI/res/layout/item_doc_grid.xml
+++ b/packages/DocumentsUI/res/layout/item_doc_grid.xml
@@ -67,7 +67,7 @@
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
                 android:singleLine="true"
-                android:ellipsize="marquee"
+                android:ellipsize="middle"
                 android:textAlignment="viewStart"
                 style="@style/TextAppearance.Medium" />
 
@@ -97,7 +97,7 @@
                 android:layout_height="wrap_content"
                 android:layout_weight="0.5"
                 android:singleLine="true"
-                android:ellipsize="marquee"
+                android:ellipsize="end"
                 android:textAlignment="viewStart"
                 style="@style/TextAppearance.Small" />
 
@@ -108,7 +108,7 @@
                 android:layout_weight="0.5"
                 android:layout_marginStart="8dp"
                 android:singleLine="true"
-                android:ellipsize="marquee"
+                android:ellipsize="end"
                 android:textAlignment="viewStart"
                 style="@style/TextAppearance.Small" />
 
diff --git a/packages/DocumentsUI/res/layout/item_doc_list.xml b/packages/DocumentsUI/res/layout/item_doc_list.xml
index 4c5b2e3..e3a0ddd 100644
--- a/packages/DocumentsUI/res/layout/item_doc_list.xml
+++ b/packages/DocumentsUI/res/layout/item_doc_list.xml
@@ -68,7 +68,7 @@
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
                 android:singleLine="true"
-                android:ellipsize="marquee"
+                android:ellipsize="middle"
                 android:textAlignment="viewStart"
                 style="@style/TextAppearance.Medium" />
 
@@ -92,24 +92,20 @@
 
             <TextView
                 android:id="@+id/date"
-                android:layout_width="0dp"
+                android:layout_width="90dp"
                 android:layout_height="wrap_content"
-                android:layout_weight="0.25"
-                android:minWidth="70dp"
                 android:singleLine="true"
-                android:ellipsize="marquee"
+                android:ellipsize="end"
                 android:textAlignment="viewStart"
                 style="@style/TextAppearance.Small" />
 
             <TextView
                 android:id="@+id/size"
-                android:layout_width="0dp"
+                android:layout_width="90dp"
                 android:layout_height="wrap_content"
-                android:layout_weight="0.25"
                 android:layout_marginStart="8dp"
-                android:minWidth="70dp"
                 android:singleLine="true"
-                android:ellipsize="marquee"
+                android:ellipsize="end"
                 android:textAlignment="viewStart"
                 style="@style/TextAppearance.Small" />
 
@@ -117,10 +113,10 @@
                 android:id="@android:id/summary"
                 android:layout_width="0dp"
                 android:layout_height="wrap_content"
-                android:layout_weight="0.5"
+                android:layout_weight="1"
                 android:layout_marginStart="8dp"
                 android:singleLine="true"
-                android:ellipsize="marquee"
+                android:ellipsize="end"
                 android:textAlignment="viewStart"
                 style="@style/TextAppearance.Small" />
 
diff --git a/packages/DocumentsUI/res/layout/item_root.xml b/packages/DocumentsUI/res/layout/item_root.xml
index 9b52d85..f17c261 100644
--- a/packages/DocumentsUI/res/layout/item_root.xml
+++ b/packages/DocumentsUI/res/layout/item_root.xml
@@ -43,7 +43,7 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:singleLine="true"
-            android:ellipsize="marquee"
+            android:ellipsize="end"
             android:textAlignment="viewStart"
             style="@style/TextAppearance.Medium" />
 
@@ -52,7 +52,7 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:singleLine="true"
-            android:ellipsize="marquee"
+            android:ellipsize="end"
             android:textAlignment="viewStart"
             style="@style/TextAppearance.Small" />
 
diff --git a/packages/DocumentsUI/res/layout/item_title.xml b/packages/DocumentsUI/res/layout/item_title.xml
index 58016f1..6e96fb5 100644
--- a/packages/DocumentsUI/res/layout/item_title.xml
+++ b/packages/DocumentsUI/res/layout/item_title.xml
@@ -38,7 +38,7 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:singleLine="true"
-        android:ellipsize="marquee"
+        android:ellipsize="middle"
         android:textAlignment="viewStart"
         style="@style/TextAppearance.Medium" />
 
diff --git a/packages/DocumentsUI/res/values-bg/strings.xml b/packages/DocumentsUI/res/values-bg/strings.xml
index 20f4de9..b703541 100644
--- a/packages/DocumentsUI/res/values-bg/strings.xml
+++ b/packages/DocumentsUI/res/values-bg/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Скриване на основните елементи"</string>
     <string name="save_error" msgid="6167009778003223664">"Запазването на документа не бе успешно"</string>
     <string name="create_error" msgid="3735649141335444215">"Създаването на папката не бе успешно"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Заявката за документи не бе успешна"</string>
     <string name="root_recent" msgid="4470053704320518133">"Скорошно"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"Свободно: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Услуги за съхранение"</string>
diff --git a/packages/DocumentsUI/res/values-es-rUS/strings.xml b/packages/DocumentsUI/res/values-es-rUS/strings.xml
index 847482b..4a3ff33 100644
--- a/packages/DocumentsUI/res/values-es-rUS/strings.xml
+++ b/packages/DocumentsUI/res/values-es-rUS/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Ocultar raíces"</string>
     <string name="save_error" msgid="6167009778003223664">"Error al guardar el documento"</string>
     <string name="create_error" msgid="3735649141335444215">"Error al crear la carpeta"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Error al consultar documentos"</string>
     <string name="root_recent" msgid="4470053704320518133">"Recientes"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> de espacio libre"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Almacenamiento"</string>
diff --git a/packages/DocumentsUI/res/values-fr-rCA/strings.xml b/packages/DocumentsUI/res/values-fr-rCA/strings.xml
index 1cb12f7..a837379 100644
--- a/packages/DocumentsUI/res/values-fr-rCA/strings.xml
+++ b/packages/DocumentsUI/res/values-fr-rCA/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Masquer les racines"</string>
     <string name="save_error" msgid="6167009778003223664">"Échec de l\'enregistrement du document"</string>
     <string name="create_error" msgid="3735649141335444215">"Échec de la création du dossier"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Échec de la demande de document"</string>
     <string name="root_recent" msgid="4470053704320518133">"Récents"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> disponible"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Services de stockage"</string>
diff --git a/packages/DocumentsUI/res/values-fr/strings.xml b/packages/DocumentsUI/res/values-fr/strings.xml
index f6d7c78..ff9aeda 100644
--- a/packages/DocumentsUI/res/values-fr/strings.xml
+++ b/packages/DocumentsUI/res/values-fr/strings.xml
@@ -17,7 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="2783841764617238354">"Documents"</string>
-    <string name="title_open" msgid="4353228937663917801">"Ouvrir sous"</string>
+    <string name="title_open" msgid="4353228937663917801">"Ouvrir à partir de"</string>
     <string name="title_save" msgid="2433679664882857999">"Enregistrer sous"</string>
     <string name="menu_create_dir" msgid="5947289605844398389">"Créer un dossier"</string>
     <string name="menu_grid" msgid="6878021334497835259">"Grille"</string>
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Masquer les répertoires racines"</string>
     <string name="save_error" msgid="6167009778003223664">"Échec de l\'enregistrement du document."</string>
     <string name="create_error" msgid="3735649141335444215">"Échec de la création du dossier."</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Échec de la demande de documents."</string>
     <string name="root_recent" msgid="4470053704320518133">"Récents"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"Espace disponible : <xliff:g id="SIZE">%1$s</xliff:g>"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Services de stockage"</string>
diff --git a/packages/DocumentsUI/res/values-hy-rAM/strings.xml b/packages/DocumentsUI/res/values-hy-rAM/strings.xml
index 3ab7bc9..c683f3e 100644
--- a/packages/DocumentsUI/res/values-hy-rAM/strings.xml
+++ b/packages/DocumentsUI/res/values-hy-rAM/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Թաքցնել արմատները"</string>
     <string name="save_error" msgid="6167009778003223664">"Չհաջողվեց պահել փաստաթուղթը"</string>
     <string name="create_error" msgid="3735649141335444215">"Չհաջողվեց ստեղծել թղթապանակը"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Փաստաթղթերին հարցում կատարելիս սխալ տեղի ունեցավ"</string>
     <string name="root_recent" msgid="4470053704320518133">"Վերջին"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ազատ է"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Պահուստի ծառայություններ"</string>
diff --git a/packages/DocumentsUI/res/values-in/strings.xml b/packages/DocumentsUI/res/values-in/strings.xml
index aad26b6..519b936 100644
--- a/packages/DocumentsUI/res/values-in/strings.xml
+++ b/packages/DocumentsUI/res/values-in/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Sembunyikan akar"</string>
     <string name="save_error" msgid="6167009778003223664">"Gagal menyimpan dokumen"</string>
     <string name="create_error" msgid="3735649141335444215">"Gagal membuat folder"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Gagal mengirim kueri untuk dokumen"</string>
     <string name="root_recent" msgid="4470053704320518133">"Terkini"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> bebas"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Layanan penyimpanan"</string>
diff --git a/packages/DocumentsUI/res/values-ja/strings.xml b/packages/DocumentsUI/res/values-ja/strings.xml
index c5a50ee..996496d 100644
--- a/packages/DocumentsUI/res/values-ja/strings.xml
+++ b/packages/DocumentsUI/res/values-ja/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"ルートを非表示にする"</string>
     <string name="save_error" msgid="6167009778003223664">"ドキュメントを保存できませんでした"</string>
     <string name="create_error" msgid="3735649141335444215">"フォルダを作成できませんでした"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"ドキュメントのクエリに失敗しました"</string>
     <string name="root_recent" msgid="4470053704320518133">"最近"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"空き容量: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
     <string name="root_type_service" msgid="2178854894416775409">"ストレージサービス"</string>
diff --git a/packages/DocumentsUI/res/values-ka-rGE/strings.xml b/packages/DocumentsUI/res/values-ka-rGE/strings.xml
index 201a89c..f3e1274 100644
--- a/packages/DocumentsUI/res/values-ka-rGE/strings.xml
+++ b/packages/DocumentsUI/res/values-ka-rGE/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"ფესვების დამალვა"</string>
     <string name="save_error" msgid="6167009778003223664">"დოკუმენტის შენახვა ვერ მოხერხდა"</string>
     <string name="create_error" msgid="3735649141335444215">"საქაღალდის შექმნა ვერ მოხერხდა"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"დოკუმენტებზე მოთხოვნა ვერ გაიგზავნა"</string>
     <string name="root_recent" msgid="4470053704320518133">"ბოლო"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> თავისუფალია"</string>
     <string name="root_type_service" msgid="2178854894416775409">"მეხსიერების სერვისები"</string>
diff --git a/packages/DocumentsUI/res/values-ko/strings.xml b/packages/DocumentsUI/res/values-ko/strings.xml
index 0fef587..2cd0d44 100644
--- a/packages/DocumentsUI/res/values-ko/strings.xml
+++ b/packages/DocumentsUI/res/values-ko/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"루트 숨기기"</string>
     <string name="save_error" msgid="6167009778003223664">"문서 저장 실패"</string>
     <string name="create_error" msgid="3735649141335444215">"폴더를 만들지 못함"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"문서를 검색하지 못했습니다."</string>
     <string name="root_recent" msgid="4470053704320518133">"최근"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> 남음"</string>
     <string name="root_type_service" msgid="2178854894416775409">"저장용량 서비스"</string>
diff --git a/packages/DocumentsUI/res/values-lt/strings.xml b/packages/DocumentsUI/res/values-lt/strings.xml
index 598b417e..f861b99 100644
--- a/packages/DocumentsUI/res/values-lt/strings.xml
+++ b/packages/DocumentsUI/res/values-lt/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Slėpti šaknis"</string>
     <string name="save_error" msgid="6167009778003223664">"Nepavyko išsaugoti dokumento"</string>
     <string name="create_error" msgid="3735649141335444215">"Nepavyko sukurti aplanko"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Nepavyko pateikti dokumentų užklausų"</string>
     <string name="root_recent" msgid="4470053704320518133">"Naujausi"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"Laisvos vietos: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Saugyklos paslaugos"</string>
diff --git a/packages/DocumentsUI/res/values-ms-rMY/strings.xml b/packages/DocumentsUI/res/values-ms-rMY/strings.xml
index f7eb7fa..7e09c57 100644
--- a/packages/DocumentsUI/res/values-ms-rMY/strings.xml
+++ b/packages/DocumentsUI/res/values-ms-rMY/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Sembunyikan akar"</string>
     <string name="save_error" msgid="6167009778003223664">"Gagal menyimpan dokumen"</string>
     <string name="create_error" msgid="3735649141335444215">"Gagal membuat folder"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Gagal menanyakan dokumen"</string>
     <string name="root_recent" msgid="4470053704320518133">"Terbaharu"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> kosong"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Perkhidmatan storan"</string>
diff --git a/packages/DocumentsUI/res/values-nb/strings.xml b/packages/DocumentsUI/res/values-nb/strings.xml
index 7cf3a13..8831bd8 100644
--- a/packages/DocumentsUI/res/values-nb/strings.xml
+++ b/packages/DocumentsUI/res/values-nb/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Skjul røtter"</string>
     <string name="save_error" msgid="6167009778003223664">"Kunne ikke lagre dokumentet"</string>
     <string name="create_error" msgid="3735649141335444215">"Kunne ikke opprette mappen"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Kunne ikke undersøke dokumenter"</string>
     <string name="root_recent" msgid="4470053704320518133">"Siste"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> gratis"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Lagringstjenester"</string>
diff --git a/packages/DocumentsUI/res/values-pl/strings.xml b/packages/DocumentsUI/res/values-pl/strings.xml
index 320afc8..f4e5582 100644
--- a/packages/DocumentsUI/res/values-pl/strings.xml
+++ b/packages/DocumentsUI/res/values-pl/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Ukryj elementy główne"</string>
     <string name="save_error" msgid="6167009778003223664">"Nie udało się zapisać dokumentu"</string>
     <string name="create_error" msgid="3735649141335444215">"Nie udało się utworzyć folderu"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Nie udało się pobrać listy dokumentów"</string>
     <string name="root_recent" msgid="4470053704320518133">"Ostatnie"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> wolne"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Usługi pamięci masowej"</string>
diff --git a/packages/DocumentsUI/res/values-pt/strings.xml b/packages/DocumentsUI/res/values-pt/strings.xml
index 2c7b0bd..78fcaf8 100644
--- a/packages/DocumentsUI/res/values-pt/strings.xml
+++ b/packages/DocumentsUI/res/values-pt/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Ocultar raízes"</string>
     <string name="save_error" msgid="6167009778003223664">"Falha ao salvar o documento"</string>
     <string name="create_error" msgid="3735649141335444215">"Falha ao criar a pasta"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Falha ao consultar documentos"</string>
     <string name="root_recent" msgid="4470053704320518133">"Recentes"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> livres"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Serviços de armazenamento"</string>
diff --git a/packages/DocumentsUI/res/values-ro/strings.xml b/packages/DocumentsUI/res/values-ro/strings.xml
index b196d77..5fd44c8 100644
--- a/packages/DocumentsUI/res/values-ro/strings.xml
+++ b/packages/DocumentsUI/res/values-ro/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Ascundeți directoarele rădăcină"</string>
     <string name="save_error" msgid="6167009778003223664">"Salvarea documentului nu a reușit"</string>
     <string name="create_error" msgid="3735649141335444215">"Eroare la crearea dosarului"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Interogarea referitoare la documente nu a reușit"</string>
     <string name="root_recent" msgid="4470053704320518133">"Recente"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> spațiu liber"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Servicii de stocare"</string>
diff --git a/packages/DocumentsUI/res/values-ru/strings.xml b/packages/DocumentsUI/res/values-ru/strings.xml
index ae9bf54..85fd70e0 100644
--- a/packages/DocumentsUI/res/values-ru/strings.xml
+++ b/packages/DocumentsUI/res/values-ru/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Скрыть"</string>
     <string name="save_error" msgid="6167009778003223664">"Не удалось сохранить документ"</string>
     <string name="create_error" msgid="3735649141335444215">"Не удалось создать папку"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Не удалось отправить запрос"</string>
     <string name="root_recent" msgid="4470053704320518133">"Недавние"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"Свободно <xliff:g id="SIZE">%1$s</xliff:g>"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Службы хранения"</string>
diff --git a/packages/DocumentsUI/res/values-sk/strings.xml b/packages/DocumentsUI/res/values-sk/strings.xml
index bf20456..2a96b1a 100644
--- a/packages/DocumentsUI/res/values-sk/strings.xml
+++ b/packages/DocumentsUI/res/values-sk/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Skryť korene"</string>
     <string name="save_error" msgid="6167009778003223664">"Dokument sa nepodarilo uložiť"</string>
     <string name="create_error" msgid="3735649141335444215">"Priečinok sa nepodarilo vytvoriť"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Zoznam dokumentov sa nepodarilo načítať"</string>
     <string name="root_recent" msgid="4470053704320518133">"Nedávne"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"Voľné: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Služby úložiska"</string>
diff --git a/packages/DocumentsUI/res/values-sr/strings.xml b/packages/DocumentsUI/res/values-sr/strings.xml
index 7486741..eb0b197 100644
--- a/packages/DocumentsUI/res/values-sr/strings.xml
+++ b/packages/DocumentsUI/res/values-sr/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Сакриј основне елементе"</string>
     <string name="save_error" msgid="6167009778003223664">"Чување документа није успело"</string>
     <string name="create_error" msgid="3735649141335444215">"Директоријум није направљен"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Слање упита за документе није успело"</string>
     <string name="root_recent" msgid="4470053704320518133">"Недавно"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"Слободно је <xliff:g id="SIZE">%1$s</xliff:g>"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Услуге складиштења"</string>
diff --git a/packages/DocumentsUI/res/values-sw/strings.xml b/packages/DocumentsUI/res/values-sw/strings.xml
index 123558b7..299fda7 100644
--- a/packages/DocumentsUI/res/values-sw/strings.xml
+++ b/packages/DocumentsUI/res/values-sw/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Ficha usuli"</string>
     <string name="save_error" msgid="6167009778003223664">"Imeshindwa kuhifadhi hati"</string>
     <string name="create_error" msgid="3735649141335444215">"Ilishindwa kuunda folda"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Ilishindwa kuhoji hati"</string>
     <string name="root_recent" msgid="4470053704320518133">"Hivi karibuni"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> bila malipo"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Huduma za hifadhi"</string>
diff --git a/packages/DocumentsUI/res/values-th/strings.xml b/packages/DocumentsUI/res/values-th/strings.xml
index 503bb4e..6ac8810 100644
--- a/packages/DocumentsUI/res/values-th/strings.xml
+++ b/packages/DocumentsUI/res/values-th/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"ซ่อนราก"</string>
     <string name="save_error" msgid="6167009778003223664">"การบันทึกเอกสารล้มเหลว"</string>
     <string name="create_error" msgid="3735649141335444215">"การสร้างโฟลเดอร์ล้มเหลว"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"การค้นหาเอกสารล้มเหลว"</string>
     <string name="root_recent" msgid="4470053704320518133">"ล่าสุด"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"ว่าง <xliff:g id="SIZE">%1$s</xliff:g>"</string>
     <string name="root_type_service" msgid="2178854894416775409">"บริการที่เก็บข้อมูล"</string>
diff --git a/packages/DocumentsUI/res/values-tl/strings.xml b/packages/DocumentsUI/res/values-tl/strings.xml
index cf46bba..e0fd8c8 100644
--- a/packages/DocumentsUI/res/values-tl/strings.xml
+++ b/packages/DocumentsUI/res/values-tl/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Itago ang mga root"</string>
     <string name="save_error" msgid="6167009778003223664">"Hindi na-save ang dokumento"</string>
     <string name="create_error" msgid="3735649141335444215">"Hindi nagawa ang folder"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Hindi na-query ang mga dokumento"</string>
     <string name="root_recent" msgid="4470053704320518133">"Kamakailan"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ang libre"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Mga serbisyo ng storage"</string>
diff --git a/packages/DocumentsUI/res/values-tr/strings.xml b/packages/DocumentsUI/res/values-tr/strings.xml
index d4db48d..699a5cd 100644
--- a/packages/DocumentsUI/res/values-tr/strings.xml
+++ b/packages/DocumentsUI/res/values-tr/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Kökleri sakla"</string>
     <string name="save_error" msgid="6167009778003223664">"Doküman kaydedilemedi"</string>
     <string name="create_error" msgid="3735649141335444215">"Klasör oluşturulamadı"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Dokümanlar sorgulanamadı"</string>
     <string name="root_recent" msgid="4470053704320518133">"En son"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> boş"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Depolama hizmetleri"</string>
diff --git a/packages/DocumentsUI/res/values-vi/strings.xml b/packages/DocumentsUI/res/values-vi/strings.xml
index 915fd24..41e29fa 100644
--- a/packages/DocumentsUI/res/values-vi/strings.xml
+++ b/packages/DocumentsUI/res/values-vi/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Ẩn gốc"</string>
     <string name="save_error" msgid="6167009778003223664">"Không lưu tài liệu được"</string>
     <string name="create_error" msgid="3735649141335444215">"Không thể tạo thư mục"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"Không truy vấn được tài liệu"</string>
     <string name="root_recent" msgid="4470053704320518133">"Gần đây"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> còn trống"</string>
     <string name="root_type_service" msgid="2178854894416775409">"Dịch vụ lưu trữ"</string>
diff --git a/packages/DocumentsUI/res/values-zh-rCN/strings.xml b/packages/DocumentsUI/res/values-zh-rCN/strings.xml
index 93678b1..742cda7 100644
--- a/packages/DocumentsUI/res/values-zh-rCN/strings.xml
+++ b/packages/DocumentsUI/res/values-zh-rCN/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"隐藏根目录"</string>
     <string name="save_error" msgid="6167009778003223664">"无法保存文档"</string>
     <string name="create_error" msgid="3735649141335444215">"无法创建文件夹"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"无法查询文档"</string>
     <string name="root_recent" msgid="4470053704320518133">"最近"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"可用空间:<xliff:g id="SIZE">%1$s</xliff:g>"</string>
     <string name="root_type_service" msgid="2178854894416775409">"存储服务"</string>
diff --git a/packages/DocumentsUI/res/values-zh-rHK/strings.xml b/packages/DocumentsUI/res/values-zh-rHK/strings.xml
index 09c40c9..67ed587 100644
--- a/packages/DocumentsUI/res/values-zh-rHK/strings.xml
+++ b/packages/DocumentsUI/res/values-zh-rHK/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"隱藏根目錄"</string>
     <string name="save_error" msgid="6167009778003223664">"無法儲存文件"</string>
     <string name="create_error" msgid="3735649141335444215">"無法建立資料夾"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"無法查詢文件"</string>
     <string name="root_recent" msgid="4470053704320518133">"近期用過"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"可用空間:<xliff:g id="SIZE">%1$s</xliff:g>"</string>
     <string name="root_type_service" msgid="2178854894416775409">"儲存空間服務"</string>
diff --git a/packages/DocumentsUI/res/values-zh-rTW/strings.xml b/packages/DocumentsUI/res/values-zh-rTW/strings.xml
index 439e92a..269583a 100644
--- a/packages/DocumentsUI/res/values-zh-rTW/strings.xml
+++ b/packages/DocumentsUI/res/values-zh-rTW/strings.xml
@@ -37,8 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"隱藏根目錄"</string>
     <string name="save_error" msgid="6167009778003223664">"無法儲存文件"</string>
     <string name="create_error" msgid="3735649141335444215">"無法建立資料夾"</string>
-    <!-- no translation found for query_error (1222448261663503501) -->
-    <skip />
+    <string name="query_error" msgid="1222448261663503501">"無法查詢文件"</string>
     <string name="root_recent" msgid="4470053704320518133">"最近使用過的項目"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"可用空間:<xliff:g id="SIZE">%1$s</xliff:g>"</string>
     <string name="root_type_service" msgid="2178854894416775409">"儲存空間服務"</string>
diff --git a/packages/DocumentsUI/res/values-zu/strings.xml b/packages/DocumentsUI/res/values-zu/strings.xml
index 12c0b56..bedd2cdf 100644
--- a/packages/DocumentsUI/res/values-zu/strings.xml
+++ b/packages/DocumentsUI/res/values-zu/strings.xml
@@ -31,7 +31,7 @@
     <string name="menu_delete" msgid="8138799623850614177">"Susa"</string>
     <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> okukhethiwe"</string>
     <string name="sort_name" msgid="9183560467917256779">"Ngegama"</string>
-    <string name="sort_date" msgid="586080032956151448">"Kuguqulwe ngedethi"</string>
+    <string name="sort_date" msgid="586080032956151448">"Ngedethi yokuguqula"</string>
     <string name="sort_size" msgid="3350681319735474741">"Ngosayizi"</string>
     <string name="drawer_open" msgid="4545466532430226949">"Bonisa izimpande"</string>
     <string name="drawer_close" msgid="7602734368552123318">"Fihla izimpande"</string>
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
index 59caad0..1f3901c 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
@@ -216,6 +216,10 @@
             final View view = target.getChildAt(i);
             mRecycleListener.onMovedToScrapHeap(view);
         }
+
+        // Tear down any selection in progress
+        mListView.setChoiceMode(AbsListView.CHOICE_MODE_NONE);
+        mGridView.setChoiceMode(AbsListView.CHOICE_MODE_NONE);
     }
 
     @Override
@@ -291,6 +295,11 @@
 
                 updateDisplayState();
 
+                // When launched into empty recents, show drawer
+                if (mType == TYPE_RECENT_OPEN && mAdapter.isEmpty() && !state.stackTouched) {
+                    ((DocumentsActivity) context).setRootsDrawerOpen(true);
+                }
+
                 // Restore any previous instance state
                 final SparseArray<Parcelable> container = state.dirState.remove(mStateKey);
                 if (container != null && !getArguments().getBoolean(EXTRA_IGNORE_STATE, false)) {
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java
index 3954173..05766f5 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java
@@ -109,6 +109,11 @@
             public void onLoadFinished(
                     Loader<List<DocumentStack>> loader, List<DocumentStack> data) {
                 mAdapter.swapStacks(data);
+
+                // When launched into empty recents, show drawer
+                if (mAdapter.isEmpty() && !state.stackTouched) {
+                    ((DocumentsActivity) context).setRootsDrawerOpen(true);
+                }
             }
 
             @Override
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
index bad0a96..eb56765 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
@@ -21,9 +21,11 @@
 import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.Context;
+import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ProviderInfo;
+import android.content.pm.ResolveInfo;
 import android.database.ContentObserver;
 import android.database.Cursor;
 import android.net.Uri;
@@ -158,6 +160,9 @@
     private class UpdateTask extends AsyncTask<Void, Void, Void> {
         private final String mFilterPackage;
 
+        private final Multimap<String, RootInfo> mTaskRoots = ArrayListMultimap.create();
+        private final HashSet<String> mTaskStoppedAuthorities = Sets.newHashSet();
+
         /**
          * Update all roots.
          */
@@ -177,54 +182,64 @@
         protected Void doInBackground(Void... params) {
             final long start = SystemClock.elapsedRealtime();
 
-            final Multimap<String, RootInfo> roots = ArrayListMultimap.create();
-            final HashSet<String> stoppedAuthorities = Sets.newHashSet();
-
-            roots.put(mRecentsRoot.authority, mRecentsRoot);
+            mTaskRoots.put(mRecentsRoot.authority, mRecentsRoot);
 
             final ContentResolver resolver = mContext.getContentResolver();
             final PackageManager pm = mContext.getPackageManager();
-            final List<ProviderInfo> providers = pm.queryContentProviders(
+
+            // Pick up provider with action string
+            final Intent intent = new Intent(DocumentsContract.PROVIDER_INTERFACE);
+            final List<ResolveInfo> providers = pm.queryIntentContentProviders(intent, 0);
+            for (ResolveInfo info : providers) {
+                handleDocumentsProvider(info.providerInfo);
+            }
+
+            // Pick up legacy providers
+            final List<ProviderInfo> legacyProviders = pm.queryContentProviders(
                     null, -1, PackageManager.GET_META_DATA);
-            for (ProviderInfo info : providers) {
+            for (ProviderInfo info : legacyProviders) {
                 if (info.metaData != null && info.metaData.containsKey(
                         DocumentsContract.META_DATA_DOCUMENT_PROVIDER)) {
-                    // Ignore stopped packages for now; we might query them
-                    // later during UI interaction.
-                    if ((info.applicationInfo.flags & ApplicationInfo.FLAG_STOPPED) != 0) {
-                        if (LOGD) Log.d(TAG, "Ignoring stopped authority " + info.authority);
-                        stoppedAuthorities.add(info.authority);
-                        continue;
-                    }
-
-                    // Try using cached roots if filtering
-                    boolean cacheHit = false;
-                    if (mFilterPackage != null && !mFilterPackage.equals(info.packageName)) {
-                        synchronized (mLock) {
-                            if (roots.putAll(info.authority, mRoots.get(info.authority))) {
-                                if (LOGD) Log.d(TAG, "Used cached roots for " + info.authority);
-                                cacheHit = true;
-                            }
-                        }
-                    }
-
-                    // Cache miss, or loading everything
-                    if (!cacheHit) {
-                        roots.putAll(
-                                info.authority, loadRootsForAuthority(resolver, info.authority));
-                    }
+                    handleDocumentsProvider(info);
                 }
             }
 
             final long delta = SystemClock.elapsedRealtime() - start;
-            Log.d(TAG, "Update found " + roots.size() + " roots in " + delta + "ms");
+            Log.d(TAG, "Update found " + mTaskRoots.size() + " roots in " + delta + "ms");
             synchronized (mLock) {
-                mStoppedAuthorities = stoppedAuthorities;
-                mRoots = roots;
+                mRoots = mTaskRoots;
+                mStoppedAuthorities = mTaskStoppedAuthorities;
             }
             mFirstLoad.countDown();
             return null;
         }
+
+        private void handleDocumentsProvider(ProviderInfo info) {
+            // Ignore stopped packages for now; we might query them
+            // later during UI interaction.
+            if ((info.applicationInfo.flags & ApplicationInfo.FLAG_STOPPED) != 0) {
+                if (LOGD) Log.d(TAG, "Ignoring stopped authority " + info.authority);
+                mTaskStoppedAuthorities.add(info.authority);
+                return;
+            }
+
+            // Try using cached roots if filtering
+            boolean cacheHit = false;
+            if (mFilterPackage != null && !mFilterPackage.equals(info.packageName)) {
+                synchronized (mLock) {
+                    if (mTaskRoots.putAll(info.authority, mRoots.get(info.authority))) {
+                        if (LOGD) Log.d(TAG, "Used cached roots for " + info.authority);
+                        cacheHit = true;
+                    }
+                }
+            }
+
+            // Cache miss, or loading everything
+            if (!cacheHit) {
+                mTaskRoots.putAll(info.authority,
+                        loadRootsForAuthority(mContext.getContentResolver(), info.authority));
+            }
+        }
     }
 
     /**
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
index 2fb12bb..fdbc3ab 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
@@ -142,9 +142,12 @@
         final RootInfo root = ((DocumentsActivity) getActivity()).getCurrentRoot();
         for (int i = 0; i < mAdapter.getCount(); i++) {
             final Object item = mAdapter.getItem(i);
-            if (Objects.equal(item, root)) {
-                mList.setItemChecked(i, true);
-                return;
+            if (item instanceof RootItem) {
+                final RootInfo testRoot = ((RootItem) item).root;
+                if (Objects.equal(testRoot, root)) {
+                    mList.setItemChecked(i, true);
+                    return;
+                }
             }
         }
     }
diff --git a/packages/ExternalStorageProvider/AndroidManifest.xml b/packages/ExternalStorageProvider/AndroidManifest.xml
index 7094efc..99a4260 100644
--- a/packages/ExternalStorageProvider/AndroidManifest.xml
+++ b/packages/ExternalStorageProvider/AndroidManifest.xml
@@ -11,9 +11,9 @@
             android:grantUriPermissions="true"
             android:exported="true"
             android:permission="android.permission.MANAGE_DOCUMENTS">
-            <meta-data
-                android:name="android.content.DOCUMENT_PROVIDER"
-                android:value="true" />
+            <intent-filter>
+                <action android:name="android.content.action.DOCUMENTS_PROVIDER" />
+            </intent-filter>
         </provider>
 
         <!-- TODO: find a better place for tests to live -->
@@ -24,9 +24,9 @@
             android:exported="true"
             android:permission="android.permission.MANAGE_DOCUMENTS"
             android:enabled="false">
-            <meta-data
-                android:name="android.content.DOCUMENT_PROVIDER"
-                android:value="true" />
+            <intent-filter>
+                <action android:name="android.content.action.DOCUMENTS_PROVIDER" />
+            </intent-filter>
         </provider>
     </application>
 </manifest>
diff --git a/packages/Keyguard/res/drawable-hdpi/progress_bg_holo_light.9.png b/packages/Keyguard/res/drawable-hdpi/progress_bg_holo_light.9.png
new file mode 100644
index 0000000..2d79280
--- /dev/null
+++ b/packages/Keyguard/res/drawable-hdpi/progress_bg_holo_light.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/progress_primary_holo_light.9.png b/packages/Keyguard/res/drawable-hdpi/progress_primary_holo_light.9.png
new file mode 100644
index 0000000..543cb85
--- /dev/null
+++ b/packages/Keyguard/res/drawable-hdpi/progress_primary_holo_light.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/progress_secondary_holo_light.9.png b/packages/Keyguard/res/drawable-hdpi/progress_secondary_holo_light.9.png
new file mode 100644
index 0000000..4497058
--- /dev/null
+++ b/packages/Keyguard/res/drawable-hdpi/progress_secondary_holo_light.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_control_disabled_holo.png b/packages/Keyguard/res/drawable-hdpi/scrubber_control_disabled_holo.png
new file mode 100644
index 0000000..ba77899
--- /dev/null
+++ b/packages/Keyguard/res/drawable-hdpi/scrubber_control_disabled_holo.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_control_focused_holo.png b/packages/Keyguard/res/drawable-hdpi/scrubber_control_focused_holo.png
new file mode 100644
index 0000000..539ee22
--- /dev/null
+++ b/packages/Keyguard/res/drawable-hdpi/scrubber_control_focused_holo.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_control_normal_holo.png b/packages/Keyguard/res/drawable-hdpi/scrubber_control_normal_holo.png
new file mode 100644
index 0000000..9a4ea2f
--- /dev/null
+++ b/packages/Keyguard/res/drawable-hdpi/scrubber_control_normal_holo.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_control_pressed_holo.png b/packages/Keyguard/res/drawable-hdpi/scrubber_control_pressed_holo.png
new file mode 100644
index 0000000..e6b11de
--- /dev/null
+++ b/packages/Keyguard/res/drawable-hdpi/scrubber_control_pressed_holo.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_primary_holo.9.png b/packages/Keyguard/res/drawable-hdpi/scrubber_primary_holo.9.png
new file mode 100644
index 0000000..822e8d11
--- /dev/null
+++ b/packages/Keyguard/res/drawable-hdpi/scrubber_primary_holo.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_secondary_holo.9.png b/packages/Keyguard/res/drawable-hdpi/scrubber_secondary_holo.9.png
new file mode 100644
index 0000000..be4253e
--- /dev/null
+++ b/packages/Keyguard/res/drawable-hdpi/scrubber_secondary_holo.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_track_holo_light.9.png b/packages/Keyguard/res/drawable-hdpi/scrubber_track_holo_light.9.png
new file mode 100644
index 0000000..2334e14
--- /dev/null
+++ b/packages/Keyguard/res/drawable-hdpi/scrubber_track_holo_light.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/progress_bg_holo_light.9.png b/packages/Keyguard/res/drawable-mdpi/progress_bg_holo_light.9.png
new file mode 100644
index 0000000..ff40433
--- /dev/null
+++ b/packages/Keyguard/res/drawable-mdpi/progress_bg_holo_light.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/progress_primary_holo_light.9.png b/packages/Keyguard/res/drawable-mdpi/progress_primary_holo_light.9.png
new file mode 100644
index 0000000..d5f874d
--- /dev/null
+++ b/packages/Keyguard/res/drawable-mdpi/progress_primary_holo_light.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/progress_secondary_holo_light.9.png b/packages/Keyguard/res/drawable-mdpi/progress_secondary_holo_light.9.png
new file mode 100644
index 0000000..f027007
--- /dev/null
+++ b/packages/Keyguard/res/drawable-mdpi/progress_secondary_holo_light.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_control_disabled_holo.png b/packages/Keyguard/res/drawable-mdpi/scrubber_control_disabled_holo.png
new file mode 100644
index 0000000..981facd
--- /dev/null
+++ b/packages/Keyguard/res/drawable-mdpi/scrubber_control_disabled_holo.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_control_focused_holo.png b/packages/Keyguard/res/drawable-mdpi/scrubber_control_focused_holo.png
new file mode 100644
index 0000000..d432f42
--- /dev/null
+++ b/packages/Keyguard/res/drawable-mdpi/scrubber_control_focused_holo.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_control_normal_holo.png b/packages/Keyguard/res/drawable-mdpi/scrubber_control_normal_holo.png
new file mode 100644
index 0000000..7bb749e
--- /dev/null
+++ b/packages/Keyguard/res/drawable-mdpi/scrubber_control_normal_holo.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_control_pressed_holo.png b/packages/Keyguard/res/drawable-mdpi/scrubber_control_pressed_holo.png
new file mode 100644
index 0000000..43d826e
--- /dev/null
+++ b/packages/Keyguard/res/drawable-mdpi/scrubber_control_pressed_holo.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_primary_holo.9.png b/packages/Keyguard/res/drawable-mdpi/scrubber_primary_holo.9.png
new file mode 100644
index 0000000..98ac428
--- /dev/null
+++ b/packages/Keyguard/res/drawable-mdpi/scrubber_primary_holo.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_secondary_holo.9.png b/packages/Keyguard/res/drawable-mdpi/scrubber_secondary_holo.9.png
new file mode 100644
index 0000000..d8b563b
--- /dev/null
+++ b/packages/Keyguard/res/drawable-mdpi/scrubber_secondary_holo.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_track_holo_light.9.png b/packages/Keyguard/res/drawable-mdpi/scrubber_track_holo_light.9.png
new file mode 100644
index 0000000..47c5dd9
--- /dev/null
+++ b/packages/Keyguard/res/drawable-mdpi/scrubber_track_holo_light.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/progress_bg_holo_light.9.png b/packages/Keyguard/res/drawable-xhdpi/progress_bg_holo_light.9.png
new file mode 100644
index 0000000..dff0939
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xhdpi/progress_bg_holo_light.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/progress_primary_holo_light.9.png b/packages/Keyguard/res/drawable-xhdpi/progress_primary_holo_light.9.png
new file mode 100644
index 0000000..60b8198
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xhdpi/progress_primary_holo_light.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/progress_secondary_holo_light.9.png b/packages/Keyguard/res/drawable-xhdpi/progress_secondary_holo_light.9.png
new file mode 100644
index 0000000..11b31be
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xhdpi/progress_secondary_holo_light.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_control_disabled_holo.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_disabled_holo.png
new file mode 100644
index 0000000..ffe913d
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_disabled_holo.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_control_focused_holo.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_focused_holo.png
new file mode 100644
index 0000000..2fccb8f
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_focused_holo.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_control_normal_holo.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_normal_holo.png
new file mode 100644
index 0000000..a638501
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_normal_holo.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_control_pressed_holo.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_pressed_holo.png
new file mode 100644
index 0000000..f0e65ea
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_pressed_holo.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_primary_holo.9.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_primary_holo.9.png
new file mode 100644
index 0000000..04f6ae3
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xhdpi/scrubber_primary_holo.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_secondary_holo.9.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_secondary_holo.9.png
new file mode 100644
index 0000000..7fef98d
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xhdpi/scrubber_secondary_holo.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_track_holo_light.9.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_track_holo_light.9.png
new file mode 100644
index 0000000..a712169
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xhdpi/scrubber_track_holo_light.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/kg_add_widget_pressed.png b/packages/Keyguard/res/drawable-xxhdpi/kg_add_widget_pressed.png
new file mode 100644
index 0000000..0c0838b
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xxhdpi/kg_add_widget_pressed.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/progress_bg_holo_light.9.png b/packages/Keyguard/res/drawable-xxhdpi/progress_bg_holo_light.9.png
new file mode 100644
index 0000000..60a8e22
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xxhdpi/progress_bg_holo_light.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/progress_primary_holo_light.9.png b/packages/Keyguard/res/drawable-xxhdpi/progress_primary_holo_light.9.png
new file mode 100644
index 0000000..18384d3
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xxhdpi/progress_primary_holo_light.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/progress_secondary_holo_light.9.png b/packages/Keyguard/res/drawable-xxhdpi/progress_secondary_holo_light.9.png
new file mode 100644
index 0000000..82eb615
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xxhdpi/progress_secondary_holo_light.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_disabled_holo.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_disabled_holo.png
new file mode 100644
index 0000000..d1ac7ae
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_disabled_holo.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_focused_holo.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_focused_holo.png
new file mode 100644
index 0000000..58a2976
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_focused_holo.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_normal_holo.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_normal_holo.png
new file mode 100644
index 0000000..6f696fd
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_normal_holo.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_pressed_holo.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_pressed_holo.png
new file mode 100644
index 0000000..faae4e3
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_pressed_holo.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_primary_holo.9.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_primary_holo.9.png
new file mode 100644
index 0000000..82c2b7e
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xxhdpi/scrubber_primary_holo.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_secondary_holo.9.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_secondary_holo.9.png
new file mode 100644
index 0000000..800d95e
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xxhdpi/scrubber_secondary_holo.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_track_holo_light.9.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_track_holo_light.9.png
new file mode 100644
index 0000000..9991f7f
--- /dev/null
+++ b/packages/Keyguard/res/drawable-xxhdpi/scrubber_track_holo_light.9.png
Binary files differ
diff --git a/packages/Keyguard/res/drawable/scrubber_control_selector_holo.xml b/packages/Keyguard/res/drawable/scrubber_control_selector_holo.xml
new file mode 100644
index 0000000..d09b1a5
--- /dev/null
+++ b/packages/Keyguard/res/drawable/scrubber_control_selector_holo.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_enabled="false" android:drawable="@drawable/scrubber_control_disabled_holo" />
+    <item android:state_pressed="true" android:drawable="@drawable/scrubber_control_pressed_holo" />
+    <item android:state_selected="true" android:drawable="@drawable/scrubber_control_focused_holo" />
+    <item android:drawable="@drawable/scrubber_control_normal_holo" />
+</selector>
diff --git a/packages/Keyguard/res/drawable/scrubber_progress_horizontal_holo_light.xml b/packages/Keyguard/res/drawable/scrubber_progress_horizontal_holo_light.xml
new file mode 100644
index 0000000..f07c742
--- /dev/null
+++ b/packages/Keyguard/res/drawable/scrubber_progress_horizontal_holo_light.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:id="@android:id/background"
+            android:drawable="@drawable/scrubber_track_holo_light" />
+    <item android:id="@android:id/secondaryProgress">
+        <scale android:scaleWidth="100%"
+               android:drawable="@drawable/scrubber_secondary_holo" />
+    </item>
+    <item android:id="@android:id/progress">
+        <scale android:scaleWidth="100%"
+               android:drawable="@drawable/scrubber_primary_holo" />
+    </item>
+</layer-list>
diff --git a/packages/Keyguard/res/layout/keyguard_transport_control_view.xml b/packages/Keyguard/res/layout/keyguard_transport_control_view.xml
index 81c7425..a0b59a7 100644
--- a/packages/Keyguard/res/layout/keyguard_transport_control_view.xml
+++ b/packages/Keyguard/res/layout/keyguard_transport_control_view.xml
@@ -75,7 +75,8 @@
                 <SeekBar
                     android:id="@+id/transient_seek_bar"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content" />
+                    android:layout_height="wrap_content"
+                    style="@style/Widget.TransportControl.SeekBar" />
                 <TextView
                     android:id="@+id/transient_seek_time_elapsed"
                     android:layout_width="wrap_content"
diff --git a/packages/Keyguard/res/values-ar/strings.xml b/packages/Keyguard/res/values-ar/strings.xml
index 57125bd..fa778b3 100644
--- a/packages/Keyguard/res/values-ar/strings.xml
+++ b/packages/Keyguard/res/values-ar/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"زر الإيقاف المؤقت"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"زر التشغيل"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"زر الإيقاف"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"رائعة"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"معارضة"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"قلب"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"إلغاء القفل للمتابعة"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"تم إلغاء التشغيل"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"أسقط <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> للحذف."</string>
diff --git a/packages/Keyguard/res/values-bg/strings.xml b/packages/Keyguard/res/values-bg/strings.xml
index 23478c7..468570f 100644
--- a/packages/Keyguard/res/values-bg/strings.xml
+++ b/packages/Keyguard/res/values-bg/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Бутон за пауза"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Бутон за пускане"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Бутон за спиране"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Харесва ми"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Не ми харесва"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Сърце"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Отключете, за да продължите"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Стартирането е анулирано"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Пуснете <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, за да изтриете."</string>
diff --git a/packages/Keyguard/res/values-cs/strings.xml b/packages/Keyguard/res/values-cs/strings.xml
index 8349703..b4598cb 100644
--- a/packages/Keyguard/res/values-cs/strings.xml
+++ b/packages/Keyguard/res/values-cs/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Tlačítko Pozastavit"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Tlačítko Přehrát"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Tlačítko Zastavit"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Líbí se mi"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Nelíbí se mi"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Srdíčko"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Pokračujte odemknutím"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Spuštění zrušeno"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Uvolněním dotyku widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> vymažete."</string>
diff --git a/packages/Keyguard/res/values-da/strings.xml b/packages/Keyguard/res/values-da/strings.xml
index 7f94f63..0cff37c 100644
--- a/packages/Keyguard/res/values-da/strings.xml
+++ b/packages/Keyguard/res/values-da/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pause-knap"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Afspil-knap"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop-knap"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Synes om"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Synes ikke om"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hjerte"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Lås op for at gå videre"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Starten blev annulleret"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Slip <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> for at slette."</string>
diff --git a/packages/Keyguard/res/values-en-rGB/strings.xml b/packages/Keyguard/res/values-en-rGB/strings.xml
index 3ab8ff5..892bab7 100644
--- a/packages/Keyguard/res/values-en-rGB/strings.xml
+++ b/packages/Keyguard/res/values-en-rGB/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pause button"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Play button"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop button"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Thumbs up"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Thumbs down"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Heart"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Unlock to continue"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Launch cancelled"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Drop <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> to delete."</string>
diff --git a/packages/Keyguard/res/values-en-rIN/strings.xml b/packages/Keyguard/res/values-en-rIN/strings.xml
index 3ab8ff5..892bab7 100644
--- a/packages/Keyguard/res/values-en-rIN/strings.xml
+++ b/packages/Keyguard/res/values-en-rIN/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pause button"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Play button"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop button"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Thumbs up"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Thumbs down"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Heart"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Unlock to continue"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Launch cancelled"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Drop <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> to delete."</string>
diff --git a/packages/Keyguard/res/values-es-rUS/strings.xml b/packages/Keyguard/res/values-es-rUS/strings.xml
index bafd66d..2278efd 100644
--- a/packages/Keyguard/res/values-es-rUS/strings.xml
+++ b/packages/Keyguard/res/values-es-rUS/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Botón de pausa"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Botón de reproducción"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botón de detención"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Votos a favor"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Votos en contra"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Corazón"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloquea para continuar."</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Se canceló el inicio."</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Suelta <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> para eliminarlo."</string>
diff --git a/packages/Keyguard/res/values-fa/strings.xml b/packages/Keyguard/res/values-fa/strings.xml
index e0eb1e1..4b0bce5 100644
--- a/packages/Keyguard/res/values-fa/strings.xml
+++ b/packages/Keyguard/res/values-fa/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"دکمه توقف موقت"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"دکمه پخش"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"دکمه توقف"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"رأی موافق"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"رأی مخالف"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"قلب"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"برای ادامه قفل را باز کنید"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"راه‌اندازی لغو شد"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"جهت حذف، <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> را بکشید."</string>
diff --git a/packages/Keyguard/res/values-fi/strings.xml b/packages/Keyguard/res/values-fi/strings.xml
index a719610..68d8227 100644
--- a/packages/Keyguard/res/values-fi/strings.xml
+++ b/packages/Keyguard/res/values-fi/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Tauko-painike"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Toista-painike"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Keskeytä-painike"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Tykkään"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"En tykkää"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Sydän"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Jatka poistamalla lukitus"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Käynnistys peruutettu"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Poista <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> pudottamalla."</string>
diff --git a/packages/Keyguard/res/values-fr-rCA/strings.xml b/packages/Keyguard/res/values-fr-rCA/strings.xml
index 1251f4b..8d07cfd 100644
--- a/packages/Keyguard/res/values-fr-rCA/strings.xml
+++ b/packages/Keyguard/res/values-fr-rCA/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Bouton de pause"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Bouton de lecture"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Bouton d\'arrêt"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"J\'aime"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Je n\'aime pas"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Cœur"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Déverrouiller pour continuer"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lancement annulé"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Déposez <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> pour supprimer."</string>
diff --git a/packages/Keyguard/res/values-fr/strings.xml b/packages/Keyguard/res/values-fr/strings.xml
index cb78f8d..37fb8fb 100644
--- a/packages/Keyguard/res/values-fr/strings.xml
+++ b/packages/Keyguard/res/values-fr/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Bouton de pause"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Bouton de lecture"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Bouton d\'arrêt"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"J\'aime"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Je n\'aime pas"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Cœur"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Déverrouillez l\'appareil pour continuer."</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lancement annulé."</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Relâchez le widget \"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>\" pour le supprimer."</string>
diff --git a/packages/Keyguard/res/values-hi/strings.xml b/packages/Keyguard/res/values-hi/strings.xml
index 304f14f..058a2f7 100644
--- a/packages/Keyguard/res/values-hi/strings.xml
+++ b/packages/Keyguard/res/values-hi/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"पॉज़ करें बटन"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"चलाएं बटन"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"रोकें बटन"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"पसंद"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"नापसंद"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"दिल"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"जारी रखने के लिए अनलॉक करें"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"लॉन्‍च रद्द कर दिया गया"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"हटाने के लिए <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> खींचें."</string>
diff --git a/packages/Keyguard/res/values-hr/strings.xml b/packages/Keyguard/res/values-hr/strings.xml
index 073c4ca..99270a9 100644
--- a/packages/Keyguard/res/values-hr/strings.xml
+++ b/packages/Keyguard/res/values-hr/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Gumb Pauza"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Gumb Reprodukcija"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Gumb Zaustavi"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Palac gore"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Palac dolje"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Srce"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Otključajte za nastavak"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Pokretanje je otkazano"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Ispustite widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> da biste ga izbrisali."</string>
diff --git a/packages/Keyguard/res/values-hy-rAM/strings.xml b/packages/Keyguard/res/values-hy-rAM/strings.xml
index db22282..2c10d39 100644
--- a/packages/Keyguard/res/values-hy-rAM/strings.xml
+++ b/packages/Keyguard/res/values-hy-rAM/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Դադարի կոճակ"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Նվագարկման կոճակ"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Կանգի կոճակ"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Լավն է"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Լավը չէ"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Սիրտ"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Շարունակելու համար ապակողպեք"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Գործարկումը չեղարկվեց"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> վիջեթը ջնջելու համար բաց թողեք այն այստեղ:"</string>
diff --git a/packages/Keyguard/res/values-in/strings.xml b/packages/Keyguard/res/values-in/strings.xml
index 380c34e..3b2de3d 100644
--- a/packages/Keyguard/res/values-in/strings.xml
+++ b/packages/Keyguard/res/values-in/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Tombol jeda"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Tombol putar"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Tombol hentikan"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Bagus"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Jelek"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hati"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Buka kunci untuk melanjutkan"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Peluncuran dibatalkan"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Jatuhkan <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> untuk menghapus."</string>
diff --git a/packages/Keyguard/res/values-ja/strings.xml b/packages/Keyguard/res/values-ja/strings.xml
index 1b19110..c7e0447 100644
--- a/packages/Keyguard/res/values-ja/strings.xml
+++ b/packages/Keyguard/res/values-ja/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"一時停止ボタン"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"再生ボタン"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"停止ボタン"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"グッド"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"イマイチ"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"ハート"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"続行するにはロックを解除してください"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"起動をキャンセルしました"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"削除するには<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>をドロップしてください。"</string>
diff --git a/packages/Keyguard/res/values-ka-rGE/strings.xml b/packages/Keyguard/res/values-ka-rGE/strings.xml
index f1fabba..f643178 100644
--- a/packages/Keyguard/res/values-ka-rGE/strings.xml
+++ b/packages/Keyguard/res/values-ka-rGE/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"პაუზის ღილაკი"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"დაკვრის ღილაკი"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop ღილაკი"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"ზევით აწეული ცერი"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ქვევით დახრილი ცერი"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"გული"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"განბლოკეთ გასაგრძელებლად"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"გამოძახება გაუქმდა"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ჩააგდეთ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> წასაშლელად."</string>
diff --git a/packages/Keyguard/res/values-km-rKH/strings.xml b/packages/Keyguard/res/values-km-rKH/strings.xml
index c88279b..75cebac 100644
--- a/packages/Keyguard/res/values-km-rKH/strings.xml
+++ b/packages/Keyguard/res/values-km-rKH/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ប៊ូតុង​ផ្អាក"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ប៊ូតុង​ចាក់"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ប៊ូតុង​បញ្ឈប់"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"មេដៃ​ឡើង"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"មេដៃចុះ"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"បេះដូង"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ដោះ​សោ ​ដើម្បី​បន្ត"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"បាន​បោះបង់​ការ​ចាប់ផ្ដើម"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ទម្លាក់ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ដើម្បី​លុប។"</string>
diff --git a/packages/Keyguard/res/values-ko/strings.xml b/packages/Keyguard/res/values-ko/strings.xml
index e01a2e1..a1b5096 100644
--- a/packages/Keyguard/res/values-ko/strings.xml
+++ b/packages/Keyguard/res/values-ko/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"일시중지 버튼"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"재생 버튼"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"중지 버튼"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"좋아요"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"싫어요"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"하트"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"계속하려면 잠금해제합니다."</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"실행 취소됨"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"삭제하려면 <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>을(를) 드롭합니다."</string>
diff --git a/packages/Keyguard/res/values-lo-rLA/strings.xml b/packages/Keyguard/res/values-lo-rLA/strings.xml
index 94d2777..a9ba8ba 100644
--- a/packages/Keyguard/res/values-lo-rLA/strings.xml
+++ b/packages/Keyguard/res/values-lo-rLA/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ປຸ່ມຢຸດຊົ່ວຄາວ"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ປຸ່ມຫຼິ້ນ"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ປຸ່ມຢຸດ"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"ເລື່ອນນິ້ວໂປ້ຂຶ້ນ"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ເລື່ອນນິ້ວໂປ້ລົງ"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"ຫົວໃຈ"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ປົດລັອກເພື່ອດຳເນີນການຕໍ່"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ການເປີດໃຊ້ຖືກຍົກເລີກ"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ວາງ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ເພື່ອລຶບ."</string>
diff --git a/packages/Keyguard/res/values-mn-rMN/strings.xml b/packages/Keyguard/res/values-mn-rMN/strings.xml
index 82a9e58..e4c07eb 100644
--- a/packages/Keyguard/res/values-mn-rMN/strings.xml
+++ b/packages/Keyguard/res/values-mn-rMN/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Түр зогсоох товч"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Тоглуулах товч"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Зогсоох товч"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Сайн"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Онцгүй"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Зүрх"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Үргэлжлүүлэхийн тулд түгжээг тайлна уу"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Эхлүүлэхийг цуцалсан"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Устгахын тулд <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>-г тавина уу."</string>
diff --git a/packages/Keyguard/res/values-ms-rMY/strings.xml b/packages/Keyguard/res/values-ms-rMY/strings.xml
index 75213fe..17ec2e6 100644
--- a/packages/Keyguard/res/values-ms-rMY/strings.xml
+++ b/packages/Keyguard/res/values-ms-rMY/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Butang jeda"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Butang main"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Butang berhenti"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Menyukai"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Tidak diterima"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Jantung"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Buka kunci untuk meneruskan"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Pelancaran dibatalkan"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Jatuhkan <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> untuk memadam."</string>
diff --git a/packages/Keyguard/res/values-pt/strings.xml b/packages/Keyguard/res/values-pt/strings.xml
index bf66a99..3c668a0 100644
--- a/packages/Keyguard/res/values-pt/strings.xml
+++ b/packages/Keyguard/res/values-pt/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Botão \"Pausar\""</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Botão \"Reproduzir\""</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botão \"Parar\""</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Gostei"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Não gostei"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Coração"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloqueie para continuar"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Inicialização cancelada"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Solte <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> para excluir."</string>
diff --git a/packages/Keyguard/res/values-ro/strings.xml b/packages/Keyguard/res/values-ro/strings.xml
index 194861a..cebf0df 100644
--- a/packages/Keyguard/res/values-ro/strings.xml
+++ b/packages/Keyguard/res/values-ro/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Butonul Întrerupeți"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Butonul Redați"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Butonul Opriți"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Vot pozitiv"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Vot negativ"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Inimă"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Deblocați pentru a continua"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lansare anulată"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Eliberați <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> pentru a șterge."</string>
diff --git a/packages/Keyguard/res/values-ru/strings.xml b/packages/Keyguard/res/values-ru/strings.xml
index 2d57be61..d8a457d 100644
--- a/packages/Keyguard/res/values-ru/strings.xml
+++ b/packages/Keyguard/res/values-ru/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Кнопка паузы"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Кнопка воспроизведения"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Кнопка выключения"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Нравится"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Не нравится"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Рейтинг"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Разблокируйте экран, чтобы продолжить."</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Запуск отменен."</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Отпустите виджет \"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>\", чтобы удалить его."</string>
diff --git a/packages/Keyguard/res/values-sk/strings.xml b/packages/Keyguard/res/values-sk/strings.xml
index 8711cb9..bd3f058 100644
--- a/packages/Keyguard/res/values-sk/strings.xml
+++ b/packages/Keyguard/res/values-sk/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Tlačidlo Pozastaviť"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Tlačidlo Prehrať"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Tlačidlo Zastaviť"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Páči sa mi"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Nepáči sa mi"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Srdce"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Odomknite zariadenie a pokračujte"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Spustenie bolo zrušené"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Uvoľnením dotyku miniaplikáciu <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> odstránite."</string>
diff --git a/packages/Keyguard/res/values-sl/strings.xml b/packages/Keyguard/res/values-sl/strings.xml
index d7759a86..7e7d893 100644
--- a/packages/Keyguard/res/values-sl/strings.xml
+++ b/packages/Keyguard/res/values-sl/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Gumb za začasno ustavitev"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Gumb za predvajanje"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Gumb za ustavitev"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Všeč mi je"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Ni mi všeč"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Srce"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Za nadaljevanje odklenite"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Zagon je preklican"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Izpustite pripomoček <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, da ga izbrišete."</string>
diff --git a/packages/Keyguard/res/values-sr/strings.xml b/packages/Keyguard/res/values-sr/strings.xml
index 19bc74e..c5cc39c 100644
--- a/packages/Keyguard/res/values-sr/strings.xml
+++ b/packages/Keyguard/res/values-sr/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Дугме за паузу"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Дугме за репродукцију"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Дугме за заустављање"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Свиђа ми се"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Не свиђа ми се"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Срце"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Откључајте да бисте наставили"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Покретање је отказано"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Отпустите виџет <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> да бисте га избрисали."</string>
diff --git a/packages/Keyguard/res/values-sv/strings.xml b/packages/Keyguard/res/values-sv/strings.xml
index 83475882..dd82711 100644
--- a/packages/Keyguard/res/values-sv/strings.xml
+++ b/packages/Keyguard/res/values-sv/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pausknappen"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Uppspelningsknappen"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stoppknappen"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Gillar"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Tummen ned"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hjärta"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Lås upp om du vill fortsätta"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lanseringen har avbrutits"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Ta bort genom att släppa <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> här."</string>
diff --git a/packages/Keyguard/res/values-sw/strings.xml b/packages/Keyguard/res/values-sw/strings.xml
index aea2e21..5e2b163 100644
--- a/packages/Keyguard/res/values-sw/strings.xml
+++ b/packages/Keyguard/res/values-sw/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Kitufe cha kusitisha"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Kitufe cha kucheza"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Kitufe cha kusitisha"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Bomba"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Si bomba"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Moyo"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Fungua ili uendelee"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Uzinduzi umeghairiwa"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Dondosha <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ili ufute."</string>
diff --git a/packages/Keyguard/res/values-th/strings.xml b/packages/Keyguard/res/values-th/strings.xml
index 8d80977..3f2c747 100644
--- a/packages/Keyguard/res/values-th/strings.xml
+++ b/packages/Keyguard/res/values-th/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ปุ่มหยุดชั่วคราว"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ปุ่มเล่น"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ปุ่มหยุด"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"สุดยอด"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ไม่ชอบ"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"หัวใจ"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ปลดล็อกเพื่อดำเนินการต่อ"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ยกเลิกการเปิดใช้งานแล้ว"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ลาก <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> เพื่อลบ"</string>
diff --git a/packages/Keyguard/res/values-tl/strings.xml b/packages/Keyguard/res/values-tl/strings.xml
index 67d26cb..3a33c9f 100644
--- a/packages/Keyguard/res/values-tl/strings.xml
+++ b/packages/Keyguard/res/values-tl/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Button na I-pause"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Button na I-play"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Button na Ihinto"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Thumbs up"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Thumbs down"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Heart"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"I-unlock upang magpatuloy"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Nakansela ang paglunsad"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"I-drop ang <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> upang tanggalin."</string>
diff --git a/packages/Keyguard/res/values-tr/strings.xml b/packages/Keyguard/res/values-tr/strings.xml
index 71356dc..d9c950f 100644
--- a/packages/Keyguard/res/values-tr/strings.xml
+++ b/packages/Keyguard/res/values-tr/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Duraklat düğmesi"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Oynat düğmesi"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Durdur düğmesi"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Beğen"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Beğenme"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Kalp"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Devam etmek için kilidini açın"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Başlatma iptal edildi"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Silmek için <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget\'ını bırakın."</string>
diff --git a/packages/Keyguard/res/values-uk/strings.xml b/packages/Keyguard/res/values-uk/strings.xml
index 3c004ce..01bf687 100644
--- a/packages/Keyguard/res/values-uk/strings.xml
+++ b/packages/Keyguard/res/values-uk/strings.xml
@@ -73,7 +73,7 @@
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Кнопка \"Зупинити\""</string>
     <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Подобається"</string>
     <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Не подобається"</string>
-    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Серце"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Рейтинг"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Розблокуйте, щоб продовжити"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Запуск скасовано"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Відпустіть <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, щоб видалити."</string>
diff --git a/packages/Keyguard/res/values-vi/strings.xml b/packages/Keyguard/res/values-vi/strings.xml
index d5e52d71..6ae8312 100644
--- a/packages/Keyguard/res/values-vi/strings.xml
+++ b/packages/Keyguard/res/values-vi/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Nút tạm dừng"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Nút phát"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Nút dừng"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Bài hát được đánh dấu thích"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Bài hát được đánh dấu không thích"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Trái tim"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Mở khóa để tiếp tục"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Quá trình khởi chạy bị hủy"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Thả <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> để xóa."</string>
diff --git a/packages/Keyguard/res/values-zh-rCN/strings.xml b/packages/Keyguard/res/values-zh-rCN/strings.xml
index a62ffac..06d71ff 100644
--- a/packages/Keyguard/res/values-zh-rCN/strings.xml
+++ b/packages/Keyguard/res/values-zh-rCN/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"暂停按钮"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"播放按钮"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"停止按钮"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"我喜欢"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"不喜欢"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"爱心"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"解锁即可继续"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"启动已取消"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"放下<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>即可将其删除。"</string>
diff --git a/packages/Keyguard/res/values-zh-rHK/strings.xml b/packages/Keyguard/res/values-zh-rHK/strings.xml
index b4238e1..724357f 100644
--- a/packages/Keyguard/res/values-zh-rHK/strings.xml
+++ b/packages/Keyguard/res/values-zh-rHK/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"[暫停] 按鈕"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"[播放] 按鈕"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"[停止] 按鈕"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"喜歡"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"不喜歡"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"心形"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"請解鎖以繼續"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"已取消啟動"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"拖放「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>」即可刪除。"</string>
diff --git a/packages/Keyguard/res/values-zh-rTW/strings.xml b/packages/Keyguard/res/values-zh-rTW/strings.xml
index 01702f8..f3f1724 100644
--- a/packages/Keyguard/res/values-zh-rTW/strings.xml
+++ b/packages/Keyguard/res/values-zh-rTW/strings.xml
@@ -71,12 +71,9 @@
     <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"[暫停] 按鈕"</string>
     <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"[播放] 按鈕"</string>
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"[停止] 按鈕"</string>
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) -->
-    <skip />
-    <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) -->
-    <skip />
+    <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"喜歡"</string>
+    <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"不喜歡"</string>
+    <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"愛心"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"先解鎖才能繼續操作"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"已取消啟動"</string>
     <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"拖放「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>」即可將其刪除。"</string>
diff --git a/packages/Keyguard/res/values/alias.xml b/packages/Keyguard/res/values/alias.xml
index b22311e..e6657a1 100644
--- a/packages/Keyguard/res/values/alias.xml
+++ b/packages/Keyguard/res/values/alias.xml
@@ -43,8 +43,8 @@
     <!-- Alias used to reference framework configuration for screen rotation.  -->
     <item type="bool" name="config_enableLockScreenRotation">@*android:bool/config_enableLockScreenRotation</item>
 
-    <!-- Alias used to reference framework configuration for transparent bars.  -->
-    <item type="bool" name="config_enableLockScreenTransparentBars">@*android:bool/config_enableLockScreenTransparentBars</item>
+    <!-- Alias used to reference framework configuration for translucent decor.  -->
+    <item type="bool" name="config_enableLockScreenTranslucentDecor">@*android:bool/config_enableLockScreenTranslucentDecor</item>
 
     <!-- Alias used to reference framework activity duration.  -->
     <item type="integer" name="config_activityDefaultDur">@*android:integer/config_activityDefaultDur</item>
diff --git a/packages/Keyguard/res/values/styles.xml b/packages/Keyguard/res/values/styles.xml
index 44f560f..9fd8f31 100644
--- a/packages/Keyguard/res/values/styles.xml
+++ b/packages/Keyguard/res/values/styles.xml
@@ -68,4 +68,18 @@
         <item name="android:textSize">@dimen/widget_big_font_size</item>
     </style>
 
+    <style name="Widget.TransportControl.SeekBar" parent="@android:style/Widget.Holo.SeekBar">
+        <item name="android:indeterminateOnly">false</item>
+        <item name="android:progressDrawable">@drawable/scrubber_progress_horizontal_holo_light</item>
+        <item name="android:indeterminateDrawable">@drawable/scrubber_progress_horizontal_holo_light</item>
+        <item name="android:minHeight">13dip</item>
+        <item name="android:maxHeight">13dip</item>
+        <item name="android:thumb">@drawable/scrubber_control_selector_holo</item>
+        <item name="android:thumbOffset">16dip</item>
+        <item name="android:focusable">true</item>
+        <item name="android:paddingStart">16dip</item>
+        <item name="android:paddingEnd">16dip</item>
+        <item name="android:mirrorForRtl">true</item>
+    </style>
+
 </resources>
diff --git a/packages/Keyguard/src/com/android/keyguard/CarrierText.java b/packages/Keyguard/src/com/android/keyguard/CarrierText.java
index 03b09b1..c33f174 100644
--- a/packages/Keyguard/src/com/android/keyguard/CarrierText.java
+++ b/packages/Keyguard/src/com/android/keyguard/CarrierText.java
@@ -47,6 +47,14 @@
             mSimState = simState;
             updateCarrierText(mSimState, mPlmn, mSpn);
         }
+
+        public void onScreenTurnedOff(int why) {
+            setSelected(false);
+        };
+
+        public void onScreenTurnedOn() {
+            setSelected(true);
+        };
     };
     /**
      * The status of this lock screen. Primarily used for widgets on LockScreen.
@@ -79,7 +87,8 @@
     protected void onFinishInflate() {
         super.onFinishInflate();
         mSeparator = getResources().getString(R.string.kg_text_message_separator);
-        setSelected(true); // Allow marquee to work.
+        final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn();
+        setSelected(screenOn); // Allow marquee to work.
     }
 
     @Override
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
index 63aab4d..f1af3b3b 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
@@ -972,6 +972,11 @@
         mAppWidgetContainer.setVisibility(
                 isSimOrAccount && fullScreenEnabled ? View.GONE : View.VISIBLE);
 
+        // Don't show camera or search in navbar when SIM or Account screen is showing
+        setSystemUiVisibility(isSimOrAccount ?
+                (getSystemUiVisibility() | View.STATUS_BAR_DISABLE_SEARCH)
+                : (getSystemUiVisibility() & ~View.STATUS_BAR_DISABLE_SEARCH));
+
         if (mSlidingChallengeLayout != null) {
             mSlidingChallengeLayout.setChallengeInteractive(!fullScreenEnabled);
         }
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardMessageArea.java b/packages/Keyguard/src/com/android/keyguard/KeyguardMessageArea.java
index ad59c02..69075ec 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardMessageArea.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardMessageArea.java
@@ -163,6 +163,12 @@
             mBatteryIsLow = status.isBatteryLow();
             update();
         }
+        public void onScreenTurnedOff(int why) {
+            setSelected(false);
+        };
+        public void onScreenTurnedOn() {
+            setSelected(true);
+        };
     };
 
     public KeyguardMessageArea(Context context) {
@@ -174,9 +180,6 @@
 
         mLockPatternUtils = new LockPatternUtils(context);
 
-        // This is required to ensure marquee works
-        setSelected(true);
-
         // Registering this callback immediately updates the battery state, among other things.
         mUpdateMonitor = KeyguardUpdateMonitor.getInstance(getContext());
         mUpdateMonitor.registerCallback(mInfoCallback);
@@ -187,6 +190,12 @@
         update();
     }
 
+    @Override
+    protected void onFinishInflate() {
+        final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn();
+        setSelected(screenOn); // This is required to ensure marquee works
+    }
+
     public void securityMessageChanged() {
         setAlpha(1f);
         mShowingMessage = true;
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java
index ffb619b..3e42c14 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java
@@ -21,6 +21,7 @@
 import android.graphics.Typeface;
 import android.text.TextUtils;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.util.Slog;
 import android.view.View;
 import android.widget.GridLayout;
@@ -56,6 +57,14 @@
                 refresh();
             }
         };
+
+        public void onScreenTurnedOn() {
+            setEnableMarquee(true);
+        };
+
+        public void onScreenTurnedOff(int why) {
+            setEnableMarquee(false);
+        };
     };
 
     public KeyguardStatusView(Context context) {
@@ -70,22 +79,18 @@
         super(context, attrs, defStyle);
     }
 
+    private void setEnableMarquee(boolean enabled) {
+        if (DEBUG) Log.v(TAG, (enabled ? "Enable" : "Disable") + " transport text marquee");
+        if (mAlarmStatusView != null) mAlarmStatusView.setSelected(enabled);
+    }
+
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
-
         mAlarmStatusView = (TextView) findViewById(R.id.alarm_status);
         mLockPatternUtils = new LockPatternUtils(getContext());
-
-        // Required to get Marquee to work.
-        final View marqueeViews[] = { mAlarmStatusView };
-        for (int i = 0; i < marqueeViews.length; i++) {
-            View v = marqueeViews[i];
-            if (v == null) {
-                throw new RuntimeException("Can't find widget at index " + i);
-            }
-            v.setSelected(true);
-        }
+        final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn();
+        setEnableMarquee(screenOn);
         refresh();
     }
 
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java
index 83d8ab1..ca4892d 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java
@@ -22,6 +22,8 @@
 import android.graphics.Bitmap;
 import android.graphics.ColorMatrix;
 import android.graphics.ColorMatrixColorFilter;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
 import android.graphics.drawable.Drawable;
 import android.media.AudioManager;
 import android.media.MediaMetadataEditor;
@@ -63,7 +65,7 @@
     protected static final boolean DEBUG = false;
     protected static final String TAG = "TransportControlView";
 
-    private static final boolean ANIMATE_TRANSITIONS = false;
+    private static final boolean ANIMATE_TRANSITIONS = true;
 
     private ViewGroup mMetadataContainer;
     private ViewGroup mInfoContainer;
@@ -198,13 +200,22 @@
 
     KeyguardHostView.TransportControlCallback mTransportControlCallback;
 
+    private final KeyguardUpdateMonitorCallback mUpdateMonitor
+            = new KeyguardUpdateMonitorCallback() {
+        public void onScreenTurnedOff(int why) {
+            setEnableMarquee(false);
+        };
+        public void onScreenTurnedOn() {
+            setEnableMarquee(true);
+        };
+    };
+
     public KeyguardTransportControlView(Context context, AttributeSet attrs) {
         super(context, attrs);
         if (DEBUG) Log.v(TAG, "Create TCV " + this);
         mAudioManager = new AudioManager(mContext);
         mCurrentPlayState = RemoteControlClient.PLAYSTATE_NONE; // until we get a callback
-        mRemoteController = new RemoteController(context);
-        mRemoteController.setOnClientUpdateListener(mRCClientUpdateListener);
+        mRemoteController = new RemoteController(context, mRCClientUpdateListener);
 
         final DisplayMetrics dm = context.getResources().getDisplayMetrics();
         final int dim = Math.max(dm.widthPixels, dm.heightPixels);
@@ -251,6 +262,12 @@
         mTransportControlCallback = transportControlCallback;
     }
 
+    private void setEnableMarquee(boolean enabled) {
+        if (DEBUG) Log.v(TAG, (enabled ? "Enable" : "Disable") + " transport text marquee");
+        if (mTrackTitle != null) mTrackTitle.setSelected(enabled);
+        if (mTrackArtistAlbum != null) mTrackTitle.setSelected(enabled);
+    }
+
     @Override
     public void onFinishInflate() {
         super.onFinishInflate();
@@ -258,9 +275,7 @@
         mMetadataContainer = (ViewGroup) findViewById(R.id.metadata_container);
         mBadge = (ImageView) findViewById(R.id.badge);
         mTrackTitle = (TextView) findViewById(R.id.title);
-        mTrackTitle.setSelected(true); // enable marquee
         mTrackArtistAlbum = (TextView) findViewById(R.id.artist_album);
-        mTrackArtistAlbum.setSelected(true);
         mTransientSeek = findViewById(R.id.transient_seek);
         mTransientSeekBar = (SeekBar) findViewById(R.id.transient_seek_bar);
         mTransientSeekBar.setOnSeekBarChangeListener(mOnSeekBarChangeListener);
@@ -274,6 +289,8 @@
             view.setOnClickListener(mTransportCommandListener);
             view.setOnLongClickListener(mTransportShowSeekBarListener);
         }
+        final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn();
+        setEnableMarquee(screenOn);
     }
 
     @Override
@@ -286,6 +303,7 @@
         }
         if (DEBUG) Log.v(TAG, "Registering TCV " + this);
         mAudioManager.registerRemoteController(mRemoteController);
+        KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitor);
     }
 
     @Override
@@ -302,6 +320,7 @@
         super.onDetachedFromWindow();
         if (DEBUG) Log.v(TAG, "Unregistering TCV " + this);
         mAudioManager.unregisterRemoteController(mRemoteController);
+        KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitor);
         mUserSeeking = false;
     }
 
@@ -311,6 +330,7 @@
         final ColorMatrix cm = new ColorMatrix();
         cm.setSaturation(0);
         mBadge.setColorFilter(new ColorMatrixColorFilter(cm));
+        mBadge.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN));
         mBadge.setImageAlpha(0xef);
     }
 
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 734f517..45cd3d4 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -92,7 +92,8 @@
     protected static final int MSG_SET_PLAYBACK_STATE = 316;
     protected static final int MSG_USER_INFO_CHANGED = 317;
     protected static final int MSG_REPORT_EMERGENCY_CALL_ACTION = 318;
-
+    private static final int MSG_SCREEN_TURNED_ON = 319;
+    private static final int MSG_SCREEN_TURNED_OFF = 320;
 
     private static KeyguardUpdateMonitor sInstance;
 
@@ -127,6 +128,8 @@
 
     private boolean mSwitchingUser;
 
+    private boolean mScreenOn;
+
     private final Handler mHandler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
@@ -185,6 +188,12 @@
                 case MSG_REPORT_EMERGENCY_CALL_ACTION:
                     handleReportEmergencyCallAction();
                     break;
+                case MSG_SCREEN_TURNED_OFF:
+                    handleScreenTurnedOff(msg.arg1);
+                    break;
+                case MSG_SCREEN_TURNED_ON:
+                    handleScreenTurnedOn();
+                    break;
             }
         }
     };
@@ -232,6 +241,10 @@
 
         }
 
+        public void setEnabled(boolean enabled) {
+            // no-op: this RemoteControlDisplay is not subject to being disabled.
+        }
+
         public void setCurrentClientId(int clientGeneration, PendingIntent mediaIntent,
                 boolean clearing) throws RemoteException {
             Message msg = mHandler.obtainMessage(MSG_SET_CURRENT_CLIENT_ID,
@@ -407,6 +420,26 @@
         return sInstance;
     }
 
+    protected void handleScreenTurnedOn() {
+        final int count = mCallbacks.size();
+        for (int i = 0; i < count; i++) {
+            KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
+            if (cb != null) {
+                cb.onScreenTurnedOn();
+            }
+        }
+    }
+
+    protected void handleScreenTurnedOff(int arg1) {
+        final int count = mCallbacks.size();
+        for (int i = 0; i < count; i++) {
+            KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
+            if (cb != null) {
+                cb.onScreenTurnedOff(arg1);
+            }
+        }
+    }
+
     /**
      * IMPORTANT: Must be called from UI thread.
      */
@@ -1037,4 +1070,24 @@
     public DisplayClientState getCachedDisplayClientState() {
         return mDisplayClientState;
     }
+
+    // TODO: use these callbacks elsewhere in place of the existing notifyScreen*()
+    // (KeyguardViewMediator, KeyguardHostView)
+    public void dispatchScreenTurnedOn() {
+        synchronized (this) {
+            mScreenOn = true;
+        }
+        mHandler.sendEmptyMessage(MSG_SCREEN_TURNED_ON);
+    }
+
+    public void dispatchScreenTurndOff(int why) {
+        synchronized(this) {
+            mScreenOn = false;
+        }
+        mHandler.sendMessage(mHandler.obtainMessage(MSG_SCREEN_TURNED_OFF, why, 0));
+    }
+
+    public boolean isScreenOn() {
+        return mScreenOn;
+    }
 }
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
index e6dddab..76f9637 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
@@ -19,6 +19,7 @@
 import android.app.admin.DevicePolicyManager;
 import android.graphics.Bitmap;
 import android.media.AudioManager;
+import android.view.WindowManagerPolicy;
 
 import com.android.internal.telephony.IccCardConstants;
 
@@ -137,7 +138,23 @@
      */
     void onEmergencyCallAction() { }
 
+    /**
+     * Called when the transport background changes.
+     * @param bitmap
+     */
     public void onSetBackground(Bitmap bitmap) {
-        // THIS SPACE FOR RENT
     }
+
+    /**
+     * Called when the screen turns on
+     */
+    public void onScreenTurnedOn() { }
+
+    /**
+     * Called when the screen turns off
+     * @param why {@link WindowManagerPolicy#OFF_BECAUSE_OF_USER},
+     *   {@link WindowManagerPolicy#OFF_BECAUSE_OF_TIMEOUT} or
+     *   {@link WindowManagerPolicy#OFF_BECAUSE_OF_PROX_SENSOR}.
+     */
+    public void onScreenTurnedOff(int why) { }
 }
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java b/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java
index 2084a16..65841805 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java
@@ -124,9 +124,9 @@
         // activities. Other disabled bits are handled by the KeyguardViewMediator talking
         // directly to the status bar service.
         int visFlags = View.STATUS_BAR_DISABLE_HOME;
-        if (shouldEnableTransparentBars()) {
-            visFlags |= View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS
-                      | View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION;
+        if (shouldEnableTranslucentDecor()) {
+            mWindowLayoutParams.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
+                                       | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
         }
         if (DEBUG) Log.v(TAG, "show:setSystemUiVisibility(" + Integer.toHexString(visFlags)+")");
         mKeyguardHost.setSystemUiVisibility(visFlags);
@@ -143,9 +143,9 @@
                 || res.getBoolean(R.bool.config_enableLockScreenRotation);
     }
 
-    private boolean shouldEnableTransparentBars() {
+    private boolean shouldEnableTranslucentDecor() {
         Resources res = mContext.getResources();
-        return res.getBoolean(R.bool.config_enableLockScreenTransparentBars);
+        return res.getBoolean(R.bool.config_enableLockScreenTranslucentDecor);
     }
 
     class ViewManagerHost extends FrameLayout {
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java b/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java
index dc28bd0..a37a3a4 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java
@@ -599,6 +599,7 @@
                 doKeyguardLocked(null);
             }
         }
+        KeyguardUpdateMonitor.getInstance(mContext).dispatchScreenTurndOff(why);
     }
 
     private void doKeyguardLaterLocked() {
@@ -664,6 +665,7 @@
                 notifyScreenOnLocked(callback);
             }
         }
+        KeyguardUpdateMonitor.getInstance(mContext).dispatchScreenTurnedOn();
         maybeSendUserPresentBroadcast();
     }
 
diff --git a/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java b/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java
index 67d0d5a..528f988 100644
--- a/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java
+++ b/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java
@@ -79,7 +79,7 @@
         final Resources res = getResources();
         mDisplayMetrics = res.getDisplayMetrics();
 
-        setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE);
+        setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
     }
 
     public void setInsets(Rect insets) {
diff --git a/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java b/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java
index 9718c9b..4f377a3 100644
--- a/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java
+++ b/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java
@@ -260,7 +260,7 @@
         mChallengeBottomBound = res.getDimensionPixelSize(R.dimen.kg_widget_pager_bottom_padding);
 
         setWillNotDraw(false);
-        setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE);
+        setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
     }
 
     public void setInsets(Rect insets) {
diff --git a/packages/PrintSpooler/res/drawable-hdpi/ic_restart.png b/packages/PrintSpooler/res/drawable-hdpi/ic_restart.png
new file mode 100644
index 0000000..bb9d855
--- /dev/null
+++ b/packages/PrintSpooler/res/drawable-hdpi/ic_restart.png
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-mdpi/ic_restart.png b/packages/PrintSpooler/res/drawable-mdpi/ic_restart.png
new file mode 100644
index 0000000..bd611e8
--- /dev/null
+++ b/packages/PrintSpooler/res/drawable-mdpi/ic_restart.png
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-xhdpi/ic_restart.png b/packages/PrintSpooler/res/drawable-xhdpi/ic_restart.png
new file mode 100644
index 0000000..a7fdc0d
--- /dev/null
+++ b/packages/PrintSpooler/res/drawable-xhdpi/ic_restart.png
Binary files differ
diff --git a/packages/PrintSpooler/res/layout/printer_dropdown_item.xml b/packages/PrintSpooler/res/layout/printer_dropdown_item.xml
index 6439b49..2749aa6 100644
--- a/packages/PrintSpooler/res/layout/printer_dropdown_item.xml
+++ b/packages/PrintSpooler/res/layout/printer_dropdown_item.xml
@@ -37,7 +37,8 @@
     <LinearLayout
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:orientation="vertical">
+        android:orientation="vertical"
+        android:duplicateParentState="true">
 
         <TextView
             android:id="@+id/title"
diff --git a/packages/PrintSpooler/res/layout/select_printer_activity.xml b/packages/PrintSpooler/res/layout/select_printer_activity.xml
index 2792dcf..6fc77df 100644
--- a/packages/PrintSpooler/res/layout/select_printer_activity.xml
+++ b/packages/PrintSpooler/res/layout/select_printer_activity.xml
@@ -48,6 +48,7 @@
             </ImageView>
 
             <TextView
+                android:id="@+id/title"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:textAppearance="?android:attr/textAppearanceLarge"
@@ -56,6 +57,7 @@
             </TextView>
 
             <ProgressBar
+                android:id="@+id/progress_bar"
                 android:layout_width="fill_parent"
                 android:layout_height="wrap_content"
                 android:indeterminate="true"
diff --git a/packages/PrintSpooler/res/menu/select_printer_activity.xml b/packages/PrintSpooler/res/menu/select_printer_activity.xml
index d4ce1cf..ee62f9f 100644
--- a/packages/PrintSpooler/res/menu/select_printer_activity.xml
+++ b/packages/PrintSpooler/res/menu/select_printer_activity.xml
@@ -21,14 +21,14 @@
         android:title="@string/search"
         android:icon="@*android:drawable/ic_menu_search_holo_light"
         android:actionViewClass="android.widget.SearchView"
-        android:showAsAction="ifRoom"
+        android:showAsAction="ifRoom|collapseActionView"
         android:alphabeticShortcut="f"
         android:imeOptions="actionSearch">
     </item>
 
     <item
         android:id="@+id/action_add_printer"
-        android:title="@null"
+        android:title="@string/print_add_printer"
         android:icon="@*android:drawable/create_contact"
         android:showAsAction="ifRoom"
         android:alphabeticShortcut="a">
diff --git a/packages/PrintSpooler/res/values-af/strings.xml b/packages/PrintSpooler/res/values-af/strings.xml
index 133dcfa..f307f2a 100644
--- a/packages/PrintSpooler/res/values-af/strings.xml
+++ b/packages/PrintSpooler/res/values-af/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Drukvoorskou"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Installeer PDF-bekyker vir voorskou"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Drukkerprogram het omgeval"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"onbeskikbaar"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Bladsye"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Genereer uitdruktaak"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Stoor as PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Alle drukkers…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Deursoek"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Alle drukkers"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Voeg diens by"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Kies drukdiens"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Soek tans vir drukkers"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Druk tans <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Kanselleer tans <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-am/strings.xml b/packages/PrintSpooler/res/values-am/strings.xml
index 1542bab..49928750 100644
--- a/packages/PrintSpooler/res/values-am/strings.xml
+++ b/packages/PrintSpooler/res/values-am/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"የህትመት ቅድመ እይታ"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"ለቅድመ-እይታ የፒ ዲ ኤፍ መመልከቻ ይጫኑ"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"የአታሚ መተግበሪያ ተበላሽቷል"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"አይገኝም"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"የህትመት ስራን በማመንጨት ላይ"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"እንደ ፒ ዲ ኤፍ አስቀምጥ"</string>
     <string name="all_printers" msgid="5018829726861876202">"ሁሉም አታሚዎች…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"ፍለጋ"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"ሁሉም አታሚዎች"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"አገልግሎት አክል"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"የህትመት አገልግሎት ይምረጡ"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>ን በማተም ላይ"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>ን በመተው ላይ"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"የአታሚ ስህተት <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-ar/strings.xml b/packages/PrintSpooler/res/values-ar/strings.xml
index 042cda8..03f62b8 100644
--- a/packages/PrintSpooler/res/values-ar/strings.xml
+++ b/packages/PrintSpooler/res/values-ar/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"معاينة قبل الطباعة"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"تثبيت برنامج عرض PDF للمعاينة"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"تعطّل تطبيق الطباعة"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"غير متوفر"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"جارٍ إنشاء مهمة الطباعة"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"حفظ بتنسيق PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"جميع الطابعات…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"بحث"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"جميع الطابعات"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"إضافة خدمة"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"اختر خدمة طباعة"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"جارٍ طباعة <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"جارٍ إلغاء <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"خطا في الطابعة <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-be/donottranslate.xml b/packages/PrintSpooler/res/values-be/donottranslate.xml
new file mode 100644
index 0000000..7537aa5
--- /dev/null
+++ b/packages/PrintSpooler/res/values-be/donottranslate.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<resources>
+
+    <string name="mediasize_default">NA_LETTER</string>
+    <string name="mediasize_standard">@string/mediasize_standard_north_america</string>
+
+</resources>
diff --git a/packages/PrintSpooler/res/values-bg/strings.xml b/packages/PrintSpooler/res/values-bg/strings.xml
index c28cbf1..a4e8f53 100644
--- a/packages/PrintSpooler/res/values-bg/strings.xml
+++ b/packages/PrintSpooler/res/values-bg/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Визуализация за печат"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Инсталиране на визуализатор на PDF"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Получи се срив в приложението за отпечатване"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"няма информация"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Заданието за печат се генерира"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Запазване като PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Всички принтери…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Търсене"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Всички принтери"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Добавяне на услуга"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Избиране на услуга за отпечатване"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"„<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>“ се отпечатва"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"„<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>“ се анулира"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Грешка в принтера при „<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>“"</string>
diff --git a/packages/PrintSpooler/res/values-ca/strings.xml b/packages/PrintSpooler/res/values-ca/strings.xml
index 4385966..d7cc213 100644
--- a/packages/PrintSpooler/res/values-ca/strings.xml
+++ b/packages/PrintSpooler/res/values-ca/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Visualització prèvia impressió"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Instal·la un lector de PDF per a visualitz. prèvia"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"L\'aplicació d\'impressió ha fallat"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"no disponible"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Generant tasca impressió"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Desa com a PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Totes les impressores…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Cerca"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Totes les impressores"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Afegeix un servei"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Selecció del servei d\'impressió"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"S\'està imprimint <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"S\'està cancel·lant <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Error d\'impressora <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-cs/strings.xml b/packages/PrintSpooler/res/values-cs/strings.xml
index 402c467..f435215 100644
--- a/packages/PrintSpooler/res/values-cs/strings.xml
+++ b/packages/PrintSpooler/res/values-cs/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Náhled tisku"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Nainstalovat prohlížeč PDF (umožní náhled)"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Aplikace tisku selhala"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"nedostupné"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Stránky"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Generování úlohy tisku"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Uložit ve formátu PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Všechny tiskárny…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Hledat"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Všechny tiskárny"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Přidat službu"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Zvolte službu tisku"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Vyhledávání tiskáren"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Tisk úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Rušení úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-da/strings.xml b/packages/PrintSpooler/res/values-da/strings.xml
index 872158b..c0dcee4 100644
--- a/packages/PrintSpooler/res/values-da/strings.xml
+++ b/packages/PrintSpooler/res/values-da/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Vis udskrift"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Installer et PDF-visningsprog. for at se eksempel"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Udskrivningsapp gik ned"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"utilgængelig"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Udskriften generes"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Gem som PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Alle printere..."</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Søg"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Alle printere"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Tilføj tjeneste"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Vælg udskriftstjeneste"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> udskrives"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> annulleres"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Udskriften <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> mislykkedes"</string>
diff --git a/packages/PrintSpooler/res/values-de/strings.xml b/packages/PrintSpooler/res/values-de/strings.xml
index 4e478be..97c8c0e 100644
--- a/packages/PrintSpooler/res/values-de/strings.xml
+++ b/packages/PrintSpooler/res/values-de/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Vorschau drucken"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"PDF-Viewer für Vorschau installieren"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Druck-App abgestürzt"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"nicht verfügbar"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Seiten"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Druckauftrag wird generiert..."</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Als PDF speichern"</string>
     <string name="all_printers" msgid="5018829726861876202">"Alle Drucker…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Suchen"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Alle Drucker"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Dienst hinzufügen"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Druckdienst auswählen"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Suche nach Druckern…"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> wird gedruckt..."</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> wird abgebrochen..."</string>
diff --git a/packages/PrintSpooler/res/values-el/strings.xml b/packages/PrintSpooler/res/values-el/strings.xml
index 174ead3..6bdf19d 100644
--- a/packages/PrintSpooler/res/values-el/strings.xml
+++ b/packages/PrintSpooler/res/values-el/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Προεπισκόπηση εκτύπωσης"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Εγκαταστήστε το PDF viewer για προεπισκόπηση"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Διακοπή λειτουργίας εφαρμογής εκτύπωσης"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"μη διαθέσιμο"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Δημιουργία εργασίας εκτύπωσης"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Αποθήκευση ως PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Όλοι οι εκτυπωτές…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Αναζήτηση"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Όλοι οι εκτυπωτές"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Προσθήκη υπηρεσίας"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Επιλέξτε υπηρεσία εκτύπωσης"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Εκτύπωση <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Ακύρωση <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Σφάλμα εκτυπωτή <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-en-rCA/arrays.xml b/packages/PrintSpooler/res/values-en-rCA/arrays.xml
new file mode 100644
index 0000000..d40278c
--- /dev/null
+++ b/packages/PrintSpooler/res/values-en-rCA/arrays.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<resources>
+
+    <string-array name="pdf_printer_media_sizes" translatable="false">
+        <item>NA_LETTER</item>
+        <item>NA_GOVT_LETTER</item>
+        <item>NA_LEGAL</item>
+        <item>NA_JUNIOR_LEGAL</item>
+        <item>NA_LEDGER</item>
+        <item>NA_TABLOID</item>
+        <item>NA_INDEX_3X5</item>
+        <item>NA_INDEX_4X6</item>
+        <item>NA_INDEX_5X8</item>
+        <item>NA_MONARCH</item>
+        <item>NA_QUARTO</item>
+        <item>NA_FOOLSCAP</item>
+    </string-array>
+
+</resources>
diff --git a/packages/PrintSpooler/res/values-en-rCA/donottranslate.xml b/packages/PrintSpooler/res/values-en-rCA/donottranslate.xml
new file mode 100644
index 0000000..fb1f5d6
--- /dev/null
+++ b/packages/PrintSpooler/res/values-en-rCA/donottranslate.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <string name="mediasize_default">NA_LETTER</string>
+    <string name="mediasize_standard">@string/mediasize_standard_north_america</string>
+
+</resources>
diff --git a/packages/PrintSpooler/res/values-en-rGB/strings.xml b/packages/PrintSpooler/res/values-en-rGB/strings.xml
index 43bba24..77f275d 100644
--- a/packages/PrintSpooler/res/values-en-rGB/strings.xml
+++ b/packages/PrintSpooler/res/values-en-rGB/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Print preview"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Install PDF viewer for preview"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Printing app crashed"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"unavailable"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Pages"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Generating print job"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Save as PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"All printers…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Search"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"All printers"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Add service"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Choose print service"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Searching for printers"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Printing <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelling <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-en-rIN/strings.xml b/packages/PrintSpooler/res/values-en-rIN/strings.xml
index 43bba24..77f275d 100644
--- a/packages/PrintSpooler/res/values-en-rIN/strings.xml
+++ b/packages/PrintSpooler/res/values-en-rIN/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Print preview"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Install PDF viewer for preview"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Printing app crashed"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"unavailable"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Pages"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Generating print job"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Save as PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"All printers…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Search"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"All printers"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Add service"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Choose print service"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Searching for printers"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Printing <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelling <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-en-rUS/arrays.xml b/packages/PrintSpooler/res/values-en-rUS/arrays.xml
new file mode 100644
index 0000000..d40278c
--- /dev/null
+++ b/packages/PrintSpooler/res/values-en-rUS/arrays.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<resources>
+
+    <string-array name="pdf_printer_media_sizes" translatable="false">
+        <item>NA_LETTER</item>
+        <item>NA_GOVT_LETTER</item>
+        <item>NA_LEGAL</item>
+        <item>NA_JUNIOR_LEGAL</item>
+        <item>NA_LEDGER</item>
+        <item>NA_TABLOID</item>
+        <item>NA_INDEX_3X5</item>
+        <item>NA_INDEX_4X6</item>
+        <item>NA_INDEX_5X8</item>
+        <item>NA_MONARCH</item>
+        <item>NA_QUARTO</item>
+        <item>NA_FOOLSCAP</item>
+    </string-array>
+
+</resources>
diff --git a/packages/PrintSpooler/res/values-en-rUS/donottranslate.xml b/packages/PrintSpooler/res/values-en-rUS/donottranslate.xml
new file mode 100644
index 0000000..fb1f5d6
--- /dev/null
+++ b/packages/PrintSpooler/res/values-en-rUS/donottranslate.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <string name="mediasize_default">NA_LETTER</string>
+    <string name="mediasize_standard">@string/mediasize_standard_north_america</string>
+
+</resources>
diff --git a/packages/PrintSpooler/res/values-es-rUS/donottranslate.xml b/packages/PrintSpooler/res/values-es-rUS/donottranslate.xml
new file mode 100644
index 0000000..fb1f5d6
--- /dev/null
+++ b/packages/PrintSpooler/res/values-es-rUS/donottranslate.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <string name="mediasize_default">NA_LETTER</string>
+    <string name="mediasize_standard">@string/mediasize_standard_north_america</string>
+
+</resources>
diff --git a/packages/PrintSpooler/res/values-es-rUS/strings.xml b/packages/PrintSpooler/res/values-es-rUS/strings.xml
index b2bb402..c3cc9cb 100644
--- a/packages/PrintSpooler/res/values-es-rUS/strings.xml
+++ b/packages/PrintSpooler/res/values-es-rUS/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Vista previa de impresión"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Instalar visualizador de PDF para vista previa"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"La aplicación de impresión falló"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"no disponible"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Generando trabajo de impresión"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Guardar como PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Todas las impresoras…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Buscar"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Todas las impresoras"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Agregar servicio"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Elegir servicio de impresión"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Imprimiendo <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelando <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Error de impresora <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-es/strings.xml b/packages/PrintSpooler/res/values-es/strings.xml
index 4014061..4cd820f 100644
--- a/packages/PrintSpooler/res/values-es/strings.xml
+++ b/packages/PrintSpooler/res/values-es/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Vista previa de impresión"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Instalar visor PDF para obtener vista previa"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Error de aplicación de impresión"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"no disponible"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Páginas"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Generando trabajo de impresión"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Guardar como PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Todas las impresoras…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Buscar"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Todas las impresoras"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Añadir servicio"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Seleccionar servicio de impresión"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Buscando impresoras"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Imprimiendo <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelando <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-et-rEE/strings.xml b/packages/PrintSpooler/res/values-et-rEE/strings.xml
index f87c9fa..b2e579f 100644
--- a/packages/PrintSpooler/res/values-et-rEE/strings.xml
+++ b/packages/PrintSpooler/res/values-et-rEE/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Prindi eelvaade"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"PDF-vaaturi installimine eelvaate kuvamiseks"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Printimisrakendus jooksis kokku"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"pole teada"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Lehed"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Prinditöö loomine"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Salvesta PDF-ina"</string>
     <string name="all_printers" msgid="5018829726861876202">"Kõik printerid …"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Otsing"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Kõik printerid"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Lisa teenus"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Prinditeenuse valimine"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Printerite otsimine"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Prinditöö <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> printimine"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Prinditöö <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> tühistamine"</string>
diff --git a/packages/PrintSpooler/res/values-fa/strings.xml b/packages/PrintSpooler/res/values-fa/strings.xml
index 3bc377f..1846398 100644
--- a/packages/PrintSpooler/res/values-fa/strings.xml
+++ b/packages/PrintSpooler/res/values-fa/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"پیش‌نمایش چاپ"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"نصب نمایشگر PDF برای پیش‌نمایش"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"برنامه چاپ خراب شد"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"در دسترس نیست"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"در حال ایجاد کار چاپ"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"ذخیره به‌عنوان PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"همه چاپگرها..."</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"جستجو"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"همه چاپگرها"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"افزودن سرویس"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"انتخاب سرویس چاپ"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"در حال چاپ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"در حال لغو <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"خطای چاپگر <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-fi/strings.xml b/packages/PrintSpooler/res/values-fi/strings.xml
index ff79f5c..d6324a6 100644
--- a/packages/PrintSpooler/res/values-fi/strings.xml
+++ b/packages/PrintSpooler/res/values-fi/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Tulostuksen esikatselu"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Asenna PDF-katseluohjelma esikatselua varten"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Tulostussovellus kaatui"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"ei käytettävissä"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Sivut"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Luodaan tulostustyö"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Tallenna PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Kaikki tulostimet…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Haku"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Kaikki tulostimet"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Lisää palvelu"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Valitse tulostuspalvelu"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Etsitään tulostimia"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Tulostetaan <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Peruutetaan työ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-fr-rCA/strings.xml b/packages/PrintSpooler/res/values-fr-rCA/strings.xml
index aa02b63..06b3096 100644
--- a/packages/PrintSpooler/res/values-fr-rCA/strings.xml
+++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Aperçu avant impression"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Installer un lecteur PDF pour voir l\'aperçu"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"L\'application à l\'origine de l\'impression a planté"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"non offert"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Génération tâche impression…"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Enregistrer en format PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Toutes les imprimantes…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Rechercher"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Toutes les imprimantes"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Ajouter le service"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Sélectionner le service d\'impression"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Impression de <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> en cours…"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Annulation de « <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> »…"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Erreur impression : « <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> »"</string>
diff --git a/packages/PrintSpooler/res/values-fr/strings.xml b/packages/PrintSpooler/res/values-fr/strings.xml
index cc5aeef..38d7cf6 100644
--- a/packages/PrintSpooler/res/values-fr/strings.xml
+++ b/packages/PrintSpooler/res/values-fr/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Aperçu avant impression"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Installer un lecteur PDF pour afficher l\'aperçu"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"L\'application à l\'origine de l\'impression a planté"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"non disponible"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Pages"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Génération tâche impression…"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Enregistrer au format .PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Toutes les imprimantes…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Rechercher"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Toutes les imprimantes"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Ajouter un service"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Sélectionner le service d\'impression"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Recherche d\'imprimantes en cours"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Impression de \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" en cours…"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Annulation de \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" en cours…"</string>
diff --git a/packages/PrintSpooler/res/values-hi/strings.xml b/packages/PrintSpooler/res/values-hi/strings.xml
index a80177f..36c8039 100644
--- a/packages/PrintSpooler/res/values-hi/strings.xml
+++ b/packages/PrintSpooler/res/values-hi/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"प्रिंट पूर्वावलोकन"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"पूर्वावलोकन के लिए PDF व्यूअर इंस्टॉल करें"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"प्रिंटिंग एप्लिकेशन क्रैश हो गया"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"अनुपलब्ध"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"पृष्ठ"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"प्रिंट कार्य जनरेट हो रहा है"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"PDF के रूप में सहेजें"</string>
     <string name="all_printers" msgid="5018829726861876202">"सभी प्रिंटर..."</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"खोजें"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"सभी प्रिंटर"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"सेवा जोड़ें"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"प्रिंट सेवा चुनें"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"प्रिंटर खोज रहा है"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> प्रिंट हो रहा है"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> रद्द हो रहा है"</string>
diff --git a/packages/PrintSpooler/res/values-hr/strings.xml b/packages/PrintSpooler/res/values-hr/strings.xml
index 0aa184a..ff22dfb 100644
--- a/packages/PrintSpooler/res/values-hr/strings.xml
+++ b/packages/PrintSpooler/res/values-hr/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Pregled ispisa"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Instaliraj PDF preglednik za pregled"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Srušila se aplikacija za ispis"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"nedostupno"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Generiranje zadatka ispisa"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Spremi kao PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Svi pisači…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Pretraživanje"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Svi pisači"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Dodaj uslugu"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Odaberite uslugu ispisa"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Ispisivanje <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Otkazivanje zadatka <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Pogreška pisača <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-hu/strings.xml b/packages/PrintSpooler/res/values-hu/strings.xml
index d7c7d33..5dcedd8 100644
--- a/packages/PrintSpooler/res/values-hu/strings.xml
+++ b/packages/PrintSpooler/res/values-hu/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Előnézet nyomtatása"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Az előnézethez telepítse a PDF-megtekintőt."</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"A nyomtatási alkalmazás összeomlott."</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"nem érhető el"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Oldalak"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Nyomtatási feladat létrehozása"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Mentés PDF-ként"</string>
     <string name="all_printers" msgid="5018829726861876202">"Az összes nyomtató…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Keresés"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Az összes nyomtató"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Szolgáltatás hozzáadása"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Nyomtatási szolgáltatás kiválasztása"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Nyomtatók keresése"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"A(z) <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> nyomtatása"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"A(z) <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> törlése"</string>
diff --git a/packages/PrintSpooler/res/values-hy-rAM/strings.xml b/packages/PrintSpooler/res/values-hy-rAM/strings.xml
index 3575f6f..8e547f8 100644
--- a/packages/PrintSpooler/res/values-hy-rAM/strings.xml
+++ b/packages/PrintSpooler/res/values-hy-rAM/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Տպելու նախադիտում"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Նախադիտման համար տեղադրեք PDF դիտարկիչ"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Տպելու ծրագիրը վթարի է ենթարկվել"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"անհասանելի է"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Էջեր"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Ձևավորվում է տպելու աշխատանքը"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Պահել որպես PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Բոլոր տպիչները..."</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Որոնել"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Բոլոր տպիչները"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Ավելացնել ծառայություն"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Ընտրեք տպելու ծառայությունը"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Տպիչների որոնում"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Տպվում է՝ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>-ը չեղարկվում է"</string>
diff --git a/packages/PrintSpooler/res/values-in/strings.xml b/packages/PrintSpooler/res/values-in/strings.xml
index 6bda2b7..507f09e 100644
--- a/packages/PrintSpooler/res/values-in/strings.xml
+++ b/packages/PrintSpooler/res/values-in/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Pratinjau cetak"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Pasang penampil PDF untuk pratinjau"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Aplikasi pencetakan mogok"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"tidak tersedia"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Laman"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Membuat tugas pencetakan"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Simpan sebagai PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Semua printer…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Cari"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Semua printer"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Tambahkan layanan"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Pilih layanan cetak"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Mencari printer"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Mencetak <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Membatalkan <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-it/strings.xml b/packages/PrintSpooler/res/values-it/strings.xml
index 71667dd..4bb7c5b1 100644
--- a/packages/PrintSpooler/res/values-it/strings.xml
+++ b/packages/PrintSpooler/res/values-it/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Anteprima di stampa"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Installa visualizzatore PDF per anteprima"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Arresto anomalo dell\'app di stampa"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"non disponibile"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Pagine"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Generazione processo di stampa"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Salva in PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Tutte le stampanti…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Cerca"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Tutte le stampanti"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Aggiungi servizio"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Scegli servizio di stampa"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Ricerca di stampanti"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Stampa di <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Annullamento di <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-iw/strings.xml b/packages/PrintSpooler/res/values-iw/strings.xml
index 337a4a3..7521339 100644
--- a/packages/PrintSpooler/res/values-iw/strings.xml
+++ b/packages/PrintSpooler/res/values-iw/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"תצוגה מקדימה של הדפסה"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"התקן מציג PDF ליצירת תצוגה מקדימה"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"אפליקציית ההדפסה קרסה"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"לא זמין"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"עמודים"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"יוצר עבודת הדפסה"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"שמור כ-PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"כל המדפסות…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"חפש"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"כל המדפסות"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"הוסף שירות"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"בחר שירות הדפסה"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"מחפש מדפסות"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"מדפיס את <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"מבטל את <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-ja/donottranslate.xml b/packages/PrintSpooler/res/values-ja/donottranslate.xml
new file mode 100644
index 0000000..d334ddd
--- /dev/null
+++ b/packages/PrintSpooler/res/values-ja/donottranslate.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<resources>
+
+    <string name="mediasize_default">JIS_B5</string>
+    <string name="mediasize_standard">@string/mediasize_standard_japan</string>
+
+</resources>
diff --git a/packages/PrintSpooler/res/values-ja/strings.xml b/packages/PrintSpooler/res/values-ja/strings.xml
index bf28134..7556049 100644
--- a/packages/PrintSpooler/res/values-ja/strings.xml
+++ b/packages/PrintSpooler/res/values-ja/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"印刷プレビュー"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"プレビュー用PDFビューアをインストール"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"印刷アプリでの障害発生"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"不明"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"ページ数"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"印刷ジョブを生成しています"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"PDF形式で保存"</string>
     <string name="all_printers" msgid="5018829726861876202">"すべてのプリンタ…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"検索"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"すべてのプリンタ"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"サービスを追加"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"印刷サービスの選択"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"プリンタの検索中"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>を印刷しています"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>をキャンセルしています"</string>
diff --git a/packages/PrintSpooler/res/values-ka-rGE/strings.xml b/packages/PrintSpooler/res/values-ka-rGE/strings.xml
index 93d36e0..25abd07 100644
--- a/packages/PrintSpooler/res/values-ka-rGE/strings.xml
+++ b/packages/PrintSpooler/res/values-ka-rGE/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"ნახვა ამობეჭდვამდე"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"გადახედვისთვის დააყენეთ PDF მნახველი"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"ბეჭდვის აპი ავარიულად გაითიშა"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"მიუწვდომელი"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"მიმდინარეობის ბეჭდვის დავალების შექმნა"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"PDF-ად შენახვა"</string>
     <string name="all_printers" msgid="5018829726861876202">"ყველა პრინტერი…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"ძიება"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"ყველა პრინტერი"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"სერვისის დამატება"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"აირჩიეთ ბეჭდვის სერვისი"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"იბეჭდება <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"მიმდინარეობს <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>-ის გაუქმება"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"ბეჭდვის შეცდომა <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-km-rKH/strings.xml b/packages/PrintSpooler/res/values-km-rKH/strings.xml
index 805ddf9..9125e282a 100644
--- a/packages/PrintSpooler/res/values-km-rKH/strings.xml
+++ b/packages/PrintSpooler/res/values-km-rKH/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"មើល​មុន​បោះពុម្ព"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"ដំឡើង​កម្មវិធី​មើល PDF សម្រាប់​ការ​មើល​ជា​មុន"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"កម្មវិធី​បោះពុម្ព​គាំង"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"មិន​មាន"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"ទំព័រ"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"​បង្កើត​ការ​ងារ​បោះពុម្ព"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"រក្សា​ទុក​ជា PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"ម៉ាស៊ីន​បោះពុម្ព​ទាំងអស់ ..."</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"ស្វែងរក"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"ម៉ាស៊ីន​បោះពុម្ព​ទាំងអស់"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"បន្ថែម​សេវាកម្ម"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"ជ្រើស​សេវា​បោះពុម្ព"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"ស្វែងរក​ម៉ាស៊ីន​បោះពុម្ព"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"កំពុង​​បោះពុម្ព <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"ការ​បោះបង់ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-ko/strings.xml b/packages/PrintSpooler/res/values-ko/strings.xml
index 16bfbbbd..0aef672 100644
--- a/packages/PrintSpooler/res/values-ko/strings.xml
+++ b/packages/PrintSpooler/res/values-ko/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"인쇄 미리보기"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"미리보기용 PDF 뷰어 설치"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"인쇄 앱에 오류 발생"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"사용할 수 없음"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"페이지"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"인쇄 작업 생성 중"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"PDF로 저장"</string>
     <string name="all_printers" msgid="5018829726861876202">"모든 프린터…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"검색"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"모든 프린터"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"서비스 추가"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"인쇄 서비스 선택"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"프린터 검색 중"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> 인쇄 중"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> 취소 중"</string>
diff --git a/packages/PrintSpooler/res/values-lo-rLA/strings.xml b/packages/PrintSpooler/res/values-lo-rLA/strings.xml
index be81102..cbbe9b6 100644
--- a/packages/PrintSpooler/res/values-lo-rLA/strings.xml
+++ b/packages/PrintSpooler/res/values-lo-rLA/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"ເບິ່ງກ່ອນພິມ"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"ຕິດຕັ້ງໂປຼແກຼມເບິ່ງ PDF ເພື່ອເບິ່ງຕົວຢ່າງ"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"ແອັບຯພິມລົ້ມເຫລວ"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"ບໍ່ມີຂໍ້ມູນ"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"ໜ້າ"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"ກຳລັງສ້າງວຽກພິມ"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"ບັນທຶກເປັ​​ນ PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"ທຸກເຄື່ອງພິມ..."</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"ຊອກຫາ"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"ທຸກເຄື່ອງພິມ"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"ເພີ່ມບໍລິການ"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"ເລືອກບໍລິການການພິມ"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"ກຳລັງຊອກຫາເຄື່ອງພິມ"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"ກຳລັງພິມ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"ກຳລັງຍົກເລີກ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-lt/strings.xml b/packages/PrintSpooler/res/values-lt/strings.xml
index 06d79ee..624854f 100644
--- a/packages/PrintSpooler/res/values-lt/strings.xml
+++ b/packages/PrintSpooler/res/values-lt/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Spaudinio peržiūra"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Įdiegti PDF peržiūros priemonę"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Spausdinimo programa užstrigo"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"nežinoma"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Generuojama spausd. užduotis"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Išsaugoti kaip PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Visi spausdintuvai…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Ieškoti"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Visi spausdintuvai"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Pridėti paslaugą"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Pasirinkite spausdinimo paslaugą"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Spausdinama: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Atšaukiama: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Spausdintuvo klaida: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-lv/strings.xml b/packages/PrintSpooler/res/values-lv/strings.xml
index b5ef76e..a7066fc 100644
--- a/packages/PrintSpooler/res/values-lv/strings.xml
+++ b/packages/PrintSpooler/res/values-lv/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Drukas priekšskatījums"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Instalēt PDF skatītāju priekšskatīšanai"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Drukas lietotne avarēja"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"Nav zināms"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Ģenerē drukas darbu…"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Saglabāt kā PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Visi printeri…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Meklēt"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Visi printeri"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Pievienot pakalpojumu"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Izvēlieties drukāšanas pakalpojumu"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Notiek darba <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> drukāšana…"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Pārtrauc drukas darbu <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>…"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Printera kļūda ar darbu <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-mn-rMN/strings.xml b/packages/PrintSpooler/res/values-mn-rMN/strings.xml
index 5f16746..58dea51 100644
--- a/packages/PrintSpooler/res/values-mn-rMN/strings.xml
+++ b/packages/PrintSpooler/res/values-mn-rMN/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Хэвлэхээр урьдчилан харах"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Урьдчилан харахын тулд PDF харагчийг суулгах"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Хэвлэгч апп гацсан"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"Байхгүй"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Хуудас"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Хэвлэх ажил үүсгэж байна"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"PDF болгож хадгалах"</string>
     <string name="all_printers" msgid="5018829726861876202">"Бүх принтерүүд…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Хайх"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Бүх принтерүүд"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Үйлчилгээ нэмэх"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Хэвлэх үйлчилгээг сонгох"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Принтер хайж байна"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Хэвлэж байна <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Цуцлаж байна <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-ms-rMY/strings.xml b/packages/PrintSpooler/res/values-ms-rMY/strings.xml
index 8893e09..90fa63a 100644
--- a/packages/PrintSpooler/res/values-ms-rMY/strings.xml
+++ b/packages/PrintSpooler/res/values-ms-rMY/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Pratonton cetak"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Pasang pemapar PDF untuk pratonton"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Apl percetakan ranap"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"tidak tersedia"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Halaman"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Menjana kerja cetak"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Simpan sebagai PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Semua pencetak..."</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Cari"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Semua pencetak"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Tambahkan perkhidmatan"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Pilih perkhidmatan cetak"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Mencari pencetak"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Mencetak <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Membatalkan <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-nb/strings.xml b/packages/PrintSpooler/res/values-nb/strings.xml
index 002068c..44e17acb 100644
--- a/packages/PrintSpooler/res/values-nb/strings.xml
+++ b/packages/PrintSpooler/res/values-nb/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Utskriftsforhåndsvisning"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Installer PDF-leser for forhåndsvisning"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Utskriftsappen krasjet"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"ikke tilgjengelig"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Genererer utskriftsjobb"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Lagre som PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Alle skrivere"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Søk"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Alle skrivere"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Legg til tjeneste"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Velg utskriftstjeneste"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Skriver ut <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Avbryter <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Skriverfeil <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml
index f16922e..9c074df 100644
--- a/packages/PrintSpooler/res/values-nl/strings.xml
+++ b/packages/PrintSpooler/res/values-nl/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Afdrukvoorbeeld"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Pdf-viewer installeren voor voorbeeld"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Afdruk-app gecrasht"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"niet beschikbaar"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Afdruktaak genereren"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Opslaan als pdf"</string>
     <string name="all_printers" msgid="5018829726861876202">"Alle printers…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Zoeken"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Alle printers"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Service toevoegen"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Afdrukservice kiezen"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> afdrukken"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> annuleren"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Printerfout <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-pl/strings.xml b/packages/PrintSpooler/res/values-pl/strings.xml
index d5db22e..bcd57b2 100644
--- a/packages/PrintSpooler/res/values-pl/strings.xml
+++ b/packages/PrintSpooler/res/values-pl/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Podgląd wydruku"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Zainstaluj przeglądarkę PDF, by zobaczyć podgląd"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Aplikacja drukująca uległa awarii"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"brak informacji"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Generowanie zadania wydruku"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Zapisz jako PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Wszystkie drukarki…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Szukaj"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Wszystkie drukarki"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Dodaj usługę"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Wybierz usługę drukowania"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Drukowanie: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Anulowanie: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Błąd drukarki: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml
index a4cb98d..bc7a677 100644
--- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml
+++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Pré-visualização de impressão"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Instalar o leitor de PDF para pré-visualização"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"A aplicação de impressão bloqueou"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"indisponível"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"A gerar tarefa de impressão"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Guardar como PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Todas as impressoras..."</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Pesquisar"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Todas as impressoras"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Adicionar serviço"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Escolher o serviço de impressão"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"A imprimir <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"A cancelar <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Erro da impressora <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-pt/strings.xml b/packages/PrintSpooler/res/values-pt/strings.xml
index 230e827..6c63502 100644
--- a/packages/PrintSpooler/res/values-pt/strings.xml
+++ b/packages/PrintSpooler/res/values-pt/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Visualização de impressão"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Instalar o visualizador de PDF"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"O aplicativo de impressão falhou"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"indisponível"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Páginas"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Gerando trabalho de impressão"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Salvar como PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Todas as impressoras…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Pesquisar"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Todas as impressoras"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Adicionar serviço"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Selecione o serviço de impressão"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Procurando impressoras"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Imprimindo <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelando <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-ro/strings.xml b/packages/PrintSpooler/res/values-ro/strings.xml
index 37fd6b3..d194d65 100644
--- a/packages/PrintSpooler/res/values-ro/strings.xml
+++ b/packages/PrintSpooler/res/values-ro/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Previzualizați printarea"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Instalați PDF viewer pentru previzualizare"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Aplicația de printare s-a blocat"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"indisponibil"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Se generează sarcină printare"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Salvați ca PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Toate imprimantele..."</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Căutați"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Toate imprimantele"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Adăugați un serviciu"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Alegeți serviciul de printare"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Se printează <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Se anulează <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Eroare de printare: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-ru/strings.xml b/packages/PrintSpooler/res/values-ru/strings.xml
index 0271587..bbf66fb 100644
--- a/packages/PrintSpooler/res/values-ru/strings.xml
+++ b/packages/PrintSpooler/res/values-ru/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Предварительный просмотр"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Установить средство просмотра PDF"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Сбой приложения печати"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"неизвестно"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Создание задания печати…"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Сохранить как PDF-файл"</string>
     <string name="all_printers" msgid="5018829726861876202">"Все принтеры"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Поиск"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Все принтеры"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Добавить службу печати"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Выберите службу печати"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Печать задания \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\"…"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Отмена задания <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>…"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Ошибка задания \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\""</string>
diff --git a/packages/PrintSpooler/res/values-sk/strings.xml b/packages/PrintSpooler/res/values-sk/strings.xml
index 01e6d03..81361ad 100644
--- a/packages/PrintSpooler/res/values-sk/strings.xml
+++ b/packages/PrintSpooler/res/values-sk/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Ukážka pred tlačou"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Inštalovať zobrazovač PDF na zobrazenie ukážky"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Aplikácia pre tlač zlyhala"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"nie je k dispozícii"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Generuje sa tlačová úloha"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Uložiť ako PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Všetky tlačiarne..."</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"VYHĽADÁVANIE"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Všetky tlačiarne"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Pridať službu"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Výber tlačovej služby"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Prebieha tlač úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Prebieha zrušenie úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Chyba tlačiarne – úloha <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-sl/strings.xml b/packages/PrintSpooler/res/values-sl/strings.xml
index 61f3dc0..0886831 100644
--- a/packages/PrintSpooler/res/values-sl/strings.xml
+++ b/packages/PrintSpooler/res/values-sl/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Predogled tiskanja"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Za predogled namestite pregledovalnik za PDF-je"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Aplikacija za tiskanje se je zrušila"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"ni na voljo"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Št. strani:"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Ustvarjanje zahteve za tisk"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Shrani kot PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Vsi tiskalniki …"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Iskanje"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Vsi tiskalniki"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Dodaj storitev"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Izberite tiskalno storitev"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Iskanje tiskalnikov"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Tiskanje: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Preklic: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-sr/strings.xml b/packages/PrintSpooler/res/values-sr/strings.xml
index 757871f..93ca41f 100644
--- a/packages/PrintSpooler/res/values-sr/strings.xml
+++ b/packages/PrintSpooler/res/values-sr/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Преглед пре штампања"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Инсталирај PDF приказивач за преглед"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Апликација за штампање је отказала"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"недоступно"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Генерисање задатка за штампање"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Сачувај као PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Сви штампачи…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Претражи"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Сви штампачи"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Додај услугу"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Изаберите услугу штампања"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Штампа се <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Отказује се <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Грешка штампача <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-sv/strings.xml b/packages/PrintSpooler/res/values-sv/strings.xml
index 7c28984..000f88e 100644
--- a/packages/PrintSpooler/res/values-sv/strings.xml
+++ b/packages/PrintSpooler/res/values-sv/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Förhandsgranskning"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Installera PDF-läsare för förhandsgranskning"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Utskriftsappen kraschade"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"otillgängligt"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Genererar utskriftsjobb"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Spara som PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Alla skrivare ..."</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Sök"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Alla skrivare"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Lägg till tjänst"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Välj utskriftstjänst"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Skriver ut <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Avbryter <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Skrivarfel för <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-sw/strings.xml b/packages/PrintSpooler/res/values-sw/strings.xml
index 13ccf46..7e655ee 100644
--- a/packages/PrintSpooler/res/values-sw/strings.xml
+++ b/packages/PrintSpooler/res/values-sw/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Chungulia kwanza kabla ya kuchapisha"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Sakinisha kitazamaji cha PDF kwa onyesho la kuchungulia"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Programu ya kuchapisha imeacha kufanya kazi"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"haipatikani"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Inazanzisha kazi ya kuchapisha"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Hifadhi kama PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Printa zote..."</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Tafuta"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Printa zote"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Ongeza huduma"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Chagua huduma ya printa"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Inachapisha <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Inaghairi <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Hitilafu ya kuchapisha <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-th/strings.xml b/packages/PrintSpooler/res/values-th/strings.xml
index fee7c11..9f6e226 100644
--- a/packages/PrintSpooler/res/values-th/strings.xml
+++ b/packages/PrintSpooler/res/values-th/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"ตัวอย่างก่อนพิมพ์"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"ติดตั้งโปรแกรมดู PDF เพื่อดูหน้าตัวอย่าง"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"แอปการพิมพ์ขัดข้อง"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"ไม่มีข้อมูล"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"หน้า"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"กำลังสร้างงานพิมพ์"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"บันทึกเป็น PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"เครื่องพิมพ์ทั้งหมด…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"ค้นหา"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"เครื่องพิมพ์ทั้งหมด"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"เพิ่มบริการ"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"เลือกบริการพิมพ์"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"กำลังค้นหาเครื่องพิมพ์"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"กำลังพิมพ์ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"กำลังยกเลิก <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-tl/strings.xml b/packages/PrintSpooler/res/values-tl/strings.xml
index 68f74cd..2dc3c39 100644
--- a/packages/PrintSpooler/res/values-tl/strings.xml
+++ b/packages/PrintSpooler/res/values-tl/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Preview sa pag-print"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Mag-install ng PDF viewer para sa pag-preview"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Nag-crash ang app sa pag-print"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"hindi available"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Mga Pahina"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Gumagawa ng pag-print"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"I-save bilang PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Lahat ng printer…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Hanapin"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Lahat ng printer"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Magdagdag ng serbisyo"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Pumili ng serbisyo ng pag-print"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Naghahanap ng mga printer"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Pini-print ang <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Kinakansela ang <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-tr/strings.xml b/packages/PrintSpooler/res/values-tr/strings.xml
index 5cd5f89..bfc80af 100644
--- a/packages/PrintSpooler/res/values-tr/strings.xml
+++ b/packages/PrintSpooler/res/values-tr/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Yazdırmayı önizle"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Önizlemek için PDF görüntüleyici yükleyin"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Yazdırma uygulaması kilitlendi"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"bilinmiyor"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Yazdırma işi oluşturuluyor"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"PDF olarak kaydet"</string>
     <string name="all_printers" msgid="5018829726861876202">"Tüm yazıcılar…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Ara"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Tüm yazıcılar"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Hizmet ekle"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Yazdırma hizmetini seçin"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> yazdırılıyor"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> iptal ediliyor"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Yazıcı hatası: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-uk/strings.xml b/packages/PrintSpooler/res/values-uk/strings.xml
index d3bed82..bd8c375 100644
--- a/packages/PrintSpooler/res/values-uk/strings.xml
+++ b/packages/PrintSpooler/res/values-uk/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Версія для друку"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Установити засіб перегляду PDF"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Програма друку аварійно завершила роботу"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"недоступно"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Сторінки"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Створюється завдання друку"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Зберегти як PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Усі принтери…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Пошук"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Усі принтери"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Додати службу"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Вибрати службу друку"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Пошук принтерів"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Завдання \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" друкується"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Завдання \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" скасовується"</string>
diff --git a/packages/PrintSpooler/res/values-vi/strings.xml b/packages/PrintSpooler/res/values-vi/strings.xml
index 3fd6013..6546f0e 100644
--- a/packages/PrintSpooler/res/values-vi/strings.xml
+++ b/packages/PrintSpooler/res/values-vi/strings.xml
@@ -29,15 +29,26 @@
     <string name="print_preview" msgid="8010217796057763343">"Xem trước bản in"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Cài đặt trình xem PDF để xem trước"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Ứng dụng in gặp lỗi"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"không có sẵn"</string>
+    <string name="page_count_unknown" msgid="6058852665954511124">"Trang"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"Đang tạo lệnh in"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Lưu dưới dạng PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Tất cả máy in…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Tìm kiếm"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Tất cả máy in"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Thêm dịch vụ"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Chọn dịch vụ in"</string>
-    <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
+    <string name="print_searching_for_printers" msgid="6550424555079932867">"Đang tìm kiếm máy in"</string>
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
     <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"In <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Hủy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-zh-rCN/donottranslate.xml b/packages/PrintSpooler/res/values-zh-rCN/donottranslate.xml
new file mode 100644
index 0000000..f069da3
--- /dev/null
+++ b/packages/PrintSpooler/res/values-zh-rCN/donottranslate.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <string name="mediasize_default">PRC_9</string>
+    <string name="mediasize_standard">@string/mediasize_standard_china</string>
+
+</resources>
diff --git a/packages/PrintSpooler/res/values-zh-rCN/strings.xml b/packages/PrintSpooler/res/values-zh-rCN/strings.xml
index 2dfaa1e..0e9b457 100644
--- a/packages/PrintSpooler/res/values-zh-rCN/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rCN/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"打印预览"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"安装 PDF 查看器以便预览"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"打印应用崩溃了"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"未知"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"正在生成打印作业"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"保存为 PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"所有打印机…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"搜索"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"所有打印机"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"添加服务"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"选择打印服务"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"正在打印“<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>”"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"正在取消打印“<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>”"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"打印机在打印“<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>”时出错"</string>
diff --git a/packages/PrintSpooler/res/values-zh-rHK/strings.xml b/packages/PrintSpooler/res/values-zh-rHK/strings.xml
index 99f17e4..71215c8 100644
--- a/packages/PrintSpooler/res/values-zh-rHK/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rHK/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"預覽列印"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"安裝預覽所需的 PDF 檢視器"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"列印應用程式當機了"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"頁數不明"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"正在產生列印工作"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"儲存為 PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"所有打印機…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"搜尋"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"所有打印機"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"新增服務"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"選擇列印服務"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"正在列印 <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"正在取消 <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"打印機錯誤:<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-zh-rTW/strings.xml b/packages/PrintSpooler/res/values-zh-rTW/strings.xml
index 4e7110b..66ceb41 100644
--- a/packages/PrintSpooler/res/values-zh-rTW/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rTW/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"列印預覽"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"安裝預覽所需的 PDF 檢視器"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"列印應用程式當機了"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"不明"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"正在產生列印工作"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"儲存為 PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"所有印表機…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"搜尋"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"所有印表機"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"新增服務"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"選擇列印服務"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"正在列印 <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"正在取消 <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"印表機發生錯誤:<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-zu/strings.xml b/packages/PrintSpooler/res/values-zu/strings.xml
index b5278fb..e1cb758 100644
--- a/packages/PrintSpooler/res/values-zu/strings.xml
+++ b/packages/PrintSpooler/res/values-zu/strings.xml
@@ -29,16 +29,29 @@
     <string name="print_preview" msgid="8010217796057763343">"Ukubuka kuqala kokuphrinta"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Faka isibukeli se-PDF ukuze uhlole kuqala"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"Ukuphrinta uhlelo lokusebenza kukhubazekile"</string>
-    <string name="page_count_unknown" msgid="7412881437770983864">"ayitholakali"</string>
+    <!-- no translation found for page_count_unknown (6058852665954511124) -->
+    <skip />
     <string name="generating_print_job" msgid="3119608742651698916">"Ikhiqiza umsebenzi wokuphrinta"</string>
     <string name="save_as_pdf" msgid="5718454119847596853">"Londoloza njenge-PDF"</string>
     <string name="all_printers" msgid="5018829726861876202">"Wonke amaphrinta…"</string>
+    <!-- no translation found for print_dialog (32628687461331979) -->
+    <skip />
     <string name="search" msgid="5421724265322228497">"Sesha"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Wonke amaphrinta"</string>
     <string name="add_print_service_label" msgid="5356702546188981940">"Engeza isevisi"</string>
+    <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) -->
+    <skip />
+    <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) -->
+    <skip />
+    <!-- no translation found for print_add_printer (1088656468360653455) -->
+    <skip />
+    <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) -->
+    <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) -->
     <string name="choose_print_service" msgid="3740309762324459694">"Khetha isevisi yephrinta"</string>
     <!-- no translation found for print_searching_for_printers (6550424555079932867) -->
     <skip />
+    <!-- no translation found for print_no_printers (4869403323900054866) -->
+    <skip />
     <string name="printing_notification_title_template" msgid="295903957762447362">"Iphrinta i-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Ikhansela i-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Iphutha lephrinta ye-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values/arrays.xml b/packages/PrintSpooler/res/values/arrays.xml
new file mode 100644
index 0000000..afe3c71
--- /dev/null
+++ b/packages/PrintSpooler/res/values/arrays.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<resources>
+
+    <string-array name="mediasize_to_standard_map" translatable="false">
+        <!-- North America -->
+        <item>NA_LETTER</item>
+        <item>@string/mediasize_standard_north_america</item>
+        <item>NA_GOVT_LETTER</item>
+        <item>@string/mediasize_standard_north_america</item>
+        <item>NA_LEGAL</item>
+        <item>@string/mediasize_standard_north_america</item>
+        <item>NA_JUNIOR_LEGAL</item>
+        <item>@string/mediasize_standard_north_america</item>
+        <item>NA_LEDGER</item>
+        <item>@string/mediasize_standard_north_america</item>
+        <item>NA_TABLOID</item>
+        <item>@string/mediasize_standard_north_america</item>
+        <item>NA_INDEX_3X5</item>
+        <item>@string/mediasize_standard_north_america</item>
+        <item>NA_INDEX_4X6</item>
+        <item>@string/mediasize_standard_north_america</item>
+        <item>NA_INDEX_5X8</item>
+        <item>@string/mediasize_standard_north_america</item>
+        <item>NA_MONARCH</item>
+        <item>@string/mediasize_standard_north_america</item>
+        <item>NA_QUARTO</item>
+        <item>@string/mediasize_standard_north_america</item>
+        <item>NA_FOOLSCAP</item>
+        <item>@string/mediasize_standard_north_america</item>
+
+        <!-- China -->
+        <item>ROC_8K</item>
+        <item>@string/mediasize_standard_china</item>
+        <item>ROC_16K</item>
+        <item>@string/mediasize_standard_china</item>
+        <item>PRC_1</item>
+        <item>@string/mediasize_standard_china</item>
+        <item>PRC_2</item>
+        <item>@string/mediasize_standard_china</item>
+        <item>PRC_3</item>
+        <item>@string/mediasize_standard_china</item>
+        <item>PRC_4</item>
+        <item>@string/mediasize_standard_china</item>
+        <item>PRC_5</item>
+        <item>@string/mediasize_standard_china</item>
+        <item>PRC_6</item>
+        <item>@string/mediasize_standard_china</item>
+        <item>PRC_7</item>
+        <item>@string/mediasize_standard_china</item>
+        <item>PRC_8</item>
+        <item>@string/mediasize_standard_china</item>
+        <item>PRC_9</item>
+        <item>@string/mediasize_standard_china</item>
+        <item>PRC_10</item>
+        <item>@string/mediasize_standard_china</item>
+        <item>PRC_16K</item>
+        <item>@string/mediasize_standard_china</item>
+        <item>OM_PA_KAI</item>
+        <item>@string/mediasize_standard_china</item>
+        <item>OM_DAI_PA_KAI</item>
+        <item>@string/mediasize_standard_china</item>
+        <item>OM_JUURO_KU_KAI</item>
+        <item>@string/mediasize_standard_china</item>
+
+        <!-- Japan -->
+        <item>JIS_B10</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JIS_B9</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JIS_B8</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JIS_B7</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JIS_B6</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JIS_B5</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JIS_B4</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JIS_B3</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JIS_B2</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JIS_B1</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JIS_B0</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JIS_EXEC</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JPN_CHOU4</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JPN_CHOU3</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JPN_CHOU2</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JPN_HAGAKI</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JPN_OUFUKU</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JPN_KAHU</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JPN_KAKU2</item>
+        <item>@string/mediasize_standard_japan</item>
+        <item>JPN_YOU4</item>
+        <item>@string/mediasize_standard_japan</item>
+
+        <!-- Everything else is ISO -->
+    </string-array>
+
+    <string-array name="pdf_printer_media_sizes" translatable="false">
+        <item>ISO_A0</item>
+        <item>ISO_A1</item>
+        <item>ISO_A2</item>
+        <item>ISO_A3</item>
+        <item>ISO_A4</item>
+        <item>ISO_A5</item>
+        <item>ISO_A6</item>
+        <item>ISO_A7</item>
+        <item>ISO_A8</item>
+        <item>ISO_A9</item>
+        <item>ISO_A10</item>
+        <item>ISO_B1</item>
+        <item>ISO_B2</item>
+        <item>ISO_B3</item>
+        <item>ISO_B4</item>
+        <item>ISO_B5</item>
+        <item>ISO_B6</item>
+        <item>ISO_B7</item>
+        <item>ISO_B8</item>
+        <item>ISO_B9</item>
+        <item>ISO_B10</item>
+        <item>ISO_C1</item>
+        <item>ISO_C2</item>
+        <item>ISO_C3</item>
+        <item>ISO_C4</item>
+        <item>ISO_C5</item>
+        <item>ISO_C6</item>
+        <item>ISO_C7</item>
+        <item>ISO_C8</item>
+        <item>ISO_C9</item>
+        <item>ISO_C10</item>
+    </string-array>
+
+</resources>
diff --git a/packages/PrintSpooler/res/values/donottranslate.xml b/packages/PrintSpooler/res/values/donottranslate.xml
new file mode 100644
index 0000000..8069a1d
--- /dev/null
+++ b/packages/PrintSpooler/res/values/donottranslate.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<resources>
+
+    <!-- Media size standards -->
+    <string name="mediasize_standard_iso">0</string>
+    <string name="mediasize_standard_north_america">1</string>
+    <string name="mediasize_standard_japan">2</string>
+    <string name="mediasize_standard_china">3</string>
+
+    <!-- Locale specific values -->
+    <string name="mediasize_default">ISO_A4</string>
+    <string name="mediasize_standard">@string/mediasize_standard_iso</string>
+
+</resources>
diff --git a/packages/PrintSpooler/res/values/strings.xml b/packages/PrintSpooler/res/values/strings.xml
index 5b947ba..c82a20e 100644
--- a/packages/PrintSpooler/res/values/strings.xml
+++ b/packages/PrintSpooler/res/values/strings.xml
@@ -56,7 +56,7 @@
     <string name="printing_app_crashed">Printing app crashed</string>
 
     <!-- Title if the number of pages in a printed document is unknown. [CHAR LIMIT=20] -->
-    <string name="page_count_unknown">unavailable</string>
+    <string name="page_count_unknown">Pages</string>
 
     <!-- Title for the temporary dialog show while an app is generating a print job. [CHAR LIMIT=30] -->
     <string name="generating_print_job">Generating print job</string>
@@ -67,6 +67,9 @@
     <!-- Title for the open all printers UI option in the printer list. [CHAR LIMIT=30] -->
     <string name="all_printers">All printers&#8230;</string>
 
+    <!-- Title for the print dialog announced to the user for accessibility. Not shown in the UI. [CHAR LIMIT=none] -->
+    <string name="print_dialog">Print dialog</string>
+
     <!-- Select printer activity -->
 
     <!-- Title for the share action bar menu item. [CHAR LIMIT=20] -->
@@ -78,14 +81,32 @@
     <!-- Title of the button to install a print service. [CHAR LIMIT=25] -->
     <string name="add_print_service_label">Add service</string>
 
+    <!-- Utterance to announce that the search box is shown. This is spoken to a blind user. [CHAR LIMIT=none] -->
+    <string name="print_search_box_shown_utterance">Search box shown</string>
+
+    <!-- Utterance to announce that the search box is hidden. This is spoken to a blind user. [CHAR LIMIT=none] -->
+    <string name="print_search_box_hidden_utterance">Search box hidden</string>
+
+    <!-- Title of the action bar button to got to add a printer. [CHAR LIMIT=25] -->
+    <string name="print_add_printer">Add printer</string>
+
+    <!-- Utterance to announce a change in the number of matches during a search. This is spoken to a blind user. [CHAR LIMIT=none] -->
+    <plurals name="print_search_result_count_utterance">
+        <item quantity="one"><xliff:g id="count" example="1">%1$s</xliff:g> printer found</item>
+        <item quantity="other"><xliff:g id="count" example="2">%1$s</xliff:g> printers found</item>
+    </plurals>
+
     <!-- Add printer dialog  -->
 
     <!-- Title for the alert dialog for selecting a print service. [CHAR LIMIT=50] -->
     <string name="choose_print_service">Choose print service</string>
 
-    <!-- Title for the prompt shown as a placeholder if no printers are found while searching. [CHAR LIMIT=50] -->
+    <!-- Title for the prompt shown as a placeholder if no printers are found while not searching. [CHAR LIMIT=50] -->
     <string name="print_searching_for_printers">Searching for printers</string>
 
+    <!-- Title for the prompt shown as a placeholder if there are no printers while searching. [CHAR LIMIT=50] -->
+    <string name="print_no_printers">No printers found</string>
+
     <!-- Notifications -->
 
     <!-- Template for the notificaiton label for a printing print job. [CHAR LIMIT=25] -->
diff --git a/packages/PrintSpooler/res/values/styles.xml b/packages/PrintSpooler/res/values/styles.xml
index f6db6be..d64380a 100644
--- a/packages/PrintSpooler/res/values/styles.xml
+++ b/packages/PrintSpooler/res/values/styles.xml
@@ -30,7 +30,6 @@
     </style>
 
     <style name="PrintOptionEditTextStyle">
-         <item name="android:selectAllOnFocus">true</item>
          <item name="android:minHeight">?android:attr/listPreferredItemHeightSmall</item>
          <item name="android:singleLine">true</item>
          <item name="android:ellipsize">end</item>
diff --git a/packages/PrintSpooler/res/values/themes.xml b/packages/PrintSpooler/res/values/themes.xml
index bb41527..86f4a37 100644
--- a/packages/PrintSpooler/res/values/themes.xml
+++ b/packages/PrintSpooler/res/values/themes.xml
@@ -22,6 +22,7 @@
         <item name="android:windowIsTranslucent">true</item>
         <item name="android:backgroundDimEnabled">true</item>
         <item name="android:colorBackgroundCacheHint">@android:color/transparent</item>
+        <item name="android:windowIsFloating">true</item>
     </style>
 
     <style name="SelectPrinterActivityTheme" parent="@android:style/Theme.Holo.Light">
diff --git a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java
index 65af830..8aa290c 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java
@@ -63,7 +63,6 @@
     private static final boolean DEBUG = false;
 
     private static final double WEIGHT_DECAY_COEFFICIENT = 0.95f;
-
     private static final int MAX_HISTORY_LENGTH = 50;
 
     private static final int MAX_FAVORITE_PRINTER_COUNT = 4;
@@ -388,25 +387,25 @@
                             + FusedPrintersProvider.this.hashCode());
                 }
 
-                // Ignore printer records whose target services are not installed.
+                // Ignore printer records whose target services are not enabled.
                 PrintManager printManager = (PrintManager) getContext()
                         .getSystemService(Context.PRINT_SERVICE);
                 List<PrintServiceInfo> services = printManager
-                        .getInstalledPrintServices();
+                        .getEnabledPrintServices();
 
-                Set<ComponentName> installedComponents = new ArraySet<ComponentName>();
+                Set<ComponentName> enabledComponents = new ArraySet<ComponentName>();
                 final int installedServiceCount = services.size();
                 for (int i = 0; i < installedServiceCount; i++) {
                     ServiceInfo serviceInfo = services.get(i).getResolveInfo().serviceInfo;
                     ComponentName componentName = new ComponentName(
                             serviceInfo.packageName, serviceInfo.name);
-                    installedComponents.add(componentName);
+                    enabledComponents.add(componentName);
                 }
 
                 final int printerCount = printers.size();
                 for (int i = printerCount - 1; i >= 0; i--) {
                     ComponentName printerServiceName = printers.get(i).getId().getServiceName();
-                    if (!installedComponents.contains(printerServiceName.getPackageName())) {
+                    if (!enabledComponents.contains(printerServiceName)) {
                         printers.remove(i);
                     }
                 }
diff --git a/packages/PrintSpooler/src/com/android/printspooler/MediaSizeUtils.java b/packages/PrintSpooler/src/com/android/printspooler/MediaSizeUtils.java
new file mode 100644
index 0000000..ac27562
--- /dev/null
+++ b/packages/PrintSpooler/src/com/android/printspooler/MediaSizeUtils.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2013 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.printspooler;
+
+import android.content.Context;
+import android.print.PrintAttributes.MediaSize;
+import android.util.ArrayMap;
+
+import java.util.Comparator;
+import java.util.Map;
+
+/**
+ * Utility functions and classes for dealing with media sizes.
+ */
+public class MediaSizeUtils {
+
+    private static Map<MediaSize, String> sMediaSizeToStandardMap;
+
+    /**
+     * Gets the default media size for the current locale.
+     *
+     * @param context Context for accessing resources.
+     * @return The default media size.
+     */
+    public static MediaSize getDefault(Context context) {
+        String mediaSizeId = context.getString(R.string.mediasize_default);
+        return MediaSize.getStandardMediaSizeById(mediaSizeId);
+    }
+
+    private static String getStandardForMediaSize(Context context, MediaSize mediaSize) {
+        if (sMediaSizeToStandardMap == null) {
+            sMediaSizeToStandardMap = new ArrayMap<MediaSize, String>();
+            String[] mediaSizeToStandardMapValues = context.getResources()
+                    .getStringArray(R.array.mediasize_to_standard_map);
+            final int mediaSizeToStandardCount = mediaSizeToStandardMapValues.length;
+            for (int i = 0; i < mediaSizeToStandardCount; i += 2) {
+                String mediaSizeId = mediaSizeToStandardMapValues[i];
+                MediaSize key = MediaSize.getStandardMediaSizeById(mediaSizeId);
+                String value = mediaSizeToStandardMapValues[i + 1];
+                sMediaSizeToStandardMap.put(key, value);
+            }
+        }
+        String standard = sMediaSizeToStandardMap.get(mediaSize);
+        return (standard != null) ? standard : context.getString(
+                R.string.mediasize_standard_iso);
+    }
+
+    /**
+     * Comparator for ordering standard media sizes. The ones for the current
+     * standard go to the top and the ones for the other standards follow grouped
+     * by standard. Media sizes of the same standard are ordered alphabetically.
+     */
+    public static final class MediaSizeComparator implements Comparator<MediaSize> {
+        private final Context mContext;
+
+        public MediaSizeComparator(Context context) {
+            mContext = context;
+        }
+
+        @Override
+        public int compare(MediaSize lhs, MediaSize rhs) {
+            String currentStandard = mContext.getString(R.string.mediasize_standard);
+            String lhsStandard = getStandardForMediaSize(mContext, lhs);
+            String rhsStandard = getStandardForMediaSize(mContext, rhs);
+
+            // The current standard always wins.
+            if (lhsStandard.equals(currentStandard)) {
+                if (!rhsStandard.equals(currentStandard)) {
+                    return -1;
+                }
+            } else if (rhsStandard.equals(currentStandard)) {
+                return 1;
+            }
+
+            if (!lhsStandard.equals(rhsStandard)) {
+                // Different standards - use the standard ordering.
+                return lhsStandard.compareTo(rhsStandard);
+            } else {
+                // Same standard - sort alphabetically by label.
+                return lhs.getLabel(mContext.getPackageManager()).
+                        compareTo(rhs.getLabel(mContext.getPackageManager()));
+            }
+        }
+    }
+}
diff --git a/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java b/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java
index dae7770..2bd0443 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java
@@ -110,7 +110,7 @@
                         printJob.getLabel()))
                 .addAction(R.drawable.stat_notify_cancelling, mContext.getString(R.string.cancel),
                         createCancelIntent(printJob))
-                .addAction(android.R.drawable.ic_secure, mContext.getString(R.string.restart),
+                .addAction(R.drawable.ic_restart, mContext.getString(R.string.restart),
                         createRestartIntent(printJob.getId()))
                 .setContentText(printJob.getPrinterName())
                 .setWhen(System.currentTimeMillis())
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
index 0c593ef..0bd8344 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
@@ -57,7 +57,6 @@
 import android.text.TextUtils.SimpleStringSplitter;
 import android.text.TextWatcher;
 import android.util.ArrayMap;
-import android.util.ArraySet;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.KeyEvent;
@@ -80,6 +79,8 @@
 import android.widget.Spinner;
 import android.widget.TextView;
 
+import com.android.printspooler.MediaSizeUtils.MediaSizeComparator;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -89,9 +90,9 @@
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
-import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -151,26 +152,6 @@
             "[\\s]*[0-9]*[\\s]*[\\-]?[\\s]*[0-9]*[\\s]*?(([,])"
             + "[\\s]*[0-9]*[\\s]*[\\-]?[\\s]*[0-9]*[\\s]*|[\\s]*)+");
 
-    // The list of countries where Letter is the default paper size. Culled from
-    // the OpenOffice wiki at http://wiki.openoffice.org/wiki/DefaultPaperSize.
-    private static final Set<String> sLetterDefaultCountries = new ArraySet<String>();
-    static {
-        sLetterDefaultCountries.add("US");
-        sLetterDefaultCountries.add("CA");
-        sLetterDefaultCountries.add("BZ");
-        sLetterDefaultCountries.add("CL");
-        sLetterDefaultCountries.add("CR");
-        sLetterDefaultCountries.add("GT");
-        sLetterDefaultCountries.add("NI");
-        sLetterDefaultCountries.add("PA");
-        sLetterDefaultCountries.add("PR");
-        sLetterDefaultCountries.add("SV");
-        sLetterDefaultCountries.add("VE");
-        sLetterDefaultCountries.add("MX");
-        sLetterDefaultCountries.add("CO");
-        sLetterDefaultCountries.add("PH");
-    }
-
     public static final PageRange[] ALL_PAGES_ARRAY = new PageRange[] {PageRange.ALL_PAGES};
 
     private final PrintAttributes mOldPrintAttributes = new PrintAttributes.Builder().build();
@@ -197,6 +178,8 @@
     protected void onCreate(Bundle bundle) {
         super.onCreate(bundle);
 
+        setTitle(R.string.print_dialog);
+
         Bundle extras = getIntent().getExtras();
 
         PrintJobInfo printJob = extras.getParcelable(EXTRA_PRINT_JOB);
@@ -572,6 +555,7 @@
                 // TODO: We need some UI for announcing an error.
                 mControllerState = CONTROLLER_STATE_FAILED;
                 Log.e(LOG_TAG, "Received invalid pages from the app");
+                mEditor.cancel();
                 PrintJobConfigActivity.this.finish();
             }
         }
@@ -826,6 +810,8 @@
 
         private PrinterInfo mCurrentPrinter;
 
+        private final MediaSizeComparator mMediaSizeComparator;
+
         private final OnItemSelectedListener mOnItemSelectedListener =
                 new AdapterView.OnItemSelectedListener() {
             @Override
@@ -872,7 +858,11 @@
                         return;
                     }
                     SpinnerItem<MediaSize> mediaItem = mMediaSizeSpinnerAdapter.getItem(position);
-                    mCurrPrintAttributes.setMediaSize(mediaItem.value);
+                    if (mOrientationSpinner.getSelectedItemPosition() == 0) {
+                        mCurrPrintAttributes.setMediaSize(mediaItem.value.asPortrait());
+                    } else {
+                        mCurrPrintAttributes.setMediaSize(mediaItem.value.asLandscape());
+                    }
                     if (!hasErrors()) {
                         mController.update();
                     }
@@ -971,18 +961,22 @@
         private void updatePrintAttributes(PrinterCapabilitiesInfo capabilities) {
             PrintAttributes defaults = capabilities.getDefaults();
 
+            // Sort the media sizes based on the current locale.
+            List<MediaSize> sortedMediaSizes = new ArrayList<MediaSize>(
+                    capabilities.getMediaSizes());
+            Collections.sort(sortedMediaSizes, mMediaSizeComparator);
+
             // Media size.
             MediaSize currMediaSize = mCurrPrintAttributes.getMediaSize();
             if (currMediaSize == null) {
                 mCurrPrintAttributes.setMediaSize(defaults.getMediaSize());
             } else {
                 MediaSize currMediaSizePortrait = currMediaSize.asPortrait();
-                List<MediaSize> mediaSizes = capabilities.getMediaSizes();
-                final int mediaSizeCount = mediaSizes.size();
+                final int mediaSizeCount = sortedMediaSizes.size();
                 for (int i = 0; i < mediaSizeCount; i++) {
-                    MediaSize mediaSize = mediaSizes.get(i);
+                    MediaSize mediaSize = sortedMediaSizes.get(i);
                     if (currMediaSizePortrait.equals(mediaSize.asPortrait())) {
-                        mCurrPrintAttributes.setMediaSize(mediaSize);
+                        mCurrPrintAttributes.setMediaSize(currMediaSize);
                         break;
                     }
                 }
@@ -1148,6 +1142,7 @@
 
         public Editor() {
             // Destination.
+            mMediaSizeComparator = new MediaSizeComparator(PrintJobConfigActivity.this);
             mDestinationSpinnerAdapter = new DestinationAdapter();
             mDestinationSpinnerAdapter.registerDataSetObserver(new DataSetObserver() {
                 @Override
@@ -1158,6 +1153,9 @@
                     if (!mFavoritePrinterSelected && mDestinationSpinnerAdapter.getCount() > 2) {
                         mFavoritePrinterSelected = true;
                         mDestinationSpinner.setSelection(0);
+                        // Workaround again the weird spinner behavior to notify for selection
+                        // change on the next layout pass as the current printer is used below.
+                        mCurrentPrinter = (PrinterInfo) mDestinationSpinnerAdapter.getItem(0);
                     }
 
                     // If there is a next printer to select and we succeed selecting
@@ -1222,7 +1220,7 @@
 
                                 if (capabilitiesChanged || statusChanged) {
                                     // If something changed during update...
-                                    if (updateUi()) {
+                                    if (updateUi() || !mController.hasPerformedLayout()) {
                                         // Update the document.
                                         mController.update();
                                     }
@@ -1277,10 +1275,6 @@
 
             showUi(UI_EDITING_PRINT_JOB, null);
             bindUi();
-
-            mCurrentPrinter = mDestinationSpinnerAdapter.mFakePdfPrinter;
-            updatePrintAttributes(mCurrentPrinter.getCapabilities());
-
             updateUi();
         }
 
@@ -1702,54 +1696,13 @@
             }
 
             if (!allOptionsEnabled) {
-                String minCopiesString = String.valueOf(MIN_COPIES);
-                if (!TextUtils.equals(mCopiesEditText.getText(), minCopiesString)) {
-                    mIgnoreNextCopiesChange = true;
-                    mCopiesEditText.setText(minCopiesString);
-                }
                 mCopiesEditText.setEnabled(false);
-
-                // Media size
-                if (mMediaSizeSpinner.getSelectedItemPosition() != AdapterView.INVALID_POSITION) {
-                    mOldMediaSizeSelectionIndex = AdapterView.INVALID_POSITION;
-                    mMediaSizeSpinner.setSelection(AdapterView.INVALID_POSITION);
-                }
                 mMediaSizeSpinner.setEnabled(false);
-
-                // Color mode
-                if (mColorModeSpinner.getSelectedItemPosition() != AdapterView.INVALID_POSITION) {
-                    mOldColorModeSelectionIndex = AdapterView.INVALID_POSITION;
-                    mColorModeSpinner.setSelection(AdapterView.INVALID_POSITION);
-                }
                 mColorModeSpinner.setEnabled(false);
-
-                // Orientation
-                if (mOrientationSpinner.getSelectedItemPosition() != 0) {
-                    mIgnoreNextOrientationChange = true;
-                    mOrientationSpinner.setSelection(0);
-                }
                 mOrientationSpinner.setEnabled(false);
-
-                // Range
-                if (mRangeOptionsSpinner.getSelectedItemPosition() != 0) {
-                    mIgnoreNextRangeOptionChange = true;
-                    mRangeOptionsSpinner.setSelection(0);
-                }
                 mRangeOptionsSpinner.setEnabled(false);
-                mRangeOptionsTitle.setText(getString(R.string.label_pages,
-                        getString(R.string.page_count_unknown)));
-                if (!TextUtils.equals(mPageRangeEditText.getText(), "")) {
-                    mIgnoreNextRangeChange = true;
-                    mPageRangeEditText.setText("");
-                }
-
                 mPageRangeEditText.setEnabled(false);
-                mPageRangeEditText.setVisibility(View.INVISIBLE);
-                mPageRangeTitle.setVisibility(View.INVISIBLE);
-
-                // Print
                 mPrintButton.setEnabled(false);
-
                 return false;
             } else {
                 boolean someAttributeSelectionChanged = false;
@@ -1759,7 +1712,9 @@
                 PrintAttributes defaultAttributes = printer.getCapabilities().getDefaults();
 
                 // Media size.
-                List<MediaSize> mediaSizes = capabilities.getMediaSizes();
+                // Sort the media sizes based on the current locale.
+                List<MediaSize> mediaSizes = new ArrayList<MediaSize>(capabilities.getMediaSizes());
+                Collections.sort(mediaSizes, mMediaSizeComparator);
 
                 // If the media sizes changed, we update the adapter and the spinner.
                 boolean mediaSizesChanged = false;
@@ -1783,7 +1738,7 @@
                     mMediaSizeSpinnerAdapter.clear();
                     for (int i = 0; i < mediaSizeCount; i++) {
                         MediaSize mediaSize = mediaSizes.get(i);
-                        if (mediaSize.equals(oldMediaSize)) {
+                        if (mediaSize.asPortrait().equals(oldMediaSize.asPortrait())) {
                             // Update the index of the old selection.
                             oldMediaSizeNewIndex = i;
                         }
@@ -1801,8 +1756,13 @@
                         final int mediaSizeIndex = Math.max(mediaSizes.indexOf(
                                 defaultAttributes.getMediaSize()), 0);
                         setMediaSizeSpinnerSelectionNoCallback(mediaSizeIndex);
-                        mCurrPrintAttributes.setMediaSize(mMediaSizeSpinnerAdapter
-                                .getItem(mediaSizeIndex).value);
+                        if (oldMediaSize.isPortrait()) {
+                            mCurrPrintAttributes.setMediaSize(mMediaSizeSpinnerAdapter
+                                    .getItem(mediaSizeIndex).value.asPortrait());
+                        } else {
+                            mCurrPrintAttributes.setMediaSize(mMediaSizeSpinnerAdapter
+                                    .getItem(mediaSizeIndex).value.asLandscape());
+                        }
                         someAttributeSelectionChanged = true;
                     }
                 }
@@ -1904,18 +1864,17 @@
                         }
                     }
                     final int pageCount = mDocument.info.getPageCount();
-                    mRangeOptionsTitle.setText(getString(R.string.label_pages,
-                            (pageCount == PrintDocumentInfo.PAGE_COUNT_UNKNOWN)
-                                    ? getString(R.string.page_count_unknown)
-                                    : String.valueOf(pageCount)));
+                    String title = (pageCount != PrintDocumentInfo.PAGE_COUNT_UNKNOWN)
+                            ? getString(R.string.label_pages, String.valueOf(pageCount))
+                            : getString(R.string.page_count_unknown);
+                    mRangeOptionsTitle.setText(title);
                 } else {
                     if (mRangeOptionsSpinner.getSelectedItemPosition() != 0) {
                         mIgnoreNextRangeOptionChange = true;
                         mRangeOptionsSpinner.setSelection(0);
                     }
                     mRangeOptionsSpinner.setEnabled(false);
-                    mRangeOptionsTitle.setText(getString(R.string.label_pages,
-                            getString(R.string.page_count_unknown)));
+                    mRangeOptionsTitle.setText(getString(R.string.page_count_unknown));
                     mPageRangeEditText.setEnabled(false);
                     mPageRangeEditText.setVisibility(View.INVISIBLE);
                     mPageRangeTitle.setVisibility(View.INVISIBLE);
@@ -2044,11 +2003,10 @@
                 implements LoaderManager.LoaderCallbacks<List<PrinterInfo>>{
             private final List<PrinterInfo> mPrinters = new ArrayList<PrinterInfo>();
 
-            private final PrinterInfo mFakePdfPrinter;
+            private PrinterInfo mFakePdfPrinter;
 
             public DestinationAdapter() {
                 getLoaderManager().initLoader(LOADER_ID_PRINTERS_LOADER, null, this);
-                mFakePdfPrinter = createFakePdfPrinter();
             }
 
             public int getPrinterIndex(PrinterId printerId) {
@@ -2082,7 +2040,9 @@
 
             @Override
             public int getCount() {
-                return Math.min(mPrinters.size() + 2, DEST_ADAPTER_MAX_ITEM_COUNT);
+                final int additionalItemCount = (mFakePdfPrinter != null) ? 2 : 1;
+                return Math.min(mPrinters.size() + additionalItemCount,
+                        DEST_ADAPTER_MAX_ITEM_COUNT);
             }
 
             @Override
@@ -2098,14 +2058,14 @@
             @Override
             public Object getItem(int position) {
                 if (mPrinters.isEmpty()) {
-                    if (position == 0) {
+                    if (position == 0 && mFakePdfPrinter != null) {
                         return mFakePdfPrinter;
                     }
                 } else {
                     if (position < 1) {
                         return mPrinters.get(position);
                     }
-                    if (position == 1) {
+                    if (position == 1 && mFakePdfPrinter != null) {
                         return mFakePdfPrinter;
                     }
                     if (position < getCount() - 1) {
@@ -2118,14 +2078,14 @@
             @Override
             public long getItemId(int position) {
                 if (mPrinters.isEmpty()) {
-                    if (position == 0) {
+                    if (position == 0 && mFakePdfPrinter != null) {
                         return DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF;
                     }
                     if (position == 1) {
                         return DEST_ADAPTER_ITEM_ID_ALL_PRINTERS;
                     }
                 } else {
-                    if (position == 1) {
+                    if (position == 1 && mFakePdfPrinter != null) {
                         return DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF;
                     }
                     if (position == getCount() - 1) {
@@ -2157,14 +2117,14 @@
                 Drawable icon = null;
 
                 if (mPrinters.isEmpty()) {
-                    if (position == 0) {
+                    if (position == 0 && mFakePdfPrinter != null) {
                         PrinterInfo printer = (PrinterInfo) getItem(position);
                         title = printer.getName();
                     } else if (position == 1) {
                         title = getString(R.string.all_printers);
                     }
                 } else {
-                    if (position == 1) {
+                    if (position == 1 && mFakePdfPrinter != null) {
                         PrinterInfo printer = (PrinterInfo) getItem(position);
                         title = printer.getName();
                     } else if (position == getCount() - 1) {
@@ -2217,6 +2177,16 @@
             @Override
             public void onLoadFinished(Loader<List<PrinterInfo>> loader,
                     List<PrinterInfo> printers) {
+                // If this is the first load, create the fake PDF printer.
+                // We do this to avoid flicker where the PDF printer is the
+                // only one and as soon as the loader loads the favorites
+                // it gets switched. Not a great user experience.
+                if (mFakePdfPrinter == null) {
+                    mCurrentPrinter = mFakePdfPrinter = createFakePdfPrinter();
+                    updatePrintAttributes(mCurrentPrinter.getCapabilities());
+                    updateUi();
+                }
+
                 // We rearrange the printers if the user selects a printer
                 // not shown in the initial short list. Therefore, we have
                 // to keep the printer order.
@@ -2266,31 +2236,33 @@
                 notifyDataSetInvalidated();
             }
 
+
             private PrinterInfo createFakePdfPrinter() {
-                final MediaSize defaultMediaSize;
-                String currentCountry = getResources().getConfiguration().locale.getCountry();
-                if (sLetterDefaultCountries.contains(currentCountry)) {
-                    defaultMediaSize = MediaSize.NA_LETTER;
-                } else {
-                    defaultMediaSize = MediaSize.ISO_A4;
-                }
+                MediaSize defaultMediaSize = MediaSizeUtils.getDefault(PrintJobConfigActivity.this);
 
                 PrinterId printerId = new PrinterId(getComponentName(), "PDF printer");
 
-                PrinterCapabilitiesInfo capabilities =
-                        new PrinterCapabilitiesInfo.Builder(printerId)
-                    .addMediaSize(MediaSize.ISO_A4, MediaSize.ISO_A4 == defaultMediaSize)
-                    .addMediaSize(MediaSize.NA_LETTER, MediaSize.NA_LETTER == defaultMediaSize)
-                    .addResolution(new Resolution("PDF resolution", "PDF resolution",
-                            300, 300), true)
-                    .setColorModes(PrintAttributes.COLOR_MODE_COLOR
-                            | PrintAttributes.COLOR_MODE_MONOCHROME,
-                            PrintAttributes.COLOR_MODE_COLOR)
-                    .build();
+                PrinterCapabilitiesInfo.Builder builder =
+                        new PrinterCapabilitiesInfo.Builder(printerId);
+
+                String[] mediaSizeIds = getResources().getStringArray(
+                        R.array.pdf_printer_media_sizes);
+                final int mediaSizeIdCount = mediaSizeIds.length;
+                for (int i = 0; i < mediaSizeIdCount; i++) {
+                    String id = mediaSizeIds[i];
+                    MediaSize mediaSize = MediaSize.getStandardMediaSizeById(id);
+                    builder.addMediaSize(mediaSize, mediaSize.equals(defaultMediaSize));
+                }
+
+                builder.addResolution(new Resolution("PDF resolution", "PDF resolution",
+                            300, 300), true);
+                builder.setColorModes(PrintAttributes.COLOR_MODE_COLOR
+                        | PrintAttributes.COLOR_MODE_MONOCHROME,
+                        PrintAttributes.COLOR_MODE_COLOR);
 
                 return new PrinterInfo.Builder(printerId, getString(R.string.save_as_pdf),
                         PrinterInfo.STATUS_IDLE)
-                    .setCapabilities(capabilities)
+                    .setCapabilities(builder.build())
                     .build();
             }
         }
diff --git a/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java b/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java
index 114c151..20315ca 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java
@@ -36,6 +36,7 @@
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
+import android.database.DataSetObserver;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
@@ -43,6 +44,7 @@
 import android.print.PrinterId;
 import android.print.PrinterInfo;
 import android.printservice.PrintServiceInfo;
+import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.Menu;
@@ -80,6 +82,8 @@
     private final ArrayList<PrintServiceInfo> mAddPrinterServices =
             new ArrayList<PrintServiceInfo>();
 
+    private AnnounceFilterResult mAnnounceFilterResult;
+
     public static interface OnPrinterSelectedListener {
         public void onPrinterSelected(PrinterId printerId);
     }
@@ -93,9 +97,23 @@
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
-        setListAdapter(new DestinationAdapter());
-        View emptyView = getActivity().findViewById(R.id.empty_print_state);
-        getListView().setEmptyView(emptyView);
+        final DestinationAdapter adapter = new DestinationAdapter();
+        adapter.registerDataSetObserver(new DataSetObserver() {
+            @Override
+            public void onChanged() {
+                if (!getActivity().isFinishing() && adapter.getCount() <= 0) {
+                    updateEmptyView(adapter);
+                }
+            }
+
+            @Override
+            public void onInvalidated() {
+                if (!getActivity().isFinishing()) {
+                    updateEmptyView(adapter);
+                }
+            }
+        });
+        setListAdapter(adapter);
     }
 
     @Override
@@ -117,6 +135,18 @@
                 return true;
             }
         });
+        searchView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
+            @Override
+            public void onViewAttachedToWindow(View view) {
+                view.announceForAccessibility(getString(
+                        R.string.print_search_box_shown_utterance));
+            }
+            @Override
+            public void onViewDetachedFromWindow(View view) {
+                view.announceForAccessibility(getString(
+                        R.string.print_search_box_hidden_utterance));
+            }
+        });
 
         if (mAddPrinterServices.isEmpty()) {
             menu.removeItem(R.id.action_add_printer);
@@ -213,10 +243,32 @@
         transaction.commit();
     }
 
+    public void updateEmptyView(DestinationAdapter adapter) {
+        if (getListView().getEmptyView() == null) {
+            View emptyView = getActivity().findViewById(R.id.empty_print_state);
+            getListView().setEmptyView(emptyView);
+        }
+        TextView titleView = (TextView) getActivity().findViewById(R.id.title);
+        View progressBar = getActivity().findViewById(R.id.progress_bar);
+        if (adapter.getUnfilteredCount() <= 0) {
+            titleView.setText(R.string.print_searching_for_printers);
+            progressBar.setVisibility(View.VISIBLE);
+        } else {
+            titleView.setText(R.string.print_no_printers);
+            progressBar.setVisibility(View.GONE);
+        }
+    }
+
+    private void announceSearchResult() {
+        if (mAnnounceFilterResult == null) {
+            mAnnounceFilterResult = new AnnounceFilterResult();
+        }
+        mAnnounceFilterResult.post();
+    }
+
     public static class AddPrinterAlertDialogFragment extends DialogFragment {
 
-        private static final String DEFAULT_MARKET_QUERY_STRING =
-                "market://search?q=print";
+        private String mAddPrintServiceItem;
 
         @Override
         @SuppressWarnings("unchecked")
@@ -227,47 +279,56 @@
             final List<PrintServiceInfo> printServices = (List<PrintServiceInfo>) (List<?>)
                     getArguments().getParcelableArrayList(FRAGMRNT_ARGUMENT_PRINT_SERVICE_INFOS);
 
-            ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
-                    android.R.layout.simple_list_item_1);
+            final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
+                    getActivity(), android.R.layout.simple_list_item_1);
             final int printServiceCount = printServices.size();
             for (int i = 0; i < printServiceCount; i++) {
                 PrintServiceInfo printService = printServices.get(i);
                 adapter.add(printService.getResolveInfo().loadLabel(
                         getActivity().getPackageManager()).toString());
             }
+            final String searchUri = Settings.Secure.getString(getActivity().getContentResolver(),
+                    Settings.Secure.PRINT_SERVICE_SEARCH_URI);
+            final Intent marketIntent;
+            if (!TextUtils.isEmpty(searchUri)) {
+                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(searchUri));
+                if (getActivity().getPackageManager().resolveActivity(intent, 0) != null) {
+                    marketIntent = intent;
+                    mAddPrintServiceItem = getString(R.string.add_print_service_label);
+                    adapter.add(mAddPrintServiceItem);
+                } else {
+                    marketIntent = null;
+                }
+            } else {
+                marketIntent = null;
+            }
 
             builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
                 @Override
                 public void onClick(DialogInterface dialog, int which) {
-                    PrintServiceInfo printService = printServices.get(which);
-                    ComponentName componentName = new ComponentName(
-                            printService.getResolveInfo().serviceInfo.packageName,
-                            printService.getAddPrintersActivityName());
-                    Intent intent = new Intent(Intent.ACTION_MAIN);
-                    intent.setComponent(componentName);
-                    try {
-                        startActivity(intent);
-                    } catch (ActivityNotFoundException anfe) {
-                        Log.w(LOG_TAG, "Couldn't start settings activity", anfe);
+                    String item = adapter.getItem(which);
+                    if (item == mAddPrintServiceItem) {
+                        try {
+                          startActivity(marketIntent);
+                      } catch (ActivityNotFoundException anfe) {
+                          Log.w(LOG_TAG, "Couldn't start add printer activity", anfe);
+                      }
+                    } else {
+                        PrintServiceInfo printService = printServices.get(which);
+                        ComponentName componentName = new ComponentName(
+                                printService.getResolveInfo().serviceInfo.packageName,
+                                printService.getAddPrintersActivityName());
+                        Intent intent = new Intent(Intent.ACTION_MAIN);
+                        intent.setComponent(componentName);
+                        try {
+                            startActivity(intent);
+                        } catch (ActivityNotFoundException anfe) {
+                            Log.w(LOG_TAG, "Couldn't start settings activity", anfe);
+                        }
                     }
                 }
             });
 
-            Uri marketUri = Uri.parse(DEFAULT_MARKET_QUERY_STRING);
-            final Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri);
-            if (getActivity().getPackageManager().resolveActivity(marketIntent, 0) != null) {
-                builder.setPositiveButton(R.string.add_print_service_label,
-                    new DialogInterface.OnClickListener() {
-                        public void onClick(DialogInterface dialog, int whichButton) {
-                            try {
-                                startActivity(marketIntent);
-                            } catch (ActivityNotFoundException anfe) {
-                                Log.w(LOG_TAG, "Couldn't start add printer activity", anfe);
-                            }
-                        }
-                    });
-            }
-
             return builder.create();
         }
     }
@@ -315,7 +376,9 @@
                 @Override
                 @SuppressWarnings("unchecked")
                 protected void publishResults(CharSequence constraint, FilterResults results) {
+                    final boolean resultCountChanged;
                     synchronized (mLock) {
+                        final int oldPrinterCount = mFilteredPrinters.size();
                         mLastSearchString = constraint;
                         mFilteredPrinters.clear();
                         if (results == null) {
@@ -324,12 +387,22 @@
                             List<PrinterInfo> printers = (List<PrinterInfo>) results.values;
                             mFilteredPrinters.addAll(printers);
                         }
+                        resultCountChanged = (oldPrinterCount != mFilteredPrinters.size());
+                    }
+                    if (resultCountChanged) {
+                        announceSearchResult();
                     }
                     notifyDataSetChanged();
                 }
             };
         }
 
+        public int getUnfilteredCount() {
+            synchronized (mLock) {
+                return mPrinters.size();
+            }
+        }
+
         @Override
         public int getCount() {
             synchronized (mLock) {
@@ -362,6 +435,8 @@
                         R.layout.printer_dropdown_item, parent, false);
             }
 
+            convertView.setEnabled(isEnabled(position));
+
             CharSequence title = null;
             CharSequence subtitle = null;
             Drawable icon = null;
@@ -403,6 +478,12 @@
         }
 
         @Override
+        public boolean isEnabled(int position) {
+            PrinterInfo printer =  (PrinterInfo) getItem(position);
+            return printer.getStatus() != PrinterInfo.STATUS_UNAVAILABLE;
+        }
+
+        @Override
         public Loader<List<PrinterInfo>> onCreateLoader(int id, Bundle args) {
             if (id == LOADER_ID_PRINTERS_LOADER) {
                 return new FusedPrintersProvider(getActivity());
@@ -434,4 +515,30 @@
             notifyDataSetInvalidated();
         }
     }
+
+    private final class AnnounceFilterResult implements Runnable {
+        private static final int SEARCH_RESULT_ANNOUNCEMENT_DELAY = 1000; // 1 sec
+
+        public void post() {
+            remove();
+            getListView().postDelayed(this, SEARCH_RESULT_ANNOUNCEMENT_DELAY);
+        }
+
+        public void remove() {
+            getListView().removeCallbacks(this);
+        }
+
+        @Override
+        public void run() {
+            final int count = getListView().getAdapter().getCount();
+            final String text;
+            if (count <= 0) {
+                text = getString(R.string.print_no_printers);
+            } else {
+                text = getActivity().getResources().getQuantityString(
+                    R.plurals.print_search_result_count_utterance, count, count);
+            }
+            getListView().announceForAccessibility(text);
+        }
+    }
 }
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png
index ece947a..6f48fe8 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png
index be153d1..f325220 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_location_off.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_location_off.png
index 7570610..189f27b 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_location_off.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_location_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_remote_display.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_remote_display.png
index cf510b4..02d7fda 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_remote_display.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_remote_display.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png
index 6ff215b..250653b 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png
index cf5e825..497c69f 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png
index c7b035a..dd8ba8f 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png
index 5d8fd07..d750726 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png
index ebd2001..250653b 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png
index cf5e825..497c69f 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png
index a5e0bde..45bc376 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png
index 5d8fd07..d750726 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_dragging.9.png b/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_dragging.9.png
deleted file mode 100644
index 080f2f2..0000000
--- a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_dragging.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/search_light.png b/packages/SystemUI/res/drawable-hdpi/search_light.png
index c8b5a2e..116b1f0 100644
--- a/packages/SystemUI/res/drawable-hdpi/search_light.png
+++ b/packages/SystemUI/res/drawable-hdpi/search_light.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_airplane_off.png
index 7db72fb..c36809b 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_airplane_off.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.png
new file mode 100644
index 0000000..64c6723
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.png
new file mode 100644
index 0000000..2338122
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.png
new file mode 100644
index 0000000..29df6d7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_airplane_off.png
index 5ba15a7..084799a 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_airplane_off.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.png
new file mode 100644
index 0000000..3fba731
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.png
new file mode 100644
index 0000000..eb5fcd0
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.png
new file mode 100644
index 0000000..a91c7c7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_airplane_off.png
index 294ae48..714f07e 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_airplane_off.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.png
new file mode 100644
index 0000000..521de12
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.png
new file mode 100644
index 0000000..4d015da
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.png
new file mode 100644
index 0000000..d8209e6
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_airplane_off.png
index 7b7e329..6fc556d 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_airplane_off.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.png
new file mode 100644
index 0000000..3725b3f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.png
new file mode 100644
index 0000000..b72a274
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.png
new file mode 100644
index 0000000..aa2de43
--- /dev/null
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png
index 8ab2e1e..95df4d45 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png
index 426b33d..541e801 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_location_off.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_location_off.png
index 7c73ace..b692107 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_location_off.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_location_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_remote_display.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_remote_display.png
index 8e080ff..09ae409 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_remote_display.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_remote_display.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png
index da4ffa2..4a2119f 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png
index e1c7972..a53d764 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png
index 9441f61..5922161 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png
index b8c8b4e..8b7251b 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png
index 5d0ad7c..4a2119f 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png
index e1c7972..a53d764 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png
index 7208427..535a4fdc 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png
index b8c8b4e..8b7251b 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_dragging.9.png b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_dragging.9.png
deleted file mode 100644
index 60dc3f2..0000000
--- a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_dragging.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/search_light.png b/packages/SystemUI/res/drawable-mdpi/search_light.png
index 4b5b2a4..7a70984 100644
--- a/packages/SystemUI/res/drawable-mdpi/search_light.png
+++ b/packages/SystemUI/res/drawable-mdpi/search_light.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png
index 32e6c49..4411097 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png
index 273f363..c798fd6 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_location_off.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_location_off.png
index 466470c..7ce8f83 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_location_off.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_location_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_remote_display.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_remote_display.png
index 92c6df0..48f90ac 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_remote_display.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_remote_display.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png
index 46fd826..1664688 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png
index c824b97..b38e3ef 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png
index 43a7d82..48650c7 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png
index fb9ecd0..c645859 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png
index 6cf0a4b..1664688 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png
index c824b97..b38e3ef 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png
index 22e0f8c..b86f140 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png
index fb9ecd0..c645859 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_dragging.9.png b/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_dragging.9.png
deleted file mode 100644
index 79d1b3c..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_dragging.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/search_light.png b/packages/SystemUI/res/drawable-xhdpi/search_light.png
index 3aa890f..e2aed09 100644
--- a/packages/SystemUI/res/drawable-xhdpi/search_light.png
+++ b/packages/SystemUI/res/drawable-xhdpi/search_light.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_airplane_off.png
index 3d3c9bb..65b0204 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_airplane_off.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_bluetooth_off.png
index ca1aef0..1045e07 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_bluetooth_off.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_bluetooth_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location_off.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location_off.png
index 920407d..c14c1bb 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location_off.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_remote_display.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_remote_display.png
index 5f6231c..b07be828 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_remote_display.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_remote_display.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png
index 1094bc3..3725b3f 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png
index 1037b02..b72a274 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png
index d2e27d9..9755011 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png
index f5595e3b..aa2de43 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png
index 7183a07..5b80893 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png
index 3746328..21b2118 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png
index 83402ff..9bbb359 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png
index dbf54ce..3f0447df 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_dragging.9.png b/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_dragging.9.png
deleted file mode 100644
index c424ffe..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_dragging.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/search_light.png b/packages/SystemUI/res/drawable-xxhdpi/search_light.png
index 74ad3c8..e5ef85d 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/search_light.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/search_light.png
Binary files differ
diff --git a/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml
index b06166d..b2ba25a 100644
--- a/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml
+++ b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml
@@ -41,15 +41,15 @@
             android:fadingEdge="horizontal"
             android:scrollbars="none"
             android:layout_gravity="right"
-            android:fadingEdgeLength="@dimen/status_bar_recents_scroll_fading_edge_length"
-            android:fitsSystemWindows="true">
+            android:fadingEdgeLength="@dimen/status_bar_recents_scroll_fading_edge_length">
 
             <LinearLayout android:id="@+id/recents_linear_layout"
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:layoutDirection="ltr"
                 android:layout_gravity="left"
-                android:orientation="horizontal">
+                android:orientation="horizontal"
+                android:fitsSystemWindows="true">
             </LinearLayout>
 
         </com.android.systemui.recent.RecentsHorizontalScrollView>
diff --git a/packages/SystemUI/res/layout/status_bar_recent_panel.xml b/packages/SystemUI/res/layout/status_bar_recent_panel.xml
index 305aaf2..e41475b 100644
--- a/packages/SystemUI/res/layout/status_bar_recent_panel.xml
+++ b/packages/SystemUI/res/layout/status_bar_recent_panel.xml
@@ -45,13 +45,13 @@
             android:fadingEdgeLength="@dimen/status_bar_recents_scroll_fading_edge_length"
             android:layout_gravity="bottom|start"
             android:clipToPadding="false"
-            android:clipChildren="false"
-            android:fitsSystemWindows="true">
+            android:clipChildren="false">
 
             <LinearLayout android:id="@+id/recents_linear_layout"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:orientation="vertical"
+                android:fitsSystemWindows="true"
                 android:clipToPadding="false"
                 android:clipChildren="false">
             </LinearLayout>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 36ff0fa..2ab8cbe 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -29,9 +29,9 @@
     <item quantity="one" msgid="5854176083865845541">"تطبيق حديث واحد"</item>
     <item quantity="other" msgid="1040784359794890744">"%d من التطبيقات الحديثة"</item>
   </plurals>
-    <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ليس هناك أي تنبيهات"</string>
+    <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ليس هناك أي اشعارات"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"مستمر"</string>
-    <string name="status_bar_latest_events_title" msgid="6594767438577593172">"التنبيهات"</string>
+    <string name="status_bar_latest_events_title" msgid="6594767438577593172">"الإشعارات"</string>
     <string name="battery_low_title" msgid="2783104807551211639">"توصيل الشاحن"</string>
     <string name="battery_low_subtitle" msgid="1752040062087829196">"انخفضت طاقة البطارية."</string>
     <string name="battery_low_percent_format" msgid="1077244949318261761">"المتبقي: <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
@@ -43,7 +43,7 @@
     <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"التدوير التلقائي للشاشة"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"كتم"</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"تلقائي"</string>
-    <string name="status_bar_settings_notifications" msgid="397146176280905137">"التنبيهات"</string>
+    <string name="status_bar_settings_notifications" msgid="397146176280905137">"الإشعارات"</string>
     <string name="bluetooth_tethered" msgid="7094101612161133267">"تم إنشاء الاتصال بالإنترنت عن طريق البلوتوث."</string>
     <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"إعداد أسلوب الإدخال"</string>
     <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"لوحة مفاتيح فعلية"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 310b0289..25c5baa 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -44,7 +44,7 @@
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"LYDLØS"</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
     <string name="status_bar_settings_notifications" msgid="397146176280905137">"Underretninger"</string>
-    <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth-tethering anvendt"</string>
+    <string name="bluetooth_tethered" msgid="7094101612161133267">"Netdeling via Bluetooth anvendt"</string>
     <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Konfigurer inputmetoder"</string>
     <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Fysisk tastatur"</string>
     <string name="usb_device_permission_prompt" msgid="834698001271562057">"Tillad, at appen <xliff:g id="APPLICATION">%1$s</xliff:g> kan få adgang til USB-enheden?"</string>
@@ -73,7 +73,7 @@
     <string name="use_ptp_button_title" msgid="7517127540301625751">"Isæt som et kamera (PTP)"</string>
     <string name="installer_cd_button_title" msgid="2312667578562201583">"Installer appen Android Filoverførsel til Mac"</string>
     <string name="accessibility_back" msgid="567011538994429120">"Tilbage"</string>
-    <string name="accessibility_home" msgid="8217216074895377641">"Startside"</string>
+    <string name="accessibility_home" msgid="8217216074895377641">"Startskærm"</string>
     <string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
     <string name="accessibility_recent" msgid="8571350598987952883">"Seneste apps"</string>
     <string name="accessibility_search_light" msgid="1103867596330271848">"Søg"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 8c07a31..da958bf 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -179,7 +179,7 @@
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
     <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> उपकरण)"</string>
     <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth बंद"</string>
-    <string name="quick_settings_brightness_label" msgid="6968372297018755815">"चमक"</string>
+    <string name="quick_settings_brightness_label" msgid="6968372297018755815">"स्क्रीन की रोशनी"</string>
     <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"स्वत: रोटेट"</string>
     <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"रोटेशन लॉक किया गया"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"इनपुट विधि"</string>
@@ -197,7 +197,7 @@
     <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi बंद"</string>
     <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi प्रदर्शन"</string>
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"वायरलेस डिस्प्ले"</string>
-    <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"चमक"</string>
+    <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"स्क्रीन की रोशनी"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"स्वत:"</string>
     <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"नेटवर्क को\nमॉनीटर किया जा सकता है"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 9158054..d833ec1 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -116,8 +116,8 @@
     <string name="accessibility_two_bars" msgid="6437363648385206679">"Due barre."</string>
     <string name="accessibility_three_bars" msgid="2648241415119396648">"Tre barre."</string>
     <string name="accessibility_signal_full" msgid="9122922886519676839">"Massimo segnale."</string>
-    <string name="accessibility_desc_on" msgid="2385254693624345265">"Attivo."</string>
-    <string name="accessibility_desc_off" msgid="6475508157786853157">"Non attivo."</string>
+    <string name="accessibility_desc_on" msgid="2385254693624345265">"ON"</string>
+    <string name="accessibility_desc_off" msgid="6475508157786853157">"OFF"</string>
     <string name="accessibility_desc_connected" msgid="8366256693719499665">"Connesso."</string>
     <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
     <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 7ccf6d8..7c7f661 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -182,7 +182,7 @@
     <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Mzunguko Umefungwa"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"Mbinu ya uingizaji"</string>
     <string name="quick_settings_location_label" msgid="5011327048748762257">"Kutambua Eneo"</string>
-    <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Eneo Limezimwa"</string>
+    <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Kitambua eneo kimezimwa"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Kifaa cha midia"</string>
     <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
     <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Simu za Dharura Pekee"</string>
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java
index 818c2980..09a7a5e 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java
@@ -177,10 +177,14 @@
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
+        getWindow().addPrivateFlags(
+                WindowManager.LayoutParams.PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR);
         setContentView(R.layout.status_bar_recent_panel);
         mRecentsPanel = (RecentsPanelView) findViewById(R.id.recents_root);
         mRecentsPanel.setOnTouchListener(new TouchOutsideListener(mRecentsPanel));
-        mRecentsPanel.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
+        mRecentsPanel.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
 
         final RecentTasksLoader recentTasksLoader = RecentTasksLoader.getInstance(this);
         recentTasksLoader.setRecentsPanel(mRecentsPanel, mRecentsPanel);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SystemBars.java b/packages/SystemUI/src/com/android/systemui/statusbar/SystemBars.java
index 16fe1aa..8819c60 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SystemBars.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SystemBars.java
@@ -35,7 +35,7 @@
  */
 public class SystemBars extends SystemUI implements ServiceMonitor.Callbacks {
     private static final String TAG = "SystemBars";
-    private static final boolean DEBUG = true;
+    private static final boolean DEBUG = false;
     private static final int WAIT_FOR_BARS_TO_DIE = 500;
 
     // manages the implementation coming from the remote process
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
index 74b23d2..1c8702a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
@@ -35,7 +35,7 @@
 
     public static final int MODE_OPAQUE = 0;
     public static final int MODE_SEMI_TRANSPARENT = 1;
-    public static final int MODE_TRANSPARENT = 2;
+    public static final int MODE_TRANSLUCENT = 2;
     public static final int MODE_LIGHTS_OUT = 3;
 
     public static final int LIGHTS_IN_DURATION = 250;
@@ -125,7 +125,7 @@
                 mColorDrawable.setColor(newColor);
             }
         }
-        if (oldColor != null && newColor == null && mColorDrawableShowing) {
+        if (newColor == null && mColorDrawableShowing) {
             if (DEBUG) Log.d(mTag, "Hide color layer");
             if (animate) {
                 mTransitionDrawable.reverseTransition(BACKGROUND_DURATION);
@@ -133,9 +133,8 @@
                 mTransitionDrawable.resetTransition();
             }
             mColorDrawableShowing = false;
-        } else if (oldColor == null && newColor != null && !mColorDrawableShowing) {
+        } else if (newColor != null && !mColorDrawableShowing) {
             if (DEBUG) Log.d(mTag, "Show color layer");
-            mTransitionDrawable.setCrossFadeEnabled(!animate);
             mTransitionDrawable.startTransition(animate ? BACKGROUND_DURATION : 0);
             mColorDrawableShowing = true;
         }
@@ -158,7 +157,7 @@
     public static String modeToString(int mode) {
         if (mode == MODE_OPAQUE) return "MODE_OPAQUE";
         if (mode == MODE_SEMI_TRANSPARENT) return "MODE_SEMI_TRANSPARENT";
-        if (mode == MODE_TRANSPARENT) return "MODE_TRANSPARENT";
+        if (mode == MODE_TRANSLUCENT) return "MODE_TRANSLUCENT";
         if (mode == MODE_LIGHTS_OUT) return "MODE_LIGHTS_OUT";
         throw new IllegalArgumentException("Unknown mode " + mode);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java
index 4e92179..5d4b995 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java
@@ -58,8 +58,8 @@
     @Override
     public void transitionTo(int mode, boolean animate) {
         mRequestedMode = mode;
-        if (mVertical && mode == MODE_TRANSPARENT) {
-            // fully transparent mode not allowed when vertical
+        if (mVertical && mode == MODE_TRANSLUCENT) {
+            // translucent mode not allowed when vertical
             mode = MODE_OPAQUE;
         }
         super.transitionTo(mode, animate);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index 04885f0..6e53363 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -391,7 +391,7 @@
 
         final AccessibilityManager accessibilityManager =
                 (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
-        if (accessibilityManager.isEnabled()) {
+        if (accessibilityManager.isEnabled() && accessibilityManager.isTouchExplorationEnabled()) {
             // In accessibility mode, we add a simple click handler since swipe is tough to
             // trigger near screen edges.
             View camera = getCameraButton();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index c47d0eb..c02a99b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -22,7 +22,7 @@
 import static android.app.StatusBarManager.windowStateToString;
 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
-import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
+import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSLUCENT;
 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT;
 
 import android.animation.Animator;
@@ -113,7 +113,7 @@
     public static final boolean DUMPTRUCK = true; // extra dumpsys info
     public static final boolean DEBUG_GESTURES = false;
 
-    public static final boolean DEBUG_WINDOW_STATE = true;
+    public static final boolean DEBUG_WINDOW_STATE = false;
 
     public static final boolean SETTINGS_DRAG_SHORTCUT = true;
 
@@ -1853,12 +1853,12 @@
 
             // update status bar mode
             final int sbMode = computeBarMode(oldVal, newVal, mStatusBarView.getBarTransitions(),
-                    View.STATUS_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS);
+                    View.STATUS_BAR_TRANSIENT, View.STATUS_BAR_TRANSLUCENT);
 
             // update navigation bar mode
             final int nbMode = mNavigationBarView == null ? -1 : computeBarMode(
                     oldVal, newVal, mNavigationBarView.getBarTransitions(),
-                    View.NAVIGATION_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION);
+                    View.NAVIGATION_BAR_TRANSIENT, View.NAVIGATION_BAR_TRANSLUCENT);
             final boolean sbModeChanged = sbMode != -1;
             final boolean nbModeChanged = nbMode != -1;
             boolean checkBarModes = false;
@@ -1896,18 +1896,18 @@
     }
 
     private int computeBarMode(int oldVis, int newVis, BarTransitions transitions,
-            int transientFlag, int transparentFlag) {
-        final int oldMode = barMode(oldVis, transientFlag, transparentFlag);
-        final int newMode = barMode(newVis, transientFlag, transparentFlag);
+            int transientFlag, int translucentFlag) {
+        final int oldMode = barMode(oldVis, transientFlag, translucentFlag);
+        final int newMode = barMode(newVis, transientFlag, translucentFlag);
         if (oldMode == newMode) {
             return -1; // no mode change
         }
         return newMode;
     }
 
-    private int barMode(int vis, int transientFlag, int transparentFlag) {
+    private int barMode(int vis, int transientFlag, int translucentFlag) {
         return (vis & transientFlag) != 0 ? MODE_SEMI_TRANSPARENT
-                : (vis & transparentFlag) != 0 ? MODE_TRANSPARENT
+                : (vis & translucentFlag) != 0 ? MODE_TRANSLUCENT
                 : (vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0 ? MODE_LIGHTS_OUT
                 : MODE_OPAQUE;
     }
@@ -2737,7 +2737,7 @@
         if (command.equals(COMMAND_BARS)) {
             String mode = args.getString("mode");
             int barMode = "opaque".equals(mode) ? MODE_OPAQUE :
-                    "transparent".equals(mode) ? MODE_TRANSPARENT :
+                    "translucent".equals(mode) ? MODE_TRANSLUCENT :
                     "semi-transparent".equals(mode) ? MODE_SEMI_TRANSPARENT :
                     -1;
             if (barMode != -1) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
index 6bb6776..8406565 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
@@ -20,13 +20,12 @@
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
 import android.content.res.Resources;
-import android.graphics.drawable.GradientDrawable.Orientation;
 import android.view.View;
 
 import com.android.systemui.R;
 
 public final class PhoneStatusBarTransitions extends BarTransitions {
-    private static final float ICON_ALPHA_WHEN_TRANSPARENT = 1;
+    private static final float ICON_ALPHA_WHEN_NOT_OPAQUE = 1;
     private static final float ICON_ALPHA_WHEN_LIGHTS_OUT_BATTERY_CLOCK = 0.5f;
     private static final float ICON_ALPHA_WHEN_LIGHTS_OUT_NON_BATTERY_CLOCK = 0;
 
@@ -59,7 +58,7 @@
 
     private float getNonBatteryClockAlphaFor(int mode) {
         return mode == MODE_LIGHTS_OUT ? ICON_ALPHA_WHEN_LIGHTS_OUT_NON_BATTERY_CLOCK
-                : isTransparent(mode) ? ICON_ALPHA_WHEN_TRANSPARENT
+                : !isOpaque(mode) ? ICON_ALPHA_WHEN_NOT_OPAQUE
                 : mIconAlphaWhenOpaque;
     }
 
@@ -68,8 +67,8 @@
                 : getNonBatteryClockAlphaFor(mode);
     }
 
-    private boolean isTransparent(int mode) {
-        return mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSPARENT;
+    private boolean isOpaque(int mode) {
+        return !(mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSLUCENT);
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index 09f1695..01c27f2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -514,9 +514,13 @@
     private final void updateTelephonySignalStrength() {
         if (!hasService()) {
             if (CHATTY) Log.d(TAG, "updateTelephonySignalStrength: !hasService()");
-            mPhoneSignalIconId = R.drawable.stat_sys_signal_null;
+            if (!mSimState.iccCardExist()) {
+                mPhoneSignalIconId = R.drawable.stat_sys_no_sim;
+            } else {
+                mPhoneSignalIconId = R.drawable.stat_sys_signal_null;
+            }
+            mDataSignalIconId = mPhoneSignalIconId;
             mQSPhoneSignalIconId = R.drawable.ic_qs_signal_no_signal;
-            mDataSignalIconId = R.drawable.stat_sys_signal_null;
         } else {
             if (mSignalStrength == null) {
                 if (CHATTY) Log.d(TAG, "updateTelephonySignalStrength: mSignalStrength == null");
diff --git a/packages/WallpaperCropper/res/layout/wallpaper_cropper.xml b/packages/WallpaperCropper/res/layout/wallpaper_cropper.xml
index 6dc7e35..97d7001 100644
--- a/packages/WallpaperCropper/res/layout/wallpaper_cropper.xml
+++ b/packages/WallpaperCropper/res/layout/wallpaper_cropper.xml
@@ -19,7 +19,7 @@
 -->
 
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/wallpaper_cropper"
+    android:id="@+id/wallpaper_root"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
     <com.android.wallpapercropper.CropView
diff --git a/packages/WallpaperCropper/res/values-sw600dp/config.xml b/packages/WallpaperCropper/res/values-sw600dp/config.xml
new file mode 100644
index 0000000..62342dc
--- /dev/null
+++ b/packages/WallpaperCropper/res/values-sw600dp/config.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<resources>
+    <bool name="allow_rotation">true</bool>
+</resources>
diff --git a/packages/WallpaperCropper/res/values/config.xml b/packages/WallpaperCropper/res/values/config.xml
new file mode 100644
index 0000000..1b24190
--- /dev/null
+++ b/packages/WallpaperCropper/res/values/config.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<resources>
+    <bool name="allow_rotation">false</bool>
+</resources>
diff --git a/packages/WallpaperCropper/src/com/android/wallpapercropper/CropView.java b/packages/WallpaperCropper/src/com/android/wallpapercropper/CropView.java
index ecebd642..b4e715c 100644
--- a/packages/WallpaperCropper/src/com/android/wallpapercropper/CropView.java
+++ b/packages/WallpaperCropper/src/com/android/wallpapercropper/CropView.java
@@ -22,8 +22,8 @@
 import android.util.AttributeSet;
 import android.view.MotionEvent;
 import android.view.ScaleGestureDetector;
-import android.view.ViewConfiguration;
 import android.view.ScaleGestureDetector.OnScaleGestureListener;
+import android.view.ViewConfiguration;
 import android.view.ViewTreeObserver;
 import android.view.ViewTreeObserver.OnGlobalLayoutListener;
 
@@ -44,6 +44,7 @@
     public interface TouchCallback {
         void onTouchDown();
         void onTap();
+        void onTouchUp();
     }
 
     public CropView(Context context) {
@@ -140,12 +141,12 @@
     public void onScaleEnd(ScaleGestureDetector detector) {
     }
 
-    public void moveToUpperLeft() {
+    public void moveToLeft() {
         if (getWidth() == 0 || getHeight() == 0) {
             final ViewTreeObserver observer = getViewTreeObserver();
             observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
                     public void onGlobalLayout() {
-                        moveToUpperLeft();
+                        moveToLeft();
                         getViewTreeObserver().removeOnGlobalLayoutListener(this);
                     }
                 });
@@ -154,7 +155,6 @@
         getEdgesHelper(edges);
         final float scale = mRenderer.scale;
         mRenderer.centerX += Math.ceil(edges.left / scale);
-        mRenderer.centerY += Math.ceil(edges.top / scale);
     }
 
     public void setTouchEnabled(boolean enabled) {
@@ -197,11 +197,13 @@
             float squaredDist = (mFirstX - x) * (mFirstX - x) + (mFirstY - y) * (mFirstY - y);
             float slop = config.getScaledTouchSlop() * config.getScaledTouchSlop();
             long now = System.currentTimeMillis();
-            // only do this if it's a small movement
-            if (mTouchCallback != null &&
-                    squaredDist < slop &&
+            if (mTouchCallback != null) {
+                // only do this if it's a small movement
+                if (squaredDist < slop &&
                     now < mTouchDownTime + ViewConfiguration.getTapTimeout()) {
-                mTouchCallback.onTap();
+                    mTouchCallback.onTap();
+                }
+                mTouchCallback.onTouchUp();
             }
         }
 
diff --git a/packages/WallpaperCropper/src/com/android/wallpapercropper/TranslucentDecor.java b/packages/WallpaperCropper/src/com/android/wallpapercropper/TranslucentDecor.java
new file mode 100644
index 0000000..9ce7331
--- /dev/null
+++ b/packages/WallpaperCropper/src/com/android/wallpapercropper/TranslucentDecor.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+/* Copied from Launcher3 */
+package com.android.wallpapercropper;
+
+import android.app.Activity;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+
+public class TranslucentDecor {
+    private static final int SYSTEM_UI_FLAG_TRANSPARENT_STATUS = 0x00001000;
+    private static final int SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION = 0x00002000;
+
+    // Replace with SDK constants when available.
+    public static final int FLAG_TRANSLUCENT_STATUS = 0x04000000;
+    public static final int FLAG_TRANSLUCENT_NAVIGATION = 0x08000000;
+
+    // Behave properly on early K builds.
+    public static final boolean SYSUI_SUPPORTED = !hasSystemUiFlag("ALLOW_TRANSIENT") &&
+            hasSystemUiFlag("TRANSPARENT_STATUS") &&
+            hasSystemUiFlag("TRANSPARENT_NAVIGATION");
+
+    public static final boolean WM_SUPPORTED =
+            hasWindowManagerFlag("TRANSLUCENT_STATUS") &&
+            hasWindowManagerFlag("TRANSLUCENT_NAVIGATION");
+
+    private final View mTarget;
+
+    public TranslucentDecor(View target) {
+        mTarget = target;
+    }
+
+    public void requestTranslucentDecor(boolean translucent) {
+        int sysui = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
+        if (WM_SUPPORTED && mTarget.getContext() instanceof Activity) {
+            Window w = ((Activity) mTarget.getContext()).getWindow();
+            int wmFlags = FLAG_TRANSLUCENT_STATUS | FLAG_TRANSLUCENT_NAVIGATION;
+            if (translucent) {
+                w.addFlags(wmFlags);
+            } else {
+               w.clearFlags(wmFlags);
+            }
+        } else if (SYSUI_SUPPORTED) {  // Remove when droidfood platform is updated
+            if (translucent) {
+                sysui |= SYSTEM_UI_FLAG_TRANSPARENT_STATUS | SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION;
+            }
+        }
+        mTarget.setSystemUiVisibility(sysui);
+    }
+
+    private static boolean hasWindowManagerFlag(String name) {
+        try {
+            return WindowManager.LayoutParams.class.getField("FLAG_" + name) != null;
+        } catch (NoSuchFieldException e) {
+            return false;
+        }
+    }
+
+    private static boolean hasSystemUiFlag(String name) {
+        try {
+            return View.class.getField("SYSTEM_UI_FLAG_" + name) != null;
+        } catch (NoSuchFieldException e) {
+            return false;
+        }
+    }
+}
diff --git a/packages/WallpaperCropper/src/com/android/wallpapercropper/WallpaperCropActivity.java b/packages/WallpaperCropper/src/com/android/wallpapercropper/WallpaperCropActivity.java
index af48652..48fbcc5 100644
--- a/packages/WallpaperCropper/src/com/android/wallpapercropper/WallpaperCropActivity.java
+++ b/packages/WallpaperCropper/src/com/android/wallpapercropper/WallpaperCropActivity.java
@@ -75,6 +75,9 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         init();
+        if (!enableRotation()) {
+            setRequestedOrientation(Configuration.ORIENTATION_PORTRAIT);
+        }
     }
 
     protected void init() {
@@ -99,6 +102,12 @@
                         cropImageAndSetWallpaper(imageUri, null, finishActivityWhenDone);
                     }
                 });
+        TranslucentDecor transparentDecor = new TranslucentDecor(findViewById(R.id.wallpaper_root));
+        transparentDecor.requestTranslucentDecor(true);
+    }
+
+    public boolean enableRotation() {
+        return getResources().getBoolean(R.bool.allow_rotation);
     }
 
     public static String getSharedPreferencesKey() {
@@ -162,7 +171,6 @@
     }
 
     protected void setWallpaper(String filePath, final boolean finishActivityWhenDone) {
-
         BitmapCropTask cropTask = new BitmapCropTask(this,
                 filePath, null, 0, 0, true, false, null);
         final Point bounds = cropTask.getImageBounds();
@@ -200,7 +208,7 @@
                 }
             }
         };
-        BitmapCropTask cropTask = new BitmapCropTask(res, resId,
+        BitmapCropTask cropTask = new BitmapCropTask(this, res, resId,
                 crop, outSize.x, outSize.y,
                 true, false, onEndCrop);
         cropTask.execute();
@@ -213,9 +221,11 @@
 
     protected void cropImageAndSetWallpaper(Uri uri,
             OnBitmapCroppedHandler onBitmapCroppedHandler, final boolean finishActivityWhenDone) {
-     // Get the crop
+        // Get the crop
         Point inSize = mCropView.getSourceDimensions();
 
+        boolean ltr = mCropView.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR;
+
         Point minDims = new Point();
         Point maxDims = new Point();
         Display d = getWindowManager().getDefaultDisplay();
@@ -226,12 +236,12 @@
 
         int maxDim = Math.max(maxDims.x, maxDims.y);
         final int minDim = Math.min(minDims.x, minDims.y);
-        int defaultWidth;
+        int defaultWallpaperWidth;
         if (isScreenLarge(getResources())) {
-            defaultWidth = (int) (maxDim *
+            defaultWallpaperWidth = (int) (maxDim *
                     wallpaperTravelToScreenWidthRatio(maxDim, minDim));
         } else {
-            defaultWidth = Math.max((int)
+            defaultWallpaperWidth = Math.max((int)
                     (minDim * WALLPAPER_SCREENS_SPAN), maxDim);
         }
 
@@ -256,12 +266,17 @@
 
         // ADJUST CROP WIDTH
         // Extend the crop all the way to the right, for parallax
-        float extraSpaceToRight = inSize.x - cropRect.right;
+        // (or all the way to the left, in RTL)
+        float extraSpace = ltr ? inSize.x - cropRect.right : cropRect.left;
         // Cap the amount of extra width
-        float maxExtraSpace = defaultWidth / cropScale - cropRect.width();
-        extraSpaceToRight = Math.min(extraSpaceToRight, maxExtraSpace);
+        float maxExtraSpace = defaultWallpaperWidth / cropScale - cropRect.width();
+        extraSpace = Math.min(extraSpace, maxExtraSpace);
 
-        cropRect.right += extraSpaceToRight;
+        if (ltr) {
+            cropRect.right += extraSpace;
+        } else {
+            cropRect.left -= extraSpace;
+        }
 
         // ADJUST CROP HEIGHT
         if (isPortrait) {
@@ -287,7 +302,7 @@
                 }
             }
         };
-        BitmapCropTask cropTask = new BitmapCropTask(uri,
+        BitmapCropTask cropTask = new BitmapCropTask(this, uri,
                 cropRect, outWidth, outHeight, true, false, onEndCrop);
         if (onBitmapCroppedHandler != null) {
             cropTask.setOnBitmapCropped(onBitmapCroppedHandler);
@@ -299,7 +314,7 @@
         public void onBitmapCropped(byte[] imageBytes);
     }
 
-    protected class BitmapCropTask extends AsyncTask<Void, Void, Boolean> {
+    protected static class BitmapCropTask extends AsyncTask<Void, Void, Boolean> {
         Uri mInUri = null;
         Context mContext;
         String mInFilePath;
@@ -309,7 +324,6 @@
         RectF mCropBounds = null;
         int mOutWidth, mOutHeight;
         int mRotation = 0; // for now
-        protected final WallpaperManager mWPManager;
         String mOutputFormat = "jpg"; // for now
         boolean mSetWallpaper;
         boolean mSaveCroppedBitmap;
@@ -324,7 +338,6 @@
                 boolean setWallpaper, boolean saveCroppedBitmap, Runnable onEndRunnable) {
             mContext = c;
             mInFilePath = filePath;
-            mWPManager = WallpaperManager.getInstance(getApplicationContext());
             init(cropBounds, outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
         }
 
@@ -332,24 +345,23 @@
                 RectF cropBounds, int outWidth, int outHeight,
                 boolean setWallpaper, boolean saveCroppedBitmap, Runnable onEndRunnable) {
             mInImageBytes = imageBytes;
-            mWPManager = WallpaperManager.getInstance(getApplicationContext());
             init(cropBounds, outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
         }
 
-        public BitmapCropTask(Uri inUri,
+        public BitmapCropTask(Context c, Uri inUri,
                 RectF cropBounds, int outWidth, int outHeight,
                 boolean setWallpaper, boolean saveCroppedBitmap, Runnable onEndRunnable) {
+            mContext = c;
             mInUri = inUri;
-            mWPManager = WallpaperManager.getInstance(getApplicationContext());
             init(cropBounds, outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
         }
 
-        public BitmapCropTask(Resources res, int inResId,
+        public BitmapCropTask(Context c, Resources res, int inResId,
                 RectF cropBounds, int outWidth, int outHeight,
                 boolean setWallpaper, boolean saveCroppedBitmap, Runnable onEndRunnable) {
+            mContext = c;
             mInResId = inResId;
             mResources = res;
-            mWPManager = WallpaperManager.getInstance(getApplicationContext());
             init(cropBounds, outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
         }
 
@@ -385,7 +397,7 @@
                 try {
                     if (mInUri != null) {
                         mInStream = new BufferedInputStream(
-                                getContentResolver().openInputStream(mInUri));
+                                mContext.getContentResolver().openInputStream(mInUri));
                     } else if (mInFilePath != null) {
                         mInStream = mContext.openFileInput(mInFilePath);
                     } else if (mInImageBytes != null) {
@@ -426,16 +438,17 @@
 
             regenerateInputStream();
 
-            if (mNoCrop && mInStream != null) {
+            WallpaperManager wallpaperManager = null;
+            if (mSetWallpaper) {
+                wallpaperManager = WallpaperManager.getInstance(mContext.getApplicationContext());
+            }
+            if (mSetWallpaper && mNoCrop && mInStream != null) {
                 try {
-                    mWPManager.setStream(mInStream);
+                    wallpaperManager.setStream(mInStream);
                 } catch (IOException e) {
                     Log.w(LOGTAG, "cannot write stream to wallpaper", e);
                     failure = true;
                 }
-                if (mOnEndRunnable != null) {
-                    mOnEndRunnable.run();
-                }
                 return !failure;
             }
             if (mInStream != null) {
@@ -509,7 +522,9 @@
                             (int) returnRect.height(), Bitmap.Config.ARGB_8888);
                     if (tmp != null) {
                         Canvas c = new Canvas(tmp);
-                        c.drawBitmap(crop, m, new Paint());
+                        Paint p = new Paint();
+                        p.setFilterBitmap(true);
+                        c.drawBitmap(crop, m, p);
                         crop = tmp;
                     }
                 } else if (mRotation > 0) {
@@ -534,26 +549,18 @@
                 ByteArrayOutputStream tmpOut = new ByteArrayOutputStream(2048);
                 if (crop.compress(cf, DEFAULT_COMPRESS_QUALITY, tmpOut)) {
                     // If we need to set to the wallpaper, set it
-                    if (mSetWallpaper && mWPManager != null) {
-                        if (mWPManager == null) {
-                            Log.w(LOGTAG, "no wallpaper manager");
-                            failure = true;
-                        } else {
-                            try {
-                                byte[] outByteArray = tmpOut.toByteArray();
-                                mWPManager.setStream(new ByteArrayInputStream(outByteArray));
-                                if (mOnBitmapCroppedHandler != null) {
-                                    mOnBitmapCroppedHandler.onBitmapCropped(outByteArray);
-                                }
-                            } catch (IOException e) {
-                                Log.w(LOGTAG, "cannot write stream to wallpaper", e);
-                                failure = true;
+                    if (mSetWallpaper && wallpaperManager != null) {
+                        try {
+                            byte[] outByteArray = tmpOut.toByteArray();
+                            wallpaperManager.setStream(new ByteArrayInputStream(outByteArray));
+                            if (mOnBitmapCroppedHandler != null) {
+                                mOnBitmapCroppedHandler.onBitmapCropped(outByteArray);
                             }
+                        } catch (IOException e) {
+                            Log.w(LOGTAG, "cannot write stream to wallpaper", e);
+                            failure = true;
                         }
                     }
-                    if (mOnEndRunnable != null) {
-                        mOnEndRunnable.run();
-                    }
                 } else {
                     Log.w(LOGTAG, "cannot compress bitmap");
                     failure = true;
@@ -569,8 +576,9 @@
 
         @Override
         protected void onPostExecute(Boolean result) {
-            setResult(Activity.RESULT_OK);
-            finish();
+            if (mOnEndRunnable != null) {
+                mOnEndRunnable.run();
+            }
         }
     }
 
diff --git a/policy/src/com/android/internal/policy/impl/BarController.java b/policy/src/com/android/internal/policy/impl/BarController.java
index 57c9675..8d97fc8 100644
--- a/policy/src/com/android/internal/policy/impl/BarController.java
+++ b/policy/src/com/android/internal/policy/impl/BarController.java
@@ -23,6 +23,7 @@
 import android.os.SystemClock;
 import android.util.Slog;
 import android.view.View;
+import android.view.WindowManager;
 import android.view.WindowManagerPolicy.WindowState;
 
 import com.android.internal.statusbar.IStatusBarService;
@@ -39,13 +40,14 @@
     private static final int TRANSIENT_BAR_SHOWING = 1;
     private static final int TRANSIENT_BAR_HIDING = 2;
 
-    private static final int TRANSPARENT_ANIMATION_DELAY_MS = 1000;
+    private static final int TRANSLUCENT_ANIMATION_DELAY_MS = 1000;
 
     private final String mTag;
     private final int mTransientFlag;
     private final int mUnhideFlag;
-    private final int mTransparentFlag;
+    private final int mTranslucentFlag;
     private final int mStatusBarManagerId;
+    private final int mTranslucentWmFlag;
     private final Handler mHandler;
     private final Object mServiceAquireLock = new Object();
     private IStatusBarService mStatusBarService;
@@ -54,15 +56,16 @@
     private int mState = StatusBarManager.WINDOW_STATE_SHOWING;
     private int mTransientBarState;
     private boolean mPendingShow;
-    private long mLastTransparent;
+    private long mLastTranslucent;
 
-    public BarController(String tag, int transientFlag, int unhideFlag, int transparentFlag,
-            int statusBarManagerId) {
+    public BarController(String tag, int transientFlag, int unhideFlag, int translucentFlag,
+            int statusBarManagerId, int translucentWmFlag) {
         mTag = "BarController." + tag;
         mTransientFlag = transientFlag;
         mUnhideFlag = unhideFlag;
-        mTransparentFlag = transparentFlag;
+        mTranslucentFlag = translucentFlag;
         mStatusBarManagerId = statusBarManagerId;
+        mTranslucentWmFlag = translucentWmFlag;
         mHandler = new Handler();
     }
 
@@ -84,8 +87,8 @@
         return mTransientBarState == TRANSIENT_BAR_SHOWING;
     }
 
-    public boolean wasRecentlyTransparent() {
-        return (SystemClock.uptimeMillis() - mLastTransparent) < TRANSPARENT_ANIMATION_DELAY_MS;
+    public boolean wasRecentlyTranslucent() {
+        return (SystemClock.uptimeMillis() - mLastTranslucent) < TRANSLUCENT_ANIMATION_DELAY_MS;
     }
 
     public void adjustSystemUiVisibilityLw(int oldVis, int vis) {
@@ -100,6 +103,22 @@
         }
     }
 
+    public int applyTranslucentFlagLw(WindowState win, int vis, int oldVis) {
+        if (mWin != null) {
+            if (win != null && (win.getAttrs().privateFlags
+                    & WindowManager.LayoutParams.PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR) == 0) {
+                if ((win.getAttrs().flags & mTranslucentWmFlag) != 0) {
+                    vis |= mTranslucentFlag;
+                } else {
+                    vis &= ~mTranslucentFlag;
+                }
+            } else {
+                vis = (vis & ~mTranslucentFlag) | (oldVis & mTranslucentFlag);
+            }
+        }
+        return vis;
+    }
+
     public boolean setBarShowingLw(final boolean show) {
         if (mWin == null) return false;
         if (show && mTransientBarState == TRANSIENT_BAR_HIDING) {
@@ -186,10 +205,10 @@
         }
     }
 
-    public int updateVisibilityLw(boolean allowed, int oldVis, int vis) {
+    public int updateVisibilityLw(boolean transientAllowed, int oldVis, int vis) {
         if (mWin == null) return vis;
         if (mTransientBarState == TRANSIENT_BAR_SHOWING) { // transient bar requested
-            if (allowed) {
+            if (transientAllowed) {
                 vis |= mTransientFlag;
                 if ((oldVis & mTransientFlag) == 0) {
                     vis |= mUnhideFlag;  // tell sysui we're ready to unhide
@@ -202,8 +221,8 @@
             vis |= mTransientFlag;  // ignore clear requests until transition completes
             vis &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE;  // never show transient bars in low profile
         }
-        if ((vis & mTransparentFlag) != 0 || (oldVis & mTransparentFlag) != 0) {
-            mLastTransparent = SystemClock.uptimeMillis();
+        if ((vis & mTranslucentFlag) != 0 || (oldVis & mTranslucentFlag) != 0) {
+            mLastTranslucent = SystemClock.uptimeMillis();
         }
         return vis;
     }
@@ -211,7 +230,7 @@
     private void setTransientBarState(int state) {
         if (mWin != null && state != mTransientBarState) {
             if (mTransientBarState == TRANSIENT_BAR_SHOWING || state == TRANSIENT_BAR_SHOWING) {
-                mLastTransparent = SystemClock.uptimeMillis();
+                mLastTranslucent = SystemClock.uptimeMillis();
             }
             mTransientBarState = state;
             if (DEBUG) Slog.d(mTag, "mTransientBarState: " + transientBarStateToString(state));
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index 11913ee..d8af007 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -2750,6 +2750,18 @@
             setFlags(FLAG_FULLSCREEN, FLAG_FULLSCREEN & (~getForcedWindowFlags()));
         }
 
+        if (a.getBoolean(com.android.internal.R.styleable.Window_windowTranslucentStatus,
+                false)) {
+            setFlags(FLAG_TRANSLUCENT_STATUS, FLAG_TRANSLUCENT_STATUS
+                    & (~getForcedWindowFlags()));
+        }
+
+        if (a.getBoolean(com.android.internal.R.styleable.Window_windowTranslucentNavigation,
+                false)) {
+            setFlags(FLAG_TRANSLUCENT_NAVIGATION, FLAG_TRANSLUCENT_NAVIGATION
+                    & (~getForcedWindowFlags()));
+        }
+
         if (a.getBoolean(com.android.internal.R.styleable.Window_windowOverscan, false)) {
             setFlags(FLAG_LAYOUT_IN_OVERSCAN, FLAG_LAYOUT_IN_OVERSCAN&(~getForcedWindowFlags()));
         }
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 3232a1e..de841da 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -163,9 +163,7 @@
      */
     static final int SYSTEM_UI_CHANGING_LAYOUT =
               View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
-            | View.SYSTEM_UI_FLAG_FULLSCREEN
-            | View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS
-            | View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION;
+            | View.SYSTEM_UI_FLAG_FULLSCREEN;
 
     /**
      * Keyguard stuff
@@ -295,6 +293,7 @@
     boolean mOrientationSensorEnabled = false;
     int mCurrentAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
     boolean mHasSoftInput = false;
+    boolean mTouchExplorationEnabled = false;
 
     int mPointerLocationMode = 0; // guarded by mLock
 
@@ -557,14 +556,16 @@
     private final BarController mStatusBarController = new BarController("StatusBar",
             View.STATUS_BAR_TRANSIENT,
             View.STATUS_BAR_UNHIDE,
-            View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS,
-            StatusBarManager.WINDOW_STATUS_BAR);
+            View.STATUS_BAR_TRANSLUCENT,
+            StatusBarManager.WINDOW_STATUS_BAR,
+            WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
 
     private final BarController mNavigationBarController = new BarController("NavigationBar",
             View.NAVIGATION_BAR_TRANSIENT,
             View.NAVIGATION_BAR_UNHIDE,
-            View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION,
-            StatusBarManager.WINDOW_NAVIGATION_BAR);
+            View.NAVIGATION_BAR_TRANSLUCENT,
+            StatusBarManager.WINDOW_NAVIGATION_BAR,
+            WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
 
     private TransientNavigationConfirmation mTransientNavigationConfirmation;
 
@@ -1073,14 +1074,6 @@
             mHasNavigationBar = true;
         }
 
-        if (mHasNavigationBar) {
-            // The navigation bar is at the right in landscape; it seems always
-            // useful to hide it for showing a video.
-            mCanHideNavigationBar = true;
-        } else {
-            mCanHideNavigationBar = false;
-        }
-
         // For demo purposes, allow the rotation of the HDMI display to be controlled.
         // By default, HDMI locks rotation to landscape.
         if ("portrait".equals(SystemProperties.get("persist.demo.hdmirotation"))) {
@@ -1100,6 +1093,14 @@
                 !"true".equals(SystemProperties.get("config.override_forced_orient"));
     }
 
+    /**
+     * @return whether the navigation bar can be hidden, e.g. the device has a
+     *         navigation bar and touch exploration is not enabled
+     */
+    private boolean canHideNavigationBar() {
+        return mHasNavigationBar && !mTouchExplorationEnabled;
+    }
+
     @Override
     public boolean isDefaultOrientationForced() {
         return mForceDefaultOrientation;
@@ -2580,7 +2581,7 @@
         if ((fl & (FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR))
                 == (FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR)) {
             int availRight, availBottom;
-            if (mCanHideNavigationBar &&
+            if (canHideNavigationBar() &&
                     (systemUiVisibility & View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) != 0) {
                 availRight = mUnrestrictedScreenLeft + mUnrestrictedScreenWidth;
                 availBottom = mUnrestrictedScreenTop + mUnrestrictedScreenHeight;
@@ -2694,9 +2695,10 @@
             // drive nav being hidden only by whether it is requested.
             final int sysui = mLastSystemUiFlags;
             boolean navVisible = (sysui & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0;
-            boolean navTransparent = (sysui & View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION) != 0;
+            boolean navTranslucent = (sysui & View.NAVIGATION_BAR_TRANSLUCENT) != 0;
             boolean transientAllowed = (sysui & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0;
-            navTransparent &= !transientAllowed;  // transient trumps transparent
+            navTranslucent &= !transientAllowed;  // transient trumps translucent
+            navTranslucent &= isTranslucentNavigationAllowed();
 
             // When the navigation bar isn't visible, we put up a fake
             // input window to catch all touch events.  This way we can
@@ -2717,7 +2719,7 @@
             // For purposes of positioning and showing the nav bar, if we have
             // decided that it can't be hidden (because of the screen aspect ratio),
             // then take that into account.
-            navVisible |= !mCanHideNavigationBar;
+            navVisible |= !canHideNavigationBar();
 
             boolean updateSysUiVisibility = false;
             if (mNavigationBar != null) {
@@ -2733,7 +2735,7 @@
                             - mNavigationBarHeightForRotation[displayRotation];
                     mTmpNavigationFrame.set(0, top, displayWidth, displayHeight - overscanBottom);
                     mStableBottom = mStableFullscreenBottom = mTmpNavigationFrame.top;
-                    if (transientNavBarShowing || navTransparent) {
+                    if (transientNavBarShowing || navTranslucent) {
                         mNavigationBarController.setBarShowingLw(true);
                     } else if (navVisible) {
                         mNavigationBarController.setBarShowingLw(true);
@@ -2744,8 +2746,8 @@
                         // We currently want to hide the navigation UI.
                         mNavigationBarController.setBarShowingLw(false);
                     }
-                    if (navVisible && !navTransparent && !mNavigationBar.isAnimatingLw()
-                            && !mNavigationBarController.wasRecentlyTransparent()) {
+                    if (navVisible && !navTranslucent && !mNavigationBar.isAnimatingLw()
+                            && !mNavigationBarController.wasRecentlyTranslucent()) {
                         // If the opaque nav bar is currently requested to be visible,
                         // and not in the process of animating on or off, then
                         // we can tell the app that it is covered by it.
@@ -2757,7 +2759,7 @@
                             - mNavigationBarWidthForRotation[displayRotation];
                     mTmpNavigationFrame.set(left, 0, displayWidth - overscanRight, displayHeight);
                     mStableRight = mStableFullscreenRight = mTmpNavigationFrame.left;
-                    if (transientNavBarShowing || navTransparent) {
+                    if (transientNavBarShowing || navTranslucent) {
                         mNavigationBarController.setBarShowingLw(true);
                     } else if (navVisible) {
                         mNavigationBarController.setBarShowingLw(true);
@@ -2768,8 +2770,8 @@
                         // We currently want to hide the navigation UI.
                         mNavigationBarController.setBarShowingLw(false);
                     }
-                    if (navVisible && !navTransparent && !mNavigationBar.isAnimatingLw()
-                            && !mNavigationBarController.wasRecentlyTransparent()) {
+                    if (navVisible && !navTranslucent && !mNavigationBar.isAnimatingLw()
+                            && !mNavigationBarController.wasRecentlyTranslucent()) {
                         // If the nav bar is currently requested to be visible,
                         // and not in the process of animating on or off, then
                         // we can tell the app that it is covered by it.
@@ -2816,7 +2818,7 @@
                 mStableTop = mUnrestrictedScreenTop + mStatusBarHeight;
 
                 boolean statusBarTransient = (sysui & View.STATUS_BAR_TRANSIENT) != 0;
-                boolean statusBarTransparent = (sysui & View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS) != 0;
+                boolean statusBarTranslucent = (sysui & View.STATUS_BAR_TRANSLUCENT) != 0;
 
                 // If the status bar is hidden, we don't want to cause
                 // windows behind it to scroll.
@@ -2839,8 +2841,8 @@
                             mCurLeft, mCurTop, mCurRight, mCurBottom));
                 }
                 if (mStatusBar.isVisibleLw() && !mStatusBar.isAnimatingLw()
-                        && !statusBarTransient && !statusBarTransparent
-                        && !mStatusBarController.wasRecentlyTransparent()) {
+                        && !statusBarTransient && !statusBarTranslucent
+                        && !mStatusBarController.wasRecentlyTranslucent()) {
                     // If the opaque status bar is currently requested to be visible,
                     // and not in the process of animating on or off, then
                     // we can tell the app that it is covered by it.
@@ -2999,15 +3001,21 @@
             dcf.top = mSystemTop;
             dcf.right = mSystemRight;
             dcf.bottom = mSystemBottom;
-            if (attrs.type >= WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW
-                    && attrs.type <= WindowManager.LayoutParams.LAST_APPLICATION_WINDOW) {
-                if ((attrs.flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) == 0
-                        && (sysUiFl & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0
-                        && (sysUiFl & View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS) == 0) {
+            final boolean inheritTranslucentDecor = (attrs.privateFlags
+                    & WindowManager.LayoutParams.PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR) != 0;
+            final boolean isAppWindow =
+                    attrs.type >= WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW &&
+                    attrs.type <= WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
+            final boolean topAtRest =
+                    win == mTopFullscreenOpaqueWindowState && !win.isAnimatingLw();
+            if (isAppWindow && !inheritTranslucentDecor && !topAtRest) {
+                if ((sysUiFl & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0
+                        && (fl & WindowManager.LayoutParams.FLAG_FULLSCREEN) == 0
+                        && (fl & WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) == 0) {
                     // Ensure policy decor includes status bar
                     dcf.top = mStableTop;
                 }
-                if ((sysUiFl & View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION) == 0
+                if ((fl & WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) == 0
                         && (sysUiFl & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {
                     // Ensure policy decor includes navigation bar
                     dcf.bottom = mStableBottom;
@@ -3060,7 +3068,7 @@
                         pf.right = df.right = of.right = mOverscanScreenLeft + mOverscanScreenWidth;
                         pf.bottom = df.bottom = of.bottom = mOverscanScreenTop
                                 + mOverscanScreenHeight;
-                    } else if (mCanHideNavigationBar
+                    } else if (canHideNavigationBar()
                             && (sysUiFl & View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) != 0
                             && attrs.type >= WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW
                             && attrs.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW) {
@@ -3198,7 +3206,7 @@
                             = mOverscanScreenLeft + mOverscanScreenWidth;
                     pf.bottom = df.bottom = of.bottom = cf.bottom
                             = mOverscanScreenTop + mOverscanScreenHeight;
-                } else if (mCanHideNavigationBar
+                } else if (canHideNavigationBar()
                         && (sysUiFl & View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) != 0
                         && (attrs.type == TYPE_TOAST
                             || (attrs.type >= WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW
@@ -3257,6 +3265,12 @@
                             + mRestrictedScreenWidth;
                     pf.bottom = df.bottom = of.bottom = cf.bottom = mRestrictedScreenTop
                             + mRestrictedScreenHeight;
+                } else if (attrs.type == TYPE_TOAST || attrs.type == TYPE_SYSTEM_ALERT) {
+                    // Toasts are stable to interim decor changes.
+                    pf.left = df.left = of.left = cf.left = mStableLeft;
+                    pf.top = df.top = of.top = cf.top = mStableTop;
+                    pf.right = df.right = of.right = cf.right = mStableRight;
+                    pf.bottom = df.bottom = of.bottom = cf.bottom = mStableBottom;
                 } else {
                     pf.left = mContentLeft;
                     pf.top = mContentTop;
@@ -5061,22 +5075,34 @@
     }
 
     private int updateSystemBarsLw(WindowState win, int oldVis, int vis) {
+        // apply translucent bar vis flags
+        WindowState transWin = mKeyguard != null && mKeyguard.isVisibleLw() && !mHideLockScreen
+                ? mKeyguard
+                : mTopFullscreenOpaqueWindowState;
+        vis = mStatusBarController.applyTranslucentFlagLw(transWin, vis, oldVis);
+        vis = mNavigationBarController.applyTranslucentFlagLw(transWin, vis, oldVis);
+
         // prevent status bar interaction from clearing certain flags
         boolean statusBarHasFocus = win.getAttrs().type == TYPE_STATUS_BAR;
         if (statusBarHasFocus) {
             int flags = View.SYSTEM_UI_FLAG_FULLSCREEN
                     | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                     | View.SYSTEM_UI_FLAG_IMMERSIVE
-                    | View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS
-                    | View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION;
-            vis = (vis & ~flags) | (mLastSystemUiFlags & flags);
+                    | View.STATUS_BAR_TRANSLUCENT
+                    | View.NAVIGATION_BAR_TRANSLUCENT;
+            vis = (vis & ~flags) | (oldVis & flags);
+        }
+
+        if (!isTranslucentNavigationAllowed()) {
+            vis &= ~View.NAVIGATION_BAR_TRANSLUCENT;
         }
 
         // update status bar
         boolean transientAllowed =
                 (vis & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0;
         boolean hideStatusBarWM =
-                (win.getAttrs().flags
+                mTopFullscreenOpaqueWindowState != null &&
+                (mTopFullscreenOpaqueWindowState.getAttrs().flags
                         & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0;
         boolean hideStatusBarSysui =
                 (vis & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0;
@@ -5121,6 +5147,14 @@
                 && (vis & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0;
     }
 
+    /**
+     * @return whether the navigation bar can be made translucent, e.g. touch
+     *         exploration is not enabled
+     */
+    private boolean isTranslucentNavigationAllowed() {
+        return !mTouchExplorationEnabled;
+    }
+
     // Use this instead of checking config_showNavigationBar so that it can be consistently
     // overridden by qemu.hw.mainkeys in the emulator.
     @Override
@@ -5164,6 +5198,11 @@
     }
 
     @Override
+    public void setTouchExplorationEnabled(boolean enabled) {
+        mTouchExplorationEnabled = enabled;
+    }
+
+    @Override
     public boolean isTopLevelWindow(int windowType) {
         if (windowType >= WindowManager.LayoutParams.FIRST_SUB_WINDOW
                 && windowType <= WindowManager.LayoutParams.LAST_SUB_WINDOW) {
diff --git a/services/java/com/android/server/ConsumerIrService.java b/services/java/com/android/server/ConsumerIrService.java
index 07f2a41..783dff1 100644
--- a/services/java/com/android/server/ConsumerIrService.java
+++ b/services/java/com/android/server/ConsumerIrService.java
@@ -39,6 +39,7 @@
 import android.util.Slog;
 import android.view.InputDevice;
 
+import java.lang.RuntimeException;
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.ListIterator;
@@ -65,8 +66,12 @@
         mWakeLock.setReferenceCounted(true);
 
         mHal = halOpen();
-        if (mHal == 0) {
-            Slog.w(TAG, "No IR HAL loaded");
+        if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CONSUMER_IR)) {
+            if (mHal == 0) {
+                throw new RuntimeException("FEATURE_CONSUMER_IR present, but no IR HAL loaded!");
+            }
+        } else if (mHal != 0) {
+            throw new RuntimeException("IR HAL present, but FEATURE_CONSUMER_IR is not set!");
         }
     }
 
diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
index 83e69d6f..ccac0d3 100644
--- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -1419,6 +1419,11 @@
                     Settings.Secure.TOUCH_EXPLORATION_ENABLED, enabled ? 1 : 0,
                     userState.mUserId);
         }
+        try {
+            mWindowManagerService.setTouchExplorationEnabled(enabled);
+        } catch (RemoteException e) {
+            e.printStackTrace();
+        }
     }
 
     private boolean canRequestAndRequestsTouchExplorationLocked(Service service) {
diff --git a/services/java/com/android/server/am/ActiveServices.java b/services/java/com/android/server/am/ActiveServices.java
index 27ca7a0..b69a0c8 100644
--- a/services/java/com/android/server/am/ActiveServices.java
+++ b/services/java/com/android/server/am/ActiveServices.java
@@ -25,6 +25,7 @@
 import java.util.List;
 
 import android.os.Handler;
+import android.os.Looper;
 import android.util.ArrayMap;
 import com.android.internal.app.ProcessStats;
 import com.android.internal.os.BatteryStatsImpl;
@@ -166,7 +167,8 @@
 
         static final int MSG_BG_START_TIMEOUT = 1;
 
-        ServiceMap(int userId) {
+        ServiceMap(Looper looper, int userId) {
+            super(looper);
             mUserId = userId;
         }
 
@@ -255,7 +257,7 @@
     private ServiceMap getServiceMap(int callingUser) {
         ServiceMap smap = mServiceMap.get(callingUser);
         if (smap == null) {
-            smap = new ServiceMap(callingUser);
+            smap = new ServiceMap(mAm.mHandler.getLooper(), callingUser);
             mServiceMap.put(callingUser, smap);
         }
         return smap;
@@ -2417,7 +2419,11 @@
             int[] users = mAm.getUsersLocked();
             if ("all".equals(name)) {
                 for (int user : users) {
-                    ArrayMap<ComponentName, ServiceRecord> alls = getServices(user);
+                    ServiceMap smap = mServiceMap.get(user);
+                    if (smap == null) {
+                        continue;
+                    }
+                    ArrayMap<ComponentName, ServiceRecord> alls = smap.mServicesByName;
                     for (int i=0; i<alls.size(); i++) {
                         ServiceRecord r1 = alls.valueAt(i);
                         services.add(r1);
@@ -2438,7 +2444,11 @@
                 }
 
                 for (int user : users) {
-                    ArrayMap<ComponentName, ServiceRecord> alls = getServices(user);
+                    ServiceMap smap = mServiceMap.get(user);
+                    if (smap == null) {
+                        continue;
+                    }
+                    ArrayMap<ComponentName, ServiceRecord> alls = smap.mServicesByName;
                     for (int i=0; i<alls.size(); i++) {
                         ServiceRecord r1 = alls.valueAt(i);
                         if (componentName != null) {
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index f23bcba..1987d04 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -226,7 +226,7 @@
     static final boolean DEBUG_RESULTS = localLOGV || false;
     static final boolean DEBUG_SERVICE = localLOGV || false;
     static final boolean DEBUG_SERVICE_EXECUTING = localLOGV || false;
-    static final boolean DEBUG_STACK = localLOGV || false;
+    static final boolean DEBUG_STACK = localLOGV || true;
     static final boolean DEBUG_SWITCH = localLOGV || false;
     static final boolean DEBUG_TASKS = localLOGV || false;
     static final boolean DEBUG_THUMBNAILS = localLOGV || false;
@@ -3193,6 +3193,7 @@
             if (task.userId == tr.userId
                     && ((task.affinity != null && task.affinity.equals(tr.affinity))
                     || (task.intent != null && task.intent.filterEquals(tr.intent)))) {
+                tr.disposeThumbnail();
                 mRecentTasks.remove(i);
                 i--;
                 N--;
@@ -3204,7 +3205,7 @@
             }
         }
         if (N >= MAX_RECENT_TASKS) {
-            mRecentTasks.remove(N-1);
+            mRecentTasks.remove(N-1).disposeThumbnail();
         }
         mRecentTasks.add(0, task);
     }
@@ -3464,7 +3465,8 @@
             clearProfilerLocked();
         }
 
-        mStackSupervisor.handleAppDiedLocked(app, restarting);
+        // Remove this application's activities from active lists.
+        boolean hasVisibleActivities = mStackSupervisor.handleAppDiedLocked(app, restarting);
 
         app.activities.clear();
 
@@ -3475,6 +3477,19 @@
             info.putString("shortMsg", "Process crashed.");
             finishInstrumentationLocked(app, Activity.RESULT_CANCELED, info);
         }
+
+        if (!restarting) {
+            if (!mStackSupervisor.resumeTopActivitiesLocked()) {
+                // If there was nothing to resume, and we are not already
+                // restarting this process, but there is a visible activity that
+                // is hosted by the process...  then make sure all visible
+                // activities are running, taking care of restarting this
+                // process.
+                if (hasVisibleActivities) {
+                    mStackSupervisor.ensureActivitiesVisibleLocked(null, 0);
+                }
+            }
+        }
     }
 
     private final int getLRURecordIndexForAppLocked(IApplicationThread thread) {
@@ -6738,6 +6753,7 @@
     }
 
     private void cleanUpRemovedTaskLocked(TaskRecord tr, int flags) {
+        tr.disposeThumbnail();
         mRecentTasks.remove(tr);
         mStackSupervisor.removeTask(tr);
         final boolean killProcesses = (flags&ActivityManager.REMOVE_TASK_KILL_PROCESS) != 0;
@@ -15818,9 +15834,11 @@
                     }
                 }
 
-                boolean haveActivities = mStackSupervisor.switchUserLocked(userId, uss);
-                if (!haveActivities) {
+                boolean homeInFront = mStackSupervisor.switchUserLocked(userId, uss);
+                if (homeInFront) {
                     startHomeActivityLocked(userId);
+                } else {
+                    mStackSupervisor.resumeTopActivitiesLocked();
                 }
 
                 EventLogTags.writeAmSwitchUser(userId);
@@ -16146,6 +16164,8 @@
             } catch (RemoteException e) {
             }
         }
+
+        mStackSupervisor.removeUserLocked(userId);
     }
 
     @Override
diff --git a/services/java/com/android/server/am/ActivityRecord.java b/services/java/com/android/server/am/ActivityRecord.java
index 2c0b83b..cf686672 100644
--- a/services/java/com/android/server/am/ActivityRecord.java
+++ b/services/java/com/android/server/am/ActivityRecord.java
@@ -572,8 +572,8 @@
     }
 
     boolean isRootActivity() {
-        ArrayList<ActivityRecord> activities = task.mActivities;
-        return activities.size() == 0 || this == task.mActivities.get(0);
+        final ArrayList<ActivityRecord> activities = task.mActivities;
+        return activities.size() == 0 || this == activities.get(0);
     }
 
     UriPermissionOwner getUriPermissionsLocked() {
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 45b30f1..fc83f05 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -549,31 +549,26 @@
 
     /*
      * Move the activities around in the stack to bring a user to the foreground.
-     * @return whether there are any activities for the specified user.
      */
-    final boolean switchUserLocked(int userId) {
+    final void switchUserLocked(int userId) {
         if (VALIDATE_TOKENS) {
             validateAppTokensLocked();
         }
         if (mCurrentUser == userId) {
-            return true;
+            return;
         }
         mCurrentUser = userId;
 
         // Move userId's tasks to the top.
-        boolean haveActivities = false;
         int index = mTaskHistory.size();
         for (int i = 0; i < index; ++i) {
             TaskRecord task = mTaskHistory.get(i);
             if (task.userId == userId) {
-                haveActivities = true;
                 mTaskHistory.remove(i);
                 mTaskHistory.add(task);
                 --index;
             }
         }
-
-        return haveActivities;
     }
 
     void minimalResumeActivityLocked(ActivityRecord r) {
@@ -678,6 +673,14 @@
             return null;
         }
 
+        TaskRecord tr = who.task;
+        if (tr.intent != null && (tr.intent.getFlags()
+                &Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) != 0) {
+            // If this task is being excluded from recents, we don't want to take
+            // the expense of capturing a thumbnail, since we will never show it.
+            return null;
+        }
+
         Resources res = mService.mContext.getResources();
         int w = mThumbnailWidth;
         int h = mThumbnailHeight;
@@ -690,6 +693,7 @@
 
         if (w > 0) {
             if (who != mLastScreenshotActivity || mLastScreenshotBitmap == null
+                    || mLastScreenshotActivity.state == ActivityState.RESUMED
                     || mLastScreenshotBitmap.getWidth() != w
                     || mLastScreenshotBitmap.getHeight() != h) {
                 mLastScreenshotActivity = who;
@@ -1092,7 +1096,7 @@
                         int rIndex = task.mActivities.indexOf(r);
                         for ( --rIndex; rIndex >= 0; --rIndex) {
                             final ActivityRecord blocker = task.mActivities.get(rIndex);
-                            if (!blocker.finishing && blocker.visible) {
+                            if (!blocker.finishing) {
                                 if (DEBUG_VISBILITY) Slog.v(TAG, "Home visibility for " +
                                         r + " blocked by " + blocker);
                                 break;
@@ -1623,6 +1627,12 @@
     }
 
     private void insertTaskAtTop(TaskRecord task) {
+        // If this is being moved to the top by another activity or being launched from the home
+        // activity, set mOnTopOfHome accordingly.
+        final boolean fromHome = mStackSupervisor.getLastStack().isHomeStack();
+        if (!isHomeStack() && (fromHome || topTask() != task)) {
+            task.mOnTopOfHome = fromHome;
+        }
         mTaskHistory.remove(task);
         // Now put task at top.
         int stackNdx = mTaskHistory.size();
@@ -3421,13 +3431,9 @@
     /**
      * Reset local parameters because an app's activity died.
      * @param app The app of the activity that died.
-     * @return true if home should be launched next.
+     * @return result from removeHistoryRecordsForAppLocked.
      */
     boolean handleAppDiedLocked(ProcessRecord app) {
-        if (!containsApp(app)) {
-            return false;
-        }
-
         if (mPausingActivity != null && mPausingActivity.app == app) {
             if (DEBUG_PAUSE || DEBUG_CLEANUP) Slog.v(TAG,
                     "App died while pausing: " + mPausingActivity);
@@ -3438,30 +3444,7 @@
             mLastNoHistoryActivity = null;
         }
 
-        // Determine if the top task is exiting and should return to home. Do this before it gets
-        // removed in removeHistoryRecordsForAppsLocked.
-        boolean launchHomeNext = false;
-        TaskRecord topTask = mTaskHistory.get(mTaskHistory.size() - 1);
-        ArrayList<ActivityRecord> activities = topTask.mActivities;
-        int activityNdx;
-        for (activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
-            ActivityRecord r = activities.get(activityNdx);
-            if (r.finishing) {
-                continue;
-            }
-            if (r.app != app) {
-                // This is the dying activity.
-                break;
-            }
-        }
-        if (activityNdx < 0) {
-            // All activities in task belong to app. Set launchHomeNext to task's value.
-            launchHomeNext = topTask.mOnTopOfHome;
-        }
-
-        removeHistoryRecordsForAppLocked(app);
-
-        return launchHomeNext;
+        return removeHistoryRecordsForAppLocked(app);
     }
 
     void handleAppCrashLocked(ProcessRecord app) {
diff --git a/services/java/com/android/server/am/ActivityStackSupervisor.java b/services/java/com/android/server/am/ActivityStackSupervisor.java
index 2b69a4e..b4de258 100644
--- a/services/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/java/com/android/server/am/ActivityStackSupervisor.java
@@ -70,6 +70,7 @@
 import android.util.Slog;
 import android.util.SparseArray;
 
+import android.util.SparseBooleanArray;
 import com.android.internal.app.HeavyWeightSwitcherActivity;
 import com.android.internal.os.TransferPipe;
 import com.android.server.am.ActivityManagerService.PendingActivityLaunch;
@@ -203,6 +204,9 @@
      */
     final PowerManager.WakeLock mGoingToSleep;
 
+    /** State of the stacks when user switched, indexed by userId. */
+    SparseBooleanArray mUserHomeInFront = new SparseBooleanArray(2);
+
     public ActivityStackSupervisor(ActivityManagerService service, Context context,
             Looper looper) {
         mService = service;
@@ -288,22 +292,6 @@
         return mService.startHomeActivityLocked(mCurrentUser);
     }
 
-    final void setLaunchHomeTaskNextFlag(ActivityRecord sourceRecord, ActivityRecord r,
-            ActivityStack stack) {
-        if (stack == mHomeStack) {
-            return;
-        }
-        if ((sourceRecord == null && getLastStack() == mHomeStack) ||
-                (sourceRecord != null && sourceRecord.isHomeActivity())) {
-            if (r == null) {
-                r = stack.topRunningActivityLocked(null);
-            }
-            if (r != null && !r.isHomeActivity() && r.isRootActivity()) {
-                r.task.mOnTopOfHome = true;
-            }
-        }
-    }
-
     void setDismissKeyguard(boolean dismiss) {
         if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen(" dismiss=" + dismiss);
         mDismissKeyguardOnNextActivity = dismiss;
@@ -1479,7 +1467,6 @@
                         // is the case, so this is it!  And for paranoia, make
                         // sure we have correctly resumed the top activity.
                         if (doResume) {
-                            setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
                             resumeTopActivitiesLocked(targetStack, null, options);
                         } else {
                             ActivityOptions.abort(options);
@@ -1575,9 +1562,6 @@
                         // don't use that intent!)  And for paranoia, make
                         // sure we have correctly resumed the top activity.
                         if (doResume) {
-                            // Reset flag so it gets correctly reevaluated.
-                            intentActivity.task.mOnTopOfHome = false;
-                            setLaunchHomeTaskNextFlag(sourceRecord, intentActivity, targetStack);
                             targetStack.resumeTopActivityLocked(null, options);
                         } else {
                             ActivityOptions.abort(options);
@@ -1615,7 +1599,6 @@
                             // resumed the top activity.
                             topStack.mLastPausedActivity = null;
                             if (doResume) {
-                                setLaunchHomeTaskNextFlag(sourceRecord, null, topStack);
                                 resumeTopActivitiesLocked();
                             }
                             ActivityOptions.abort(options);
@@ -1694,7 +1677,6 @@
                     // resumed the top activity.
                     targetStack.mLastPausedActivity = null;
                     if (doResume) {
-                        setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
                         targetStack.resumeTopActivityLocked(null);
                     }
                     ActivityOptions.abort(options);
@@ -1717,7 +1699,6 @@
                     top.deliverNewIntentLocked(callingUid, r.intent);
                     targetStack.mLastPausedActivity = null;
                     if (doResume) {
-                        setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
                         targetStack.resumeTopActivityLocked(null);
                     }
                     return ActivityManager.START_DELIVERED_TO_TOP;
@@ -1751,7 +1732,6 @@
             EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId);
         }
         ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
-        setLaunchHomeTaskNextFlag(sourceRecord, r, targetStack);
         targetStack.mLastPausedActivity = null;
         targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options);
         mService.setFocusedActivityLocked(r);
@@ -1926,30 +1906,12 @@
         return r;
     }
 
-    void handleAppDiedLocked(ProcessRecord app, boolean restarting) {
-        boolean launchHomeTaskNext = false;
-        final ActivityStack focusedStack = getFocusedStack();
-        final int numStacks = mStacks.size();
-        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
-            final ActivityStack stack = mStacks.get(stackNdx);
-            // Only update launchHomeTaskNext for the focused stack.
-            launchHomeTaskNext |= (stack.handleAppDiedLocked(app) && stack == focusedStack);
+    boolean handleAppDiedLocked(ProcessRecord app, boolean restarting) {
+        boolean hasVisibleActivities = false;
+        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
+            hasVisibleActivities |= mStacks.get(stackNdx).handleAppDiedLocked(app);
         }
-
-        if (!restarting) {
-            if (launchHomeTaskNext) {
-                resumeHomeActivity(null);
-            } else {
-                if (!resumeTopActivitiesLocked(focusedStack, null, null)) {
-                    // If there was nothing to resume, and we are not already
-                    // restarting this process, but there is a visible activity that
-                    // is hosted by the process...  then make sure all visible
-                    // activities are running, taking care of restarting this
-                    // process.
-                    ensureActivitiesVisibleLocked(null, 0);
-                }
-            }
-        }
+        return hasVisibleActivities;
     }
 
     void closeSystemDialogsLocked() {
@@ -1960,6 +1922,10 @@
         }
     }
 
+    void removeUserLocked(int userId) {
+        mUserHomeInFront.delete(userId);
+    }
+
     /**
      * @return true if some activity was finished (or would have finished if doit were true).
      */
@@ -2278,17 +2244,17 @@
     }
 
     boolean switchUserLocked(int userId, UserStartedState uss) {
+        mUserHomeInFront.put(mCurrentUser, isFrontStack(mHomeStack));
+        final boolean homeInFront = mUserHomeInFront.get(userId, true);
         mCurrentUser = userId;
 
         mStartingUsers.add(uss);
-        boolean haveActivities = false;
         for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
-            haveActivities |= mStacks.get(stackNdx).switchUserLocked(userId);
+            mStacks.get(stackNdx).switchUserLocked(userId);
         }
 
-        resumeTopActivitiesLocked();
-
-        return haveActivities;
+        moveHomeStack(homeInFront);
+        return homeInFront;
     }
 
     final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) {
@@ -2381,6 +2347,7 @@
         pw.print(prefix); pw.print("mStackState="); pw.println(stackStateToString(mStackState));
         pw.print(prefix); pw.println("mSleepTimeout: " + mSleepTimeout);
         pw.print(prefix); pw.println("mCurTaskId: " + mCurTaskId);
+        pw.print(prefix); pw.println("mUserHomeInFront: " + mUserHomeInFront);
     }
 
     ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
diff --git a/services/java/com/android/server/am/TaskRecord.java b/services/java/com/android/server/am/TaskRecord.java
index 385253e..3d568ff 100644
--- a/services/java/com/android/server/am/TaskRecord.java
+++ b/services/java/com/android/server/am/TaskRecord.java
@@ -128,6 +128,16 @@
         }
     }
 
+    void disposeThumbnail() {
+        super.disposeThumbnail();
+        for (int i=mActivities.size()-1; i>=0; i--) {
+            ThumbnailHolder thumb = mActivities.get(i).thumbHolder;
+            if (thumb != this) {
+                thumb.disposeThumbnail();
+            }
+        }
+    }
+
     ActivityRecord getTopActivity() {
         for (int i = mActivities.size() - 1; i >= 0; --i) {
             final ActivityRecord r = mActivities.get(i);
diff --git a/services/java/com/android/server/am/ThumbnailHolder.java b/services/java/com/android/server/am/ThumbnailHolder.java
index 02f4fcb..a6974f5 100644
--- a/services/java/com/android/server/am/ThumbnailHolder.java
+++ b/services/java/com/android/server/am/ThumbnailHolder.java
@@ -21,4 +21,9 @@
 public class ThumbnailHolder {
     Bitmap lastThumbnail;         // Last thumbnail captured for this item.
     CharSequence lastDescription; // Last description captured for this item.
+
+    void disposeThumbnail() {
+        lastThumbnail = null;
+        lastDescription = null;
+    }
 }
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index f093f2b..fb6e9edc 100755
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -383,13 +383,12 @@
     // All available services, for your resolving pleasure.
     final ServiceIntentResolver mServices = new ServiceIntentResolver();
 
-    // Keys are String (provider class name), values are Provider.
-    final HashMap<ComponentName, PackageParser.Provider> mProvidersByComponent =
-            new HashMap<ComponentName, PackageParser.Provider>();
+    // All available providers, for your resolving pleasure.
+    final ProviderIntentResolver mProviders = new ProviderIntentResolver();
 
     // Mapping from provider base names (first directory in content URI codePath)
     // to the provider information.
-    final HashMap<String, PackageParser.Provider> mProviders =
+    final HashMap<String, PackageParser.Provider> mProvidersByAuthority =
             new HashMap<String, PackageParser.Provider>();
 
     // Mapping from instrumentation class names to info about them.
@@ -850,6 +849,19 @@
                                 sendPackageBroadcast(Intent.ACTION_MY_PACKAGE_REPLACED,
                                         null, null,
                                         res.pkg.applicationInfo.packageName, null, updateUsers);
+
+                                // treat asec-hosted packages like removable media on upgrade
+                                if (isForwardLocked(res.pkg) || isExternal(res.pkg)) {
+                                    if (DEBUG_INSTALL) {
+                                        Slog.i(TAG, "upgrading pkg " + res.pkg
+                                                + " is ASEC-hosted -> AVAILABLE");
+                                    }
+                                    int[] uidArray = new int[] { res.pkg.applicationInfo.uid };
+                                    ArrayList<String> pkgList = new ArrayList<String>(1);
+                                    pkgList.add(res.pkg.applicationInfo.packageName);
+                                    sendResourcesChangedBroadcast(true, false,
+                                            pkgList,uidArray, null);
+                                }
                             }
                             if (res.removedInfo.args != null) {
                                 // Remove the replaced package's older resources safely now
@@ -2082,7 +2094,7 @@
         if (!sUserManager.exists(userId)) return null;
         enforceCrossUserPermission(Binder.getCallingUid(), userId, false, "get provider info");
         synchronized (mPackages) {
-            PackageParser.Provider p = mProvidersByComponent.get(component);
+            PackageParser.Provider p = mProviders.mProviders.get(component);
             if (DEBUG_PACKAGE_INFO) Log.v(
                 TAG, "getProviderInfo " + component + ": " + p);
             if (p != null && mSettings.isEnabledLPr(p.info, flags, userId)) {
@@ -3108,6 +3120,43 @@
     }
 
     @Override
+    public List<ResolveInfo> queryIntentContentProviders(
+            Intent intent, String resolvedType, int flags, int userId) {
+        if (!sUserManager.exists(userId)) return Collections.emptyList();
+        ComponentName comp = intent.getComponent();
+        if (comp == null) {
+            if (intent.getSelector() != null) {
+                intent = intent.getSelector();
+                comp = intent.getComponent();
+            }
+        }
+        if (comp != null) {
+            final List<ResolveInfo> list = new ArrayList<ResolveInfo>(1);
+            final ProviderInfo pi = getProviderInfo(comp, flags, userId);
+            if (pi != null) {
+                final ResolveInfo ri = new ResolveInfo();
+                ri.providerInfo = pi;
+                list.add(ri);
+            }
+            return list;
+        }
+
+        // reader
+        synchronized (mPackages) {
+            String pkgName = intent.getPackage();
+            if (pkgName == null) {
+                return mProviders.queryIntent(intent, resolvedType, flags, userId);
+            }
+            final PackageParser.Package pkg = mPackages.get(pkgName);
+            if (pkg != null) {
+                return mProviders.queryIntentForPackage(
+                        intent, resolvedType, flags, pkg.providers, userId);
+            }
+            return null;
+        }
+    }
+
+    @Override
     public ParceledListSlice<PackageInfo> getInstalledPackages(int flags, int userId) {
         final boolean listUninstalled = (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0;
 
@@ -3280,7 +3329,7 @@
         if (!sUserManager.exists(userId)) return null;
         // reader
         synchronized (mPackages) {
-            final PackageParser.Provider provider = mProviders.get(name);
+            final PackageParser.Provider provider = mProvidersByAuthority.get(name);
             PackageSetting ps = provider != null
                     ? mSettings.mPackages.get(provider.owner.packageName)
                     : null;
@@ -3301,8 +3350,8 @@
     public void querySyncProviders(List<String> outNames, List<ProviderInfo> outInfo) {
         // reader
         synchronized (mPackages) {
-            final Iterator<Map.Entry<String, PackageParser.Provider>> i = mProviders.entrySet()
-                    .iterator();
+            final Iterator<Map.Entry<String, PackageParser.Provider>> i = mProvidersByAuthority
+                    .entrySet().iterator();
             final int userId = UserHandle.getCallingUserId();
             while (i.hasNext()) {
                 Map.Entry<String, PackageParser.Provider> entry = i.next();
@@ -3328,7 +3377,7 @@
         ArrayList<ProviderInfo> finalList = null;
         // reader
         synchronized (mPackages) {
-            final Iterator<PackageParser.Provider> i = mProvidersByComponent.values().iterator();
+            final Iterator<PackageParser.Provider> i = mProviders.mProviders.values().iterator();
             final int userId = processName != null ?
                     UserHandle.getUserId(uid) : UserHandle.getCallingUserId();
             while (i.hasNext()) {
@@ -4300,8 +4349,8 @@
                     if (p.info.authority != null) {
                         String names[] = p.info.authority.split(";");
                         for (int j = 0; j < names.length; j++) {
-                            if (mProviders.containsKey(names[j])) {
-                                PackageParser.Provider other = mProviders.get(names[j]);
+                            if (mProvidersByAuthority.containsKey(names[j])) {
+                                PackageParser.Provider other = mProvidersByAuthority.get(names[j]);
                                 Slog.w(TAG, "Can't install because provider name " + names[j] +
                                         " (in package " + pkg.applicationInfo.packageName +
                                         ") is already used by "
@@ -4643,6 +4692,20 @@
         // so that we do not end up in a confused state while the user is still using the older
         // version of the application while the new one gets installed.
         if ((parseFlags & PackageManager.INSTALL_REPLACE_EXISTING) != 0) {
+            // If the package lives in an asec, tell everyone that the container is going
+            // away so they can clean up any references to its resources (which would prevent
+            // vold from being able to unmount the asec)
+            if (isForwardLocked(pkg) || isExternal(pkg)) {
+                if (DEBUG_INSTALL) {
+                    Slog.i(TAG, "upgrading pkg " + pkg + " is ASEC-hosted -> UNAVAILABLE");
+                }
+                final int[] uidArray = new int[] { pkg.applicationInfo.uid };
+                final ArrayList<String> pkgList = new ArrayList<String>(1);
+                pkgList.add(pkg.applicationInfo.packageName);
+                sendResourcesChangedBroadcast(false, true, pkgList, uidArray, null);
+            }
+
+            // Post the request that it be killed now that the going-away broadcast is en route
             killApplication(pkg.applicationInfo.packageName,
                         pkg.applicationInfo.uid, "update pkg");
         }
@@ -4718,8 +4781,7 @@
                 PackageParser.Provider p = pkg.providers.get(i);
                 p.info.processName = fixProcessName(pkg.applicationInfo.processName,
                         p.info.processName, pkg.applicationInfo.uid);
-                mProvidersByComponent.put(new ComponentName(p.info.packageName,
-                        p.info.name), p);
+                mProviders.addProvider(p);
                 p.syncable = p.info.isSyncable;
                 if (p.info.authority != null) {
                     String names[] = p.info.authority.split(";");
@@ -4736,8 +4798,8 @@
                             p = new PackageParser.Provider(p);
                             p.syncable = false;
                         }
-                        if (!mProviders.containsKey(names[j])) {
-                            mProviders.put(names[j], p);
+                        if (!mProvidersByAuthority.containsKey(names[j])) {
+                            mProvidersByAuthority.put(names[j], p);
                             if (p.info.authority == null) {
                                 p.info.authority = names[j];
                             } else {
@@ -4750,7 +4812,7 @@
                                             + p.info.isSyncable);
                             }
                         } else {
-                            PackageParser.Provider other = mProviders.get(names[j]);
+                            PackageParser.Provider other = mProvidersByAuthority.get(names[j]);
                             Slog.w(TAG, "Skipping provider name " + names[j] +
                                     " (in package " + pkg.applicationInfo.packageName +
                                     "): name already used by "
@@ -5081,8 +5143,7 @@
         int i;
         for (i=0; i<N; i++) {
             PackageParser.Provider p = pkg.providers.get(i);
-            mProvidersByComponent.remove(new ComponentName(p.info.packageName,
-                    p.info.name));
+            mProviders.removeProvider(p);
             if (p.info.authority == null) {
 
                 /* There was another ContentProvider with this authority when
@@ -5093,8 +5154,8 @@
             }
             String names[] = p.info.authority.split(";");
             for (int j = 0; j < names.length; j++) {
-                if (mProviders.get(names[j]) == p) {
-                    mProviders.remove(names[j]);
+                if (mProvidersByAuthority.get(names[j]) == p) {
+                    mProvidersByAuthority.remove(names[j]);
                     if (DEBUG_REMOVE) {
                         if (chatty)
                             Log.d(TAG, "Unregistered content provider: " + names[j]
@@ -5935,6 +5996,195 @@
         private int mFlags;
     };
 
+    private final class ProviderIntentResolver
+            extends IntentResolver<PackageParser.ProviderIntentInfo, ResolveInfo> {
+        public List<ResolveInfo> queryIntent(Intent intent, String resolvedType,
+                boolean defaultOnly, int userId) {
+            mFlags = defaultOnly ? PackageManager.MATCH_DEFAULT_ONLY : 0;
+            return super.queryIntent(intent, resolvedType, defaultOnly, userId);
+        }
+
+        public List<ResolveInfo> queryIntent(Intent intent, String resolvedType, int flags,
+                int userId) {
+            if (!sUserManager.exists(userId))
+                return null;
+            mFlags = flags;
+            return super.queryIntent(intent, resolvedType,
+                    (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, userId);
+        }
+
+        public List<ResolveInfo> queryIntentForPackage(Intent intent, String resolvedType,
+                int flags, ArrayList<PackageParser.Provider> packageProviders, int userId) {
+            if (!sUserManager.exists(userId))
+                return null;
+            if (packageProviders == null) {
+                return null;
+            }
+            mFlags = flags;
+            final boolean defaultOnly = (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0;
+            final int N = packageProviders.size();
+            ArrayList<PackageParser.ProviderIntentInfo[]> listCut =
+                    new ArrayList<PackageParser.ProviderIntentInfo[]>(N);
+
+            ArrayList<PackageParser.ProviderIntentInfo> intentFilters;
+            for (int i = 0; i < N; ++i) {
+                intentFilters = packageProviders.get(i).intents;
+                if (intentFilters != null && intentFilters.size() > 0) {
+                    PackageParser.ProviderIntentInfo[] array =
+                            new PackageParser.ProviderIntentInfo[intentFilters.size()];
+                    intentFilters.toArray(array);
+                    listCut.add(array);
+                }
+            }
+            return super.queryIntentFromList(intent, resolvedType, defaultOnly, listCut, userId);
+        }
+
+        public final void addProvider(PackageParser.Provider p) {
+            mProviders.put(p.getComponentName(), p);
+            if (DEBUG_SHOW_INFO) {
+                Log.v(TAG, "  "
+                        + (p.info.nonLocalizedLabel != null
+                                ? p.info.nonLocalizedLabel : p.info.name) + ":");
+                Log.v(TAG, "    Class=" + p.info.name);
+            }
+            final int NI = p.intents.size();
+            int j;
+            for (j = 0; j < NI; j++) {
+                PackageParser.ProviderIntentInfo intent = p.intents.get(j);
+                if (DEBUG_SHOW_INFO) {
+                    Log.v(TAG, "    IntentFilter:");
+                    intent.dump(new LogPrinter(Log.VERBOSE, TAG), "      ");
+                }
+                if (!intent.debugCheck()) {
+                    Log.w(TAG, "==> For Provider " + p.info.name);
+                }
+                addFilter(intent);
+            }
+        }
+
+        public final void removeProvider(PackageParser.Provider p) {
+            mProviders.remove(p.getComponentName());
+            if (DEBUG_SHOW_INFO) {
+                Log.v(TAG, "  " + (p.info.nonLocalizedLabel != null
+                        ? p.info.nonLocalizedLabel : p.info.name) + ":");
+                Log.v(TAG, "    Class=" + p.info.name);
+            }
+            final int NI = p.intents.size();
+            int j;
+            for (j = 0; j < NI; j++) {
+                PackageParser.ProviderIntentInfo intent = p.intents.get(j);
+                if (DEBUG_SHOW_INFO) {
+                    Log.v(TAG, "    IntentFilter:");
+                    intent.dump(new LogPrinter(Log.VERBOSE, TAG), "      ");
+                }
+                removeFilter(intent);
+            }
+        }
+
+        @Override
+        protected boolean allowFilterResult(
+                PackageParser.ProviderIntentInfo filter, List<ResolveInfo> dest) {
+            ProviderInfo filterPi = filter.provider.info;
+            for (int i = dest.size() - 1; i >= 0; i--) {
+                ProviderInfo destPi = dest.get(i).providerInfo;
+                if (destPi.name == filterPi.name
+                        && destPi.packageName == filterPi.packageName) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        @Override
+        protected PackageParser.ProviderIntentInfo[] newArray(int size) {
+            return new PackageParser.ProviderIntentInfo[size];
+        }
+
+        @Override
+        protected boolean isFilterStopped(PackageParser.ProviderIntentInfo filter, int userId) {
+            if (!sUserManager.exists(userId))
+                return true;
+            PackageParser.Package p = filter.provider.owner;
+            if (p != null) {
+                PackageSetting ps = (PackageSetting) p.mExtras;
+                if (ps != null) {
+                    // System apps are never considered stopped for purposes of
+                    // filtering, because there may be no way for the user to
+                    // actually re-launch them.
+                    return (ps.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0
+                            && ps.getStopped(userId);
+                }
+            }
+            return false;
+        }
+
+        @Override
+        protected boolean isPackageForFilter(String packageName,
+                PackageParser.ProviderIntentInfo info) {
+            return packageName.equals(info.provider.owner.packageName);
+        }
+
+        @Override
+        protected ResolveInfo newResult(PackageParser.ProviderIntentInfo filter,
+                int match, int userId) {
+            if (!sUserManager.exists(userId))
+                return null;
+            final PackageParser.ProviderIntentInfo info = filter;
+            if (!mSettings.isEnabledLPr(info.provider.info, mFlags, userId)) {
+                return null;
+            }
+            final PackageParser.Provider provider = info.provider;
+            if (mSafeMode && (provider.info.applicationInfo.flags
+                    & ApplicationInfo.FLAG_SYSTEM) == 0) {
+                return null;
+            }
+            PackageSetting ps = (PackageSetting) provider.owner.mExtras;
+            if (ps == null) {
+                return null;
+            }
+            ProviderInfo pi = PackageParser.generateProviderInfo(provider, mFlags,
+                    ps.readUserState(userId), userId);
+            if (pi == null) {
+                return null;
+            }
+            final ResolveInfo res = new ResolveInfo();
+            res.providerInfo = pi;
+            if ((mFlags & PackageManager.GET_RESOLVED_FILTER) != 0) {
+                res.filter = filter;
+            }
+            res.priority = info.getPriority();
+            res.preferredOrder = provider.owner.mPreferredOrder;
+            res.match = match;
+            res.isDefault = info.hasDefault;
+            res.labelRes = info.labelRes;
+            res.nonLocalizedLabel = info.nonLocalizedLabel;
+            res.icon = info.icon;
+            res.system = isSystemApp(res.providerInfo.applicationInfo);
+            return res;
+        }
+
+        @Override
+        protected void sortResults(List<ResolveInfo> results) {
+            Collections.sort(results, mResolvePrioritySorter);
+        }
+
+        @Override
+        protected void dumpFilter(PrintWriter out, String prefix,
+                PackageParser.ProviderIntentInfo filter) {
+            out.print(prefix);
+            out.print(
+                    Integer.toHexString(System.identityHashCode(filter.provider)));
+            out.print(' ');
+            filter.provider.printComponentShortName(out);
+            out.print(" filter ");
+            out.println(Integer.toHexString(System.identityHashCode(filter)));
+        }
+
+        private final HashMap<ComponentName, PackageParser.Provider> mProviders
+                = new HashMap<ComponentName, PackageParser.Provider>();
+        private int mFlags;
+    };
+
     private static final Comparator<ResolveInfo> mResolvePrioritySorter =
             new Comparator<ResolveInfo>() {
         public int compare(ResolveInfo r1, ResolveInfo r2) {
@@ -9120,6 +9370,17 @@
         }
     }
 
+    boolean locationIsPrivileged(File path) {
+        try {
+            final String privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app")
+                    .getCanonicalPath();
+            return path.getCanonicalPath().startsWith(privilegedAppDir);
+        } catch (IOException e) {
+            Slog.e(TAG, "Unable to access code path " + path);
+        }
+        return false;
+    }
+
     /*
      * Tries to delete system package.
      */
@@ -9175,9 +9436,12 @@
         }
         // Install the system package
         if (DEBUG_REMOVE) Slog.d(TAG, "Re-installing system package: " + disabledPs);
+        int parseFlags = PackageParser.PARSE_MUST_BE_APK | PackageParser.PARSE_IS_SYSTEM;
+        if (locationIsPrivileged(disabledPs.codePath)) {
+            parseFlags |= PackageParser.PARSE_IS_PRIVILEGED;
+        }
         PackageParser.Package newPkg = scanPackageLI(disabledPs.codePath,
-                PackageParser.PARSE_MUST_BE_APK | PackageParser.PARSE_IS_SYSTEM,
-                SCAN_MONITOR | SCAN_NO_PATHS, 0, null);
+                parseFlags, SCAN_MONITOR | SCAN_NO_PATHS, 0, null);
 
         if (newPkg == null) {
             Slog.w(TAG, "Failed to restore system package:" + newPs.name
@@ -10413,6 +10677,11 @@
                         dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) {
                     dumpState.setTitlePrinted(true);
                 }
+                if (mProviders.dump(pw, dumpState.getTitlePrinted() ? "\nProvider Resolver Table:"
+                        : "Provider Resolver Table:", "  ", packageName,
+                        dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) {
+                    dumpState.setTitlePrinted(true);
+                }
             }
 
             if (dumpState.isDumping(DumpState.DUMP_PREFERRED)) {
@@ -10457,7 +10726,7 @@
 
             if (dumpState.isDumping(DumpState.DUMP_PROVIDERS)) {
                 boolean printedSomething = false;
-                for (PackageParser.Provider p : mProvidersByComponent.values()) {
+                for (PackageParser.Provider p : mProviders.mProviders.values()) {
                     if (packageName != null && !packageName.equals(p.info.packageName)) {
                         continue;
                     }
@@ -10471,7 +10740,8 @@
                     pw.print("    "); pw.println(p.toString());
                 }
                 printedSomething = false;
-                for (Map.Entry<String, PackageParser.Provider> entry : mProviders.entrySet()) {
+                for (Map.Entry<String, PackageParser.Provider> entry :
+                        mProvidersByAuthority.entrySet()) {
                     PackageParser.Provider p = entry.getValue();
                     if (packageName != null && !packageName.equals(p.info.packageName)) {
                         continue;
@@ -10731,8 +11001,8 @@
         }
     }
 
-   private void sendResourcesChangedBroadcast(boolean mediaStatus, ArrayList<String> pkgList,
-            int uidArr[], IIntentReceiver finishedReceiver) {
+   private void sendResourcesChangedBroadcast(boolean mediaStatus, boolean replacing,
+           ArrayList<String> pkgList, int uidArr[], IIntentReceiver finishedReceiver) {
         int size = pkgList.size();
         if (size > 0) {
             // Send broadcasts here
@@ -10742,6 +11012,9 @@
             if (uidArr != null) {
                 extras.putIntArray(Intent.EXTRA_CHANGED_UID_LIST, uidArr);
             }
+            if (replacing && !mediaStatus) {
+                extras.putBoolean(Intent.EXTRA_REPLACING, replacing);
+            }
             String action = mediaStatus ? Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE
                     : Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;
             sendPackageBroadcast(action, null, extras, null, finishedReceiver, null);
@@ -10844,7 +11117,7 @@
         }
         // Send a broadcast to let everyone know we are done processing
         if (pkgList.size() > 0) {
-            sendResourcesChangedBroadcast(true, pkgList, uidArr, null);
+            sendResourcesChangedBroadcast(true, false, pkgList, uidArr, null);
         }
         // Force gc to avoid any stale parser references that we might have.
         if (doGc) {
@@ -10921,7 +11194,8 @@
         // broadcast when packages get disabled, force a gc to clean things up.
         // and unload all the containers.
         if (pkgList.size() > 0) {
-            sendResourcesChangedBroadcast(false, pkgList, uidArr, new IIntentReceiver.Stub() {
+            sendResourcesChangedBroadcast(false, false, pkgList, uidArr,
+                    new IIntentReceiver.Stub() {
                 public void performReceive(Intent intent, int resultCode, String data,
                         Bundle extras, boolean ordered, boolean sticky,
                         int sendingUser) throws RemoteException {
@@ -11041,7 +11315,7 @@
                     }
                     if (returnCode == PackageManager.MOVE_SUCCEEDED) {
                         // Send resources unavailable broadcast
-                        sendResourcesChangedBroadcast(false, pkgList, uidArr, null);
+                        sendResourcesChangedBroadcast(false, true, pkgList, uidArr, null);
                         // Update package code and resource paths
                         synchronized (mInstallLock) {
                             synchronized (mPackages) {
@@ -11119,7 +11393,7 @@
                             }
                         }
                         // Send resources available broadcast
-                        sendResourcesChangedBroadcast(true, pkgList, uidArr, null);
+                        sendResourcesChangedBroadcast(true, false, pkgList, uidArr, null);
                     }
                 }
                 if (returnCode != PackageManager.MOVE_SUCCEEDED) {
diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java
index 3b0ee24..b3f0036 100644
--- a/services/java/com/android/server/print/UserState.java
+++ b/services/java/com/android/server/print/UserState.java
@@ -205,6 +205,10 @@
         for (int i = 0; i < cachedPrintJobCount; i++) {
             PrintJobInfo cachedPrintJob = cachedPrintJobs.get(i);
             result.put(cachedPrintJob.getId(), cachedPrintJob);
+            // Strip out the tag - it is visible only to print services.
+            // Also the cached print jobs are delivered only to apps, so
+            // stripping the tag of a cached print job is fine.
+            cachedPrintJob.setTag(null);
         }
 
         // Add everything else the spooler knows about.
@@ -215,6 +219,8 @@
             for (int i = 0; i < printJobCount; i++) {
                 PrintJobInfo printJob = printJobs.get(i);
                 result.put(printJob.getId(), printJob);
+                // Strip out the tag - it is visible only to print services.
+                printJob.setTag(null);
             }
         }
 
diff --git a/services/java/com/android/server/wm/DisplayContent.java b/services/java/com/android/server/wm/DisplayContent.java
index 2798104..afa4f78 100644
--- a/services/java/com/android/server/wm/DisplayContent.java
+++ b/services/java/com/android/server/wm/DisplayContent.java
@@ -24,6 +24,7 @@
 import android.app.ActivityManager.StackBoxInfo;
 import android.graphics.Rect;
 import android.graphics.Region;
+import android.os.Debug;
 import android.util.Slog;
 import android.view.Display;
 import android.view.DisplayInfo;
@@ -322,7 +323,8 @@
      * @return true if a change was made, false otherwise.
      */
     boolean moveHomeStackBox(boolean toTop) {
-        if (DEBUG_STACK) Slog.d(TAG, "moveHomeStackBox: toTop=" + toTop);
+        if (DEBUG_STACK) Slog.d(TAG, "moveHomeStackBox: toTop=" + toTop + " Callers=" +
+                Debug.getCallers(4));
         switch (mStackBoxes.size()) {
             case 0: throw new RuntimeException("moveHomeStackBox: No home StackBox!");
             case 1: return false; // Only the home StackBox exists.
diff --git a/services/java/com/android/server/wm/FocusedStackFrame.java b/services/java/com/android/server/wm/FocusedStackFrame.java
index 365b277..cc48b86 100644
--- a/services/java/com/android/server/wm/FocusedStackFrame.java
+++ b/services/java/com/android/server/wm/FocusedStackFrame.java
@@ -63,7 +63,7 @@
     }
 
     private void draw(Rect bounds, int color) {
-        if (DEBUG_STACK) Slog.i(TAG, "draw: bounds=" + bounds.toShortString() +
+        if (false && DEBUG_STACK) Slog.i(TAG, "draw: bounds=" + bounds.toShortString() +
                 " color=" + Integer.toHexString(color));
         mTmpDrawRect.set(bounds);
         Canvas c = null;
@@ -100,7 +100,7 @@
     }
 
     private void positionSurface(Rect bounds) {
-        if (DEBUG_STACK) Slog.i(TAG, "positionSurface: bounds=" + bounds.toShortString());
+        if (false && DEBUG_STACK) Slog.i(TAG, "positionSurface: bounds=" + bounds.toShortString());
         mSurfaceControl.setSize(bounds.width(), bounds.height());
         mSurfaceControl.setPosition(bounds.left, bounds.top);
     }
@@ -108,7 +108,7 @@
     // Note: caller responsible for being inside
     // Surface.openTransaction() / closeTransaction()
     public void setVisibility(boolean on) {
-        if (DEBUG_STACK) Slog.i(TAG, "setVisibility: on=" + on +
+        if (false && DEBUG_STACK) Slog.i(TAG, "setVisibility: on=" + on +
                 " mLastBounds=" + mLastBounds.toShortString() +
                 " mBounds=" + mBounds.toShortString());
         if (mSurfaceControl == null) {
@@ -132,7 +132,7 @@
     }
 
     public void setBounds(Rect bounds) {
-        if (DEBUG_STACK) Slog.i(TAG, "setBounds: bounds=" + bounds);
+        if (false && DEBUG_STACK) Slog.i(TAG, "setBounds: bounds=" + bounds);
         mBounds.set(bounds);
     }
 
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 9bbaf60..e089ca6 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -187,7 +187,7 @@
     static final boolean DEBUG_SURFACE_TRACE = false;
     static final boolean DEBUG_WINDOW_TRACE = false;
     static final boolean DEBUG_TASK_MOVEMENT = false;
-    static final boolean DEBUG_STACK = false;
+    static final boolean DEBUG_STACK = true;
     static final boolean SHOW_SURFACE_ALLOC = false;
     static final boolean SHOW_TRANSACTIONS = false;
     static final boolean SHOW_LIGHT_TRANSACTIONS = false || SHOW_TRANSACTIONS;
@@ -2367,10 +2367,10 @@
         }
 
         if (localLOGV || DEBUG_FOCUS || DEBUG_FOCUS_LIGHT && win==mCurrentFocus) Slog.v(
-            TAG, "Remove " + win + " client="
-            + Integer.toHexString(System.identityHashCode(win.mClient.asBinder()))
-            + ", surface=" + win.mWinAnimator.mSurfaceControl,
-            new RuntimeException("here").fillInStackTrace());
+                TAG, "Remove " + win + " client="
+                + Integer.toHexString(System.identityHashCode(win.mClient.asBinder()))
+                + ", surface=" + win.mWinAnimator.mSurfaceControl + " Callers="
+                + Debug.getCallers(4));
 
         final long origId = Binder.clearCallingIdentity();
 
@@ -5206,6 +5206,11 @@
         mInputManager.setInputFilter(filter);
     }
 
+    @Override
+    public void setTouchExplorationEnabled(boolean enabled) {
+        mPolicy.setTouchExplorationEnabled(enabled);
+    }
+
     public void setCurrentUser(final int newUserId) {
         synchronized (mWindowMap) {
             int oldUserId = mCurrentUserId;
diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java
index 5f944f6..661bd41 100644
--- a/test-runner/src/android/test/mock/MockPackageManager.java
+++ b/test-runner/src/android/test/mock/MockPackageManager.java
@@ -282,6 +282,18 @@
         throw new UnsupportedOperationException();
     }
 
+    /** @hide */
+    @Override
+    public List<ResolveInfo> queryIntentContentProvidersAsUser(
+            Intent intent, int flags, int userId) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public List<ResolveInfo> queryIntentContentProviders(Intent intent, int flags) {
+        throw new UnsupportedOperationException();
+    }
+
     @Override
     public ProviderInfo resolveContentProvider(String name, int flags) {
         throw new UnsupportedOperationException();
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
index 52ebaf0..f2e5254 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -636,6 +636,30 @@
     return false;
 }
 
+/*
+ * A simple container that holds a resource type and name. It is ordered first by type then
+ * by name.
+ */
+struct type_ident_pair_t {
+    String16 type;
+    String16 ident;
+
+    type_ident_pair_t() { };
+    type_ident_pair_t(const String16& t, const String16& i) : type(t), ident(i) { }
+    type_ident_pair_t(const type_ident_pair_t& o) : type(o.type), ident(o.ident) { }
+    inline bool operator < (const type_ident_pair_t& o) const {
+        int cmp = compare_type(type, o.type);
+        if (cmp < 0) {
+            return true;
+        } else if (cmp > 0) {
+            return false;
+        } else {
+            return strictly_order_type(ident, o.ident);
+        }
+    }
+};
+
+
 status_t parseAndAddEntry(Bundle* bundle,
                         const sp<AaptFile>& in,
                         ResXMLTree* block,
@@ -650,6 +674,7 @@
                         const String16& product,
                         bool pseudolocalize,
                         const bool overwrite,
+                        KeyedVector<type_ident_pair_t, bool>* skippedResourceNames,
                         ResourceTable* outTable)
 {
     status_t err;
@@ -684,6 +709,13 @@
 
         if (bundleProduct[0] == '\0') {
             if (strcmp16(String16("default").string(), product.string()) != 0) {
+                /*
+                 * This string has a product other than 'default'. Do not add it,
+                 * but record it so that if we do not see the same string with
+                 * product 'default' or no product, then report an error.
+                 */
+                skippedResourceNames->replaceValueFor(
+                        type_ident_pair_t(curType, ident), true);
                 return NO_ERROR;
             }
         } else {
@@ -797,6 +829,11 @@
 
     DefaultKeyedVector<String16, uint32_t> nextPublicId(0);
 
+    // Stores the resource names that were skipped. Typically this happens when
+    // AAPT is invoked without a product specified and a resource has no
+    // 'default' product attribute.
+    KeyedVector<type_ident_pair_t, bool> skippedResourceNames;
+
     ResXMLTree::event_code_t code;
     do {
         code = block.next();
@@ -1544,7 +1581,7 @@
 
                 err = parseAndAddEntry(bundle, in, &block, curParams, myPackage, curType, ident,
                         *curTag, curIsStyled, curFormat, curIsFormatted,
-                        product, false, overwrite, outTable);
+                        product, false, overwrite, &skippedResourceNames, outTable);
 
                 if (err < NO_ERROR) { // Why err < NO_ERROR instead of err != NO_ERROR?
                     hasErrors = localHasErrors = true;
@@ -1557,7 +1594,7 @@
                         err = parseAndAddEntry(bundle, in, &block, pseudoParams, myPackage, curType,
                                 ident, *curTag, curIsStyled, curFormat,
                                 curIsFormatted, product,
-                                true, overwrite, outTable);
+                                true, overwrite, &skippedResourceNames, outTable);
                         if (err != NO_ERROR) {
                             hasErrors = localHasErrors = true;
                         }
@@ -1596,6 +1633,30 @@
         }
     }
 
+    // For every resource defined, there must be exist one variant with a product attribute
+    // set to 'default' (or no product attribute at all).
+    // We check to see that for every resource that was ignored because of a mismatched
+    // product attribute, some product variant of that resource was processed.
+    for (size_t i = 0; i < skippedResourceNames.size(); i++) {
+        if (skippedResourceNames[i]) {
+            const type_ident_pair_t& p = skippedResourceNames.keyAt(i);
+            if (!outTable->hasBagOrEntry(myPackage, p.type, p.ident)) {
+                const char* bundleProduct =
+                        (bundle->getProduct() == NULL) ? "" : bundle->getProduct();
+                fprintf(stderr, "In resource file %s: %s\n",
+                        in->getPrintableSource().string(),
+                        curParams.toString().string());
+
+                fprintf(stderr, "\t%s '%s' does not match product %s.\n"
+                        "\tYou may have forgotten to include a 'default' product variant"
+                        " of the resource.\n",
+                        String8(p.type).string(), String8(p.ident).string(),
+                        bundleProduct[0] == 0 ? "default" : bundleProduct);
+                return UNKNOWN_ERROR;
+            }
+        }
+    }
+
     return hasErrors ? UNKNOWN_ERROR : NO_ERROR;
 }
 
@@ -2483,8 +2544,8 @@
                     
                     String16 comment(c->getComment());
                     typeSymbols->appendComment(String8(c->getName()), comment, c->getPos());
-                    //printf("Type symbol %s comment: %s\n", String8(e->getName()).string(),
-                    //     String8(comment).string());
+                    //printf("Type symbol [%08x] %s comment: %s\n", rid,
+                    //        String8(c->getName()).string(), String8(comment).string());
                     comment = c->getTypeComment();
                     typeSymbols->appendTypeComment(String8(c->getName()), comment);
                 } else {
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index 225b0c3..fd153af 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -494,4 +494,8 @@
         // TODO Auto-generated method stub
         return false;
     }
+
+    @Override
+    public void setTouchExplorationEnabled(boolean enabled) {
+    }
 }