Merge "Import translations. DO NOT MERGE" into klp-dev
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 300424c..7183179 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -817,6 +817,10 @@
             }
             if (!mFilesDir.exists()) {
                 if(!mFilesDir.mkdirs()) {
+                    if (mFilesDir.exists()) {
+                        // spurious failure; probably racing with another process for this app
+                        return mFilesDir;
+                    }
                     Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath());
                     return null;
                 }
@@ -879,6 +883,10 @@
             }
             if (!mCacheDir.exists()) {
                 if(!mCacheDir.mkdirs()) {
+                    if (mCacheDir.exists()) {
+                        // spurious failure; probably racing with another process for this app
+                        return mCacheDir;
+                    }
                     Log.w(TAG, "Unable to create cache directory " + mCacheDir.getAbsolutePath());
                     return null;
                 }
@@ -2136,18 +2144,21 @@
             File dir = dirs[i];
             if (!dir.exists()) {
                 if (!dir.mkdirs()) {
-                    // Failing to mkdir() may be okay, since we might not have
-                    // enough permissions; ask vold to create on our behalf.
-                    final IMountService mount = IMountService.Stub.asInterface(
-                            ServiceManager.getService("mount"));
-                    int res = -1;
-                    try {
-                        res = mount.mkdirs(getPackageName(), dir.getAbsolutePath());
-                    } catch (RemoteException e) {
-                    }
-                    if (res != 0) {
-                        Log.w(TAG, "Failed to ensure directory: " + dir);
-                        dir = null;
+                    // recheck existence in case of cross-process race
+                    if (!dir.exists()) {
+                        // Failing to mkdir() may be okay, since we might not have
+                        // enough permissions; ask vold to create on our behalf.
+                        final IMountService mount = IMountService.Stub.asInterface(
+                                ServiceManager.getService("mount"));
+                        int res = -1;
+                        try {
+                            res = mount.mkdirs(getPackageName(), dir.getAbsolutePath());
+                        } catch (RemoteException e) {
+                        }
+                        if (res != 0) {
+                            Log.w(TAG, "Failed to ensure directory: " + dir);
+                            dir = null;
+                        }
                     }
                 }
             }
diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java
index 800ead9..b741cc5 100644
--- a/core/java/android/app/DownloadManager.java
+++ b/core/java/android/app/DownloadManager.java
@@ -16,6 +16,8 @@
 
 package android.app;
 
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
 import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.ContentValues;
@@ -267,18 +269,21 @@
     /**
      * Broadcast intent action sent by the download manager when a download completes.
      */
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public final static String ACTION_DOWNLOAD_COMPLETE = "android.intent.action.DOWNLOAD_COMPLETE";
 
     /**
      * Broadcast intent action sent by the download manager when the user clicks on a running
      * download, either from a system notification or from the downloads UI.
      */
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public final static String ACTION_NOTIFICATION_CLICKED =
             "android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED";
 
     /**
      * Intent action to launch an activity to display all downloads.
      */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public final static String ACTION_VIEW_DOWNLOADS = "android.intent.action.VIEW_DOWNLOADS";
 
     /**
diff --git a/core/java/android/content/AsyncTaskLoader.java b/core/java/android/content/AsyncTaskLoader.java
index 612c67f..eb7426e 100644
--- a/core/java/android/content/AsyncTaskLoader.java
+++ b/core/java/android/content/AsyncTaskLoader.java
@@ -26,6 +26,7 @@
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
 
 /**
  * Abstract Loader that provides an {@link AsyncTask} to do the work.  See
@@ -123,6 +124,8 @@
         }
     }
 
+    private final Executor mExecutor;
+
     volatile LoadTask mTask;
     volatile LoadTask mCancellingTask;
 
@@ -131,7 +134,13 @@
     Handler mHandler;
 
     public AsyncTaskLoader(Context context) {
+        this(context, AsyncTask.THREAD_POOL_EXECUTOR);
+    }
+
+    /** {@hide} */
+    public AsyncTaskLoader(Context context, Executor executor) {
         super(context);
+        mExecutor = executor;
     }
 
     /**
@@ -223,7 +232,7 @@
                 }
             }
             if (DEBUG) Slog.v(TAG, "Executing: " + mTask);
-            mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null);
+            mTask.executeOnExecutor(mExecutor, (Void[]) null);
         }
     }
 
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index ad6839b..f69cad0 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -118,6 +118,7 @@
      * sense for apps that can support large-scale search of music, such as services connected
      * to an online database of music which can be streamed and played on the device.
      */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public static final String INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH =
             "android.media.action.MEDIA_PLAY_FROM_SEARCH";
 
@@ -134,6 +135,7 @@
      * sense for apps that can support large-scale search of text media, such as services connected
      * to an online database of books and/or magazines which can be read on the device.
      */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public static final String INTENT_ACTION_TEXT_OPEN_FROM_SEARCH =
             "android.media.action.TEXT_OPEN_FROM_SEARCH";
 
@@ -150,6 +152,7 @@
      * sense for apps that can support large-scale search of video, such as services connected to an
      * online database of videos which can be streamed and played on the device.
      */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public static final String INTENT_ACTION_VIDEO_PLAY_FROM_SEARCH =
             "android.media.action.VIDEO_PLAY_FROM_SEARCH";
 
@@ -202,6 +205,7 @@
     /**
      * The name of the Intent action used to launch a camera in still image mode.
      */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public static final String INTENT_ACTION_STILL_IMAGE_CAMERA = "android.media.action.STILL_IMAGE_CAMERA";
 
     /**
@@ -216,12 +220,14 @@
      * this flag is used, so launching more than one activity is strongly
      * discouraged.
      */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public static final String INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE =
             "android.media.action.STILL_IMAGE_CAMERA_SECURE";
 
     /**
      * The name of the Intent action used to launch a camera in video mode.
      */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public static final String INTENT_ACTION_VIDEO_CAMERA = "android.media.action.VIDEO_CAMERA";
 
     /**
@@ -235,6 +241,7 @@
      * value of EXTRA_OUTPUT.
      * @see #EXTRA_OUTPUT
      */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public final static String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE";
 
     /**
@@ -256,6 +263,7 @@
      * @see #ACTION_IMAGE_CAPTURE
      * @see #EXTRA_OUTPUT
      */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public static final String ACTION_IMAGE_CAPTURE_SECURE =
             "android.media.action.IMAGE_CAPTURE_SECURE";
 
@@ -274,6 +282,7 @@
      * @see #EXTRA_SIZE_LIMIT
      * @see #EXTRA_DURATION_LIMIT
      */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public final static String ACTION_VIDEO_CAPTURE = "android.media.action.VIDEO_CAPTURE";
 
     /**
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index caf9c8b..fd45866 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -205,7 +205,8 @@
     /**
      * Create a screenshot of the applications currently displayed.
      */
-    Bitmap screenshotApplications(IBinder appToken, int displayId, int maxWidth, int maxHeight);
+    Bitmap screenshotApplications(IBinder appToken, int displayId, int maxWidth,
+            int maxHeight, boolean force565);
 
     /**
      * Called by the status bar to notify Views of changes to System UI visiblity.
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 4366fb7..22d4c9b 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -478,7 +478,8 @@
                               | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                               ;
                 if (!getContext().getResources().getCompatibilityInfo().supportsScreen()) {
-                    mLayout.flags |= WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
+                    mLayout.privateFlags |=
+                            WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
                 }
                 mLayout.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION;
 
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 89c74f1..7e3ee5f 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -467,7 +467,7 @@
                 if (DEBUG_LAYOUT) Log.d(TAG, "WindowLayout in setView:" + attrs);
 
                 if (!compatibilityInfo.supportsScreen()) {
-                    attrs.flags |= WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
+                    attrs.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
                     mLastInCompatMode = true;
                 }
 
@@ -748,8 +748,8 @@
             // Keep track of the actual window flags supplied by the client.
             mClientWindowLayoutFlags = attrs.flags;
             // preserve compatible window flag if exists.
-            int compatibleWindowFlag =
-                mWindowAttributes.flags & WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
+            int compatibleWindowFlag = mWindowAttributes.privateFlags
+                    & WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
             // transfer over system UI visibility values as they carry current state.
             attrs.systemUiVisibility = mWindowAttributes.systemUiVisibility;
             attrs.subtreeSystemUiVisibility = mWindowAttributes.subtreeSystemUiVisibility;
@@ -757,7 +757,7 @@
             if (mWindowAttributes.packageName == null) {
                 mWindowAttributes.packageName = mBasePackageName;
             }
-            mWindowAttributes.flags |= compatibleWindowFlag;
+            mWindowAttributes.privateFlags |= compatibleWindowFlag;
 
             applyKeepScreenOnFlag(mWindowAttributes);
 
@@ -1146,10 +1146,10 @@
             mFullRedrawNeeded = true;
             mLayoutRequested = true;
             if (mLastInCompatMode) {
-                params.flags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
+                params.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
                 mLastInCompatMode = false;
             } else {
-                params.flags |= WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
+                params.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
                 mLastInCompatMode = true;
             }
         }
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index 7a24243..b3a0699 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -708,6 +708,11 @@
     public void addFlags(int flags) {
         setFlags(flags, flags);
     }
+
+    /** @hide */
+    public void addPrivateFlags(int flags) {
+        setPrivateFlags(flags, flags);
+    }
     
     /**
      * Convenience function to clear the flag bits as specified in flags, as
@@ -751,6 +756,14 @@
         }
     }
 
+    private void setPrivateFlags(int flags, int mask) {
+        final WindowManager.LayoutParams attrs = getAttributes();
+        attrs.privateFlags = (attrs.privateFlags & ~mask) | (flags & mask);
+        if (mCallback != null) {
+            mCallback.onWindowAttributesChanged(attrs);
+        }
+    }
+
     /**
      * Set the amount of dim behind the window when using
      * {@link WindowManager.LayoutParams#FLAG_DIM_BEHIND}.  This overrides
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 53f4d77..815b97c 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -1754,6 +1754,9 @@
             sb.append(" fl=#");
             sb.append(Integer.toHexString(flags));
             if (privateFlags != 0) {
+                if ((privateFlags & PRIVATE_FLAG_COMPATIBLE_WINDOW) != 0) {
+                    sb.append(" compatible=true");
+                }
                 sb.append(" pfl=0x").append(Integer.toHexString(privateFlags));
             }
             if (format != PixelFormat.OPAQUE) {
@@ -1784,9 +1787,6 @@
                 sb.append(" rotAnim=");
                 sb.append(rotationAnimation);
             }
-            if ((flags & PRIVATE_FLAG_COMPATIBLE_WINDOW) != 0) {
-                sb.append(" compatible=true");
-            }
             if (systemUiVisibility != 0) {
                 sb.append(" sysui=0x");
                 sb.append(Integer.toHexString(systemUiVisibility));
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 79c0b3c..79aec90 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -165,9 +165,11 @@
          * This can be used as a hint for scrolling (avoiding resizing)
          * the window to make certain that parts of its content
          * are visible.
+         * @param decorFrame The decor frame specified by policy specific to this window,
+         * to use for proper cropping during animation.
          */
         public void computeFrameLw(Rect parentFrame, Rect displayFrame,
-                Rect overlayFrame, Rect contentFrame, Rect visibleFrame);
+                Rect overlayFrame, Rect contentFrame, Rect visibleFrame, Rect decorFrame);
 
         /**
          * Retrieve the current frame of the window that has been assigned by
@@ -399,8 +401,8 @@
          */
         public FakeWindow addFakeWindow(Looper looper,
                 InputEventReceiver.Factory inputEventReceiverFactory,
-                String name, int windowType, int layoutParamsFlags, boolean canReceiveKeys,
-                boolean hasFocus, boolean touchFullscreen);
+                String name, int windowType, int layoutParamsFlags, int layoutParamsPrivateFlags,
+                boolean canReceiveKeys, boolean hasFocus, boolean touchFullscreen);
 
         /**
          * Returns a code that describes the current state of the lid switch.
@@ -815,19 +817,10 @@
                               int displayRotation);
 
     /**
-     * Return the rectangle of the screen currently covered by system decorations.
-     * This will be called immediately after {@link #layoutWindowLw}.  It can
-     * fill in the rectangle to indicate any part of the screen that it knows
-     * for sure is covered by system decor such as the status bar.  The rectangle
-     * is initially set to the actual size of the screen, indicating nothing is
-     * covered.
-     *
-     * @param systemRect The rectangle of the screen that is not covered by
-     * system decoration.
-     * @return Returns the layer above which the system rectangle should
-     * not be applied.
+     * Returns the bottom-most layer of the system decor, above which no policy decor should
+     * be applied.
      */
-    public int getSystemDecorRectLw(Rect systemRect);
+    public int getSystemDecorLayerLw();
 
     /**
      * Return the rectangle of the screen that is available for applications to run in.
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 6f832cfd..2e77578 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -2250,6 +2250,13 @@
                 }
             } else {
                 isScrap[0] = true;
+
+                // Clear any system-managed transient state so that we can
+                // recycle this view and bind it to different data.
+                if (child.isAccessibilityFocused()) {
+                    child.clearAccessibilityFocus();
+                }
+
                 child.dispatchFinishTemporaryDetach();
             }
         } else {
@@ -5069,6 +5076,11 @@
                     count++;
                     int position = firstPosition + i;
                     if (position >= headerViewsCount && position < footerViewsStart) {
+                        // The view will be rebound to new data, clear any
+                        // system-managed transient state.
+                        if (child.isAccessibilityFocused()) {
+                            child.clearAccessibilityFocus();
+                        }
                         mRecycler.addScrapView(child, position);
                     }
                 }
@@ -5087,6 +5099,11 @@
                     count++;
                     int position = firstPosition + i;
                     if (position >= headerViewsCount && position < footerViewsStart) {
+                        // The view will be rebound to new data, clear any
+                        // system-managed transient state.
+                        if (child.isAccessibilityFocused()) {
+                            child.clearAccessibilityFocus();
+                        }
                         mRecycler.addScrapView(child, position);
                     }
                 }
@@ -6660,8 +6677,8 @@
 
             lp.scrappedFromPosition = position;
 
-            // Don't scrap header or footer views, or views that should
-            // otherwise not be recycled.
+            // Remove but don't scrap header or footer views, or views that
+            // should otherwise not be recycled.
             final int viewType = lp.viewType;
             if (!shouldRecycleViewType(viewType)) {
                 return;
@@ -6700,6 +6717,11 @@
                     mScrapViews[viewType].add(scrap);
                 }
 
+                // Clear any system-managed transient state.
+                if (scrap.isAccessibilityFocused()) {
+                    scrap.clearAccessibilityFocus();
+                }
+
                 scrap.setAccessibilityDelegate(null);
 
                 if (mRecyclerListener != null) {
diff --git a/core/java/android/widget/EdgeEffect.java b/core/java/android/widget/EdgeEffect.java
index bb4a4cf..30752e0 100644
--- a/core/java/android/widget/EdgeEffect.java
+++ b/core/java/android/widget/EdgeEffect.java
@@ -68,6 +68,8 @@
 
     // Minimum velocity that will be absorbed
     private static final int MIN_VELOCITY = 100;
+    // Maximum velocity, clamps at this value
+    private static final int MAX_VELOCITY = 10000;
 
     private static final float EPSILON = 0.001f;
 
@@ -115,7 +117,7 @@
     private static final float PULL_DISTANCE_ALPHA_GLOW_FACTOR = 1.1f;
 
     private static final int VELOCITY_EDGE_FACTOR = 8;
-    private static final int VELOCITY_GLOW_FACTOR = 16;
+    private static final int VELOCITY_GLOW_FACTOR = 12;
 
     private int mState = STATE_IDLE;
 
@@ -283,10 +285,10 @@
      */
     public void onAbsorb(int velocity) {
         mState = STATE_ABSORB;
-        velocity = Math.max(MIN_VELOCITY, Math.abs(velocity));
+        velocity = Math.min(Math.max(MIN_VELOCITY, Math.abs(velocity)), MAX_VELOCITY);
 
         mStartTime = AnimationUtils.currentAnimationTimeMillis();
-        mDuration = 0.1f + (velocity * 0.03f);
+        mDuration = 0.15f + (velocity * 0.02f);
 
         // The edge should always be at least partially visible, regardless
         // of velocity.
@@ -294,7 +296,7 @@
         mEdgeScaleY = mEdgeScaleYStart = 0.f;
         // The glow depends more on the velocity, and therefore starts out
         // nearly invisible.
-        mGlowAlphaStart = 0.5f;
+        mGlowAlphaStart = 0.3f;
         mGlowScaleYStart = 0.f;
 
         // Factor the velocity by 8. Testing on device shows this works best to
diff --git a/core/res/res/drawable-hdpi/overscroll_edge.png b/core/res/res/drawable-hdpi/overscroll_edge.png
index 08fc022..1952e0e 100644
--- a/core/res/res/drawable-hdpi/overscroll_edge.png
+++ b/core/res/res/drawable-hdpi/overscroll_edge.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/overscroll_glow.png b/core/res/res/drawable-hdpi/overscroll_glow.png
index 8f0c2cb..45c0135 100644
--- a/core/res/res/drawable-hdpi/overscroll_glow.png
+++ b/core/res/res/drawable-hdpi/overscroll_glow.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/overscroll_edge.png b/core/res/res/drawable-mdpi/overscroll_edge.png
index 4c87a8b..baf2d0c 100644
--- a/core/res/res/drawable-mdpi/overscroll_edge.png
+++ b/core/res/res/drawable-mdpi/overscroll_edge.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/overscroll_glow.png b/core/res/res/drawable-mdpi/overscroll_glow.png
index 8389ef4..c6cddd4 100644
--- a/core/res/res/drawable-mdpi/overscroll_glow.png
+++ b/core/res/res/drawable-mdpi/overscroll_glow.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/overscroll_edge.png b/core/res/res/drawable-xhdpi/overscroll_edge.png
index 4fe6c27..b5e6e61 100644
--- a/core/res/res/drawable-xhdpi/overscroll_edge.png
+++ b/core/res/res/drawable-xhdpi/overscroll_edge.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/overscroll_glow.png b/core/res/res/drawable-xhdpi/overscroll_glow.png
index 75c3eb4..779c3a5 100644
--- a/core/res/res/drawable-xhdpi/overscroll_glow.png
+++ b/core/res/res/drawable-xhdpi/overscroll_glow.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/overscroll_edge.png b/core/res/res/drawable-xxhdpi/overscroll_edge.png
index 1a92737..734bfa7 100644
--- a/core/res/res/drawable-xxhdpi/overscroll_edge.png
+++ b/core/res/res/drawable-xxhdpi/overscroll_edge.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/overscroll_glow.png b/core/res/res/drawable-xxhdpi/overscroll_glow.png
index c187e95..dc1f279 100644
--- a/core/res/res/drawable-xxhdpi/overscroll_glow.png
+++ b/core/res/res/drawable-xxhdpi/overscroll_glow.png
Binary files differ
diff --git a/docs/html/about/dashboards/index.jd b/docs/html/about/dashboards/index.jd
index ff19476..1df2e22 100644
--- a/docs/html/about/dashboards/index.jd
+++ b/docs/html/about/dashboards/index.jd
@@ -61,7 +61,7 @@
 </div>
 
 
-<p style="clear:both"><em>Data collected during a 7-day period ending on September 4, 2013.
+<p style="clear:both"><em>Data collected during a 7-day period ending on October 2, 2013.
 <br/>Any versions with less than 0.1% distribution are not shown.</em>
 </p>
 
@@ -92,7 +92,7 @@
 </div>
 
 
-<p style="clear:both"><em>Data collected during a 7-day period ending on September 4, 2013
+<p style="clear:both"><em>Data collected during a 7-day period ending on October 2, 2013
 <br/>Any screen configurations with less than 0.1% distribution are not shown.</em></p>
 
 
@@ -139,7 +139,7 @@
 
 
 
-<p style="clear:both"><em>Data collected during a 7-day period ending on September 4, 2013</em></p>
+<p style="clear:both"><em>Data collected during a 7-day period ending on October 2, 2013</em></p>
 
 
 
@@ -157,17 +157,17 @@
 var VERSION_DATA =
 [
   {
-    "chart": "//chart.googleapis.com/chart?chs=500x250&cht=p&chco=c4df9b%2C6fad0c&chd=t%3A2.4%2C30.7%2C0.1%2C21.7%2C45.1&chf=bg%2Cs%2C00000000&chl=Froyo%7CGingerbread%7CHoneycomb%7CIce%20Cream%20Sandwich%7CJelly%20Bean",
+    "chart": "//chart.googleapis.com/chart?chs=500x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A2.2%2C28.5%2C0.1%2C20.6%2C48.6&chl=Froyo%7CGingerbread%7CHoneycomb%7CIce%20Cream%20Sandwich%7CJelly%20Bean",
     "data": [
       {
         "api": 8,
         "name": "Froyo",
-        "perc": "2.4"
+        "perc": "2.2"
       },
       {
         "api": 10,
         "name": "Gingerbread",
-        "perc": "30.7"
+        "perc": "28.5"
       },
       {
         "api": 13,
@@ -177,17 +177,22 @@
       {
         "api": 15,
         "name": "Ice Cream Sandwich",
-        "perc": "21.7"
+        "perc": "20.6"
       },
       {
         "api": 16,
         "name": "Jelly Bean",
-        "perc": "36.6"
+        "perc": "36.5"
       },
       {
         "api": 17,
         "name": "Jelly Bean",
-        "perc": "8.5"
+        "perc": "10.6"
+      },
+      {
+        "api": 18,
+        "name": "Jelly Bean",
+        "perc": "1.5"
       }
     ]
   }
@@ -202,21 +207,21 @@
   {
     "data": {
       "Large": {
-        "hdpi": "0.4",
+        "hdpi": "0.5",
         "ldpi": "0.6",
-        "mdpi": "3.4",
+        "mdpi": "3.5",
         "tvdpi": "1.2",
-        "xhdpi": "0.5"
+        "xhdpi": "0.6"
       },
       "Normal": {
-        "hdpi": "33.6",
+        "hdpi": "33.5",
         "ldpi": "0.1",
-        "mdpi": "15.7",
-        "xhdpi": "23.1",
-        "xxhdpi": "7.1"
+        "mdpi": "15.3",
+        "xhdpi": "22.8",
+        "xxhdpi": "7.7"
       },
       "Small": {
-        "ldpi": "9.5"
+        "ldpi": "9.4"
       },
       "Xlarge": {
         "hdpi": "0.3",
@@ -224,8 +229,8 @@
         "xhdpi": "0.1"
       }
     },
-    "densitychart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chd=t%3A10.2%2C23.5%2C1.2%2C34.3%2C23.7%2C7.1&chf=bg%2Cs%2C00000000&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi",
-    "layoutchart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chd=t%3A4.8%2C6.1%2C79.6%2C9.5&chf=bg%2Cs%2C00000000&chl=Xlarge%7CLarge%7CNormal%7CSmall"
+    "densitychart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A10.1%2C23.3%2C1.2%2C34.3%2C23.5%2C7.7&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi",
+    "layoutchart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A4.8%2C6.4%2C79.5%2C9.4&chl=Xlarge%7CLarge%7CNormal%7CSmall"
   }
 ];
 
diff --git a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java
index 23a3f22..22dd6e4 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java
@@ -69,7 +69,12 @@
             @Override
             public void onClick(DialogInterface dialog, int which) {
                 final String displayName = text1.getText().toString();
-                new CreateDirectoryTask(displayName).execute();
+
+                final DocumentsActivity activity = (DocumentsActivity) getActivity();
+                final DocumentInfo cwd = activity.getCurrentDirectory();
+
+                new CreateDirectoryTask(displayName).executeOnExecutor(
+                        ProviderExecutor.forAuthority(cwd.authority));
             }
         });
         builder.setNegativeButton(android.R.string.cancel, null);
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
index 6ff47f8..59caad0 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
@@ -27,6 +27,7 @@
 import static com.android.documentsui.model.DocumentInfo.getCursorLong;
 import static com.android.documentsui.model.DocumentInfo.getCursorString;
 
+import android.app.ActivityManager;
 import android.app.Fragment;
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
@@ -113,6 +114,7 @@
 
     private boolean mHideGridTitles = false;
 
+    private boolean mSvelteRecents;
     private Point mThumbSize;
 
     private DocumentsAdapter mAdapter;
@@ -204,6 +206,19 @@
     }
 
     @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+
+        // Cancel any outstanding thumbnail requests
+        final ViewGroup target = (mListView.getAdapter() != null) ? mListView : mGridView;
+        final int count = target.getChildCount();
+        for (int i = 0; i < count; i++) {
+            final View view = target.getChildAt(i);
+            mRecycleListener.onMovedToScrapHeap(view);
+        }
+    }
+
+    @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
 
@@ -225,6 +240,10 @@
             mHideGridTitles = (doc != null) && doc.isGridTitlesHidden();
         }
 
+        final ActivityManager am = (ActivityManager) context.getSystemService(
+                Context.ACTIVITY_SERVICE);
+        mSvelteRecents = am.isLowRamDevice() && (mType == TYPE_RECENT_OPEN);
+
         mCallbacks = new LoaderCallbacks<DirectoryResult>() {
             @Override
             public Loader<DirectoryResult> onCreateLoader(int id, Bundle args) {
@@ -260,7 +279,7 @@
             public void onLoadFinished(Loader<DirectoryResult> loader, DirectoryResult result) {
                 if (!isAdded()) return;
 
-                mAdapter.swapResult(result.cursor, result.exception);
+                mAdapter.swapResult(result);
 
                 // Push latest state up to UI
                 // TODO: if mode change was racing with us, don't overwrite it
@@ -286,7 +305,7 @@
 
             @Override
             public void onLoaderReset(Loader<DirectoryResult> loader) {
-                mAdapter.swapResult(null, null);
+                mAdapter.swapResult(null);
             }
         };
 
@@ -654,13 +673,13 @@
 
         private List<Footer> mFooters = Lists.newArrayList();
 
-        public void swapResult(Cursor cursor, Exception e) {
-            mCursor = cursor;
-            mCursorCount = cursor != null ? cursor.getCount() : 0;
+        public void swapResult(DirectoryResult result) {
+            mCursor = result != null ? result.cursor : null;
+            mCursorCount = mCursor != null ? mCursor.getCount() : 0;
 
             mFooters.clear();
 
-            final Bundle extras = cursor != null ? cursor.getExtras() : null;
+            final Bundle extras = mCursor != null ? mCursor.getExtras() : null;
             if (extras != null) {
                 final String info = extras.getString(DocumentsContract.EXTRA_INFO);
                 if (info != null) {
@@ -675,7 +694,7 @@
                 }
             }
 
-            if (e != null) {
+            if (result != null && result.exception != null) {
                 mFooters.add(new MessageFooter(
                         3, R.drawable.ic_dialog_alert, getString(R.string.query_error)));
             }
@@ -776,7 +795,7 @@
             final boolean supportsThumbnail = (docFlags & Document.FLAG_SUPPORTS_THUMBNAIL) != 0;
             final boolean allowThumbnail = (state.derivedMode == MODE_GRID)
                     || MimePredicate.mimeMatches(MimePredicate.VISUAL_MIMES, docMimeType);
-            final boolean showThumbnail = supportsThumbnail && allowThumbnail;
+            final boolean showThumbnail = supportsThumbnail && allowThumbnail && !mSvelteRecents;
 
             boolean cacheHit = false;
             if (showThumbnail) {
@@ -790,7 +809,7 @@
                     final ThumbnailAsyncTask task = new ThumbnailAsyncTask(
                             uri, iconMime, iconThumb, mThumbSize);
                     iconThumb.setTag(task);
-                    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+                    task.executeOnExecutor(ProviderExecutor.forAuthority(docAuthority));
                 }
             }
 
@@ -983,6 +1002,8 @@
 
         @Override
         protected Bitmap doInBackground(Uri... params) {
+            if (isCancelled()) return null;
+
             final Context context = mIconThumb.getContext();
             final ContentResolver resolver = context.getContentResolver();
 
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java
index da0f526..163615d 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java
@@ -79,7 +79,7 @@
 
     public DirectoryLoader(Context context, int type, RootInfo root, DocumentInfo doc, Uri uri,
             int userSortOrder) {
-        super(context);
+        super(context, ProviderExecutor.forAuthority(root.authority));
         mType = type;
         mRoot = root;
         mDoc = doc;
@@ -157,11 +157,11 @@
         Log.d(TAG, "userMode=" + userMode + ", userSortOrder=" + mUserSortOrder + " --> mode="
                 + result.mode + ", sortOrder=" + result.sortOrder);
 
+        ContentProviderClient client = null;
         try {
-            result.client = DocumentsApplication.acquireUnstableProviderOrThrow(
-                    resolver, authority);
+            client = DocumentsApplication.acquireUnstableProviderOrThrow(resolver, authority);
 
-            cursor = result.client.query(
+            cursor = client.query(
                     mUri, null, null, null, getQuerySortOrder(result.sortOrder), mSignal);
             cursor.registerContentObserver(mObserver);
 
@@ -175,11 +175,12 @@
                 cursor = new SortingCursorWrapper(cursor, result.sortOrder);
             }
 
+            result.client = client;
             result.cursor = cursor;
         } catch (Exception e) {
             Log.w(TAG, "Failed to query", e);
             result.exception = e;
-            ContentProviderClient.releaseQuietly(result.client);
+            ContentProviderClient.releaseQuietly(client);
         } finally {
             synchronized (this) {
                 mSignal = null;
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
index 7a45641..7660779 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
@@ -91,6 +91,7 @@
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
+import java.util.concurrent.Executor;
 
 public class DocumentsActivity extends Activity {
     public static final String TAG = "Documents";
@@ -215,7 +216,7 @@
         if (!mState.restored) {
             if (mState.action == ACTION_MANAGE) {
                 final Uri rootUri = getIntent().getData();
-                new RestoreRootTask(rootUri).execute();
+                new RestoreRootTask(rootUri).executeOnExecutor(getCurrentExecutor());
             } else {
                 new RestoreStackTask().execute();
             }
@@ -782,6 +783,15 @@
         return mState.stack.peek();
     }
 
+    public Executor getCurrentExecutor() {
+        final DocumentInfo cwd = getCurrentDirectory();
+        if (cwd != null && cwd.authority != null) {
+            return ProviderExecutor.forAuthority(cwd.authority);
+        } else {
+            return AsyncTask.THREAD_POOL_EXECUTOR;
+        }
+    }
+
     public State getDisplayState() {
         return mState;
     }
@@ -855,7 +865,7 @@
         mState.stackTouched = true;
 
         if (!mRoots.isRecentsRoot(root)) {
-            new PickRootTask(root).execute();
+            new PickRootTask(root).executeOnExecutor(getCurrentExecutor());
         } else {
             onCurrentDirectoryChanged(ANIM_SIDE);
         }
@@ -932,7 +942,7 @@
             onCurrentDirectoryChanged(ANIM_DOWN);
         } else if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
             // Explicit file picked, return
-            new ExistingFinishTask(doc.derivedUri).execute();
+            new ExistingFinishTask(doc.derivedUri).executeOnExecutor(getCurrentExecutor());
         } else if (mState.action == ACTION_CREATE) {
             // Replace selected file
             SaveFragment.get(fm).setReplaceTarget(doc);
@@ -966,16 +976,16 @@
             for (int i = 0; i < size; i++) {
                 uris[i] = docs.get(i).derivedUri;
             }
-            new ExistingFinishTask(uris).execute();
+            new ExistingFinishTask(uris).executeOnExecutor(getCurrentExecutor());
         }
     }
 
     public void onSaveRequested(DocumentInfo replaceTarget) {
-        new ExistingFinishTask(replaceTarget.derivedUri).execute();
+        new ExistingFinishTask(replaceTarget.derivedUri).executeOnExecutor(getCurrentExecutor());
     }
 
     public void onSaveRequested(String mimeType, String displayName) {
-        new CreateFinishTask(mimeType, displayName).execute();
+        new CreateFinishTask(mimeType, displayName).executeOnExecutor(getCurrentExecutor());
     }
 
     private void saveStackBlocking() {
diff --git a/packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java b/packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java
new file mode 100644
index 0000000..2105cb41
--- /dev/null
+++ b/packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java
@@ -0,0 +1,64 @@
+/*
+ * 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.documentsui;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.Preconditions;
+import com.google.android.collect.Maps;
+
+import java.util.HashMap;
+import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
+
+public class ProviderExecutor extends Thread implements Executor {
+
+    @GuardedBy("sExecutors")
+    private static HashMap<String, ProviderExecutor> sExecutors = Maps.newHashMap();
+
+    public static Executor forAuthority(String authority) {
+        synchronized (sExecutors) {
+            ProviderExecutor executor = sExecutors.get(authority);
+            if (executor == null) {
+                executor = new ProviderExecutor();
+                executor.setName("ProviderExecutor: " + authority);
+                executor.start();
+                sExecutors.put(authority, executor);
+            }
+            return executor;
+        }
+    }
+
+    private final LinkedBlockingQueue<Runnable> mQueue = new LinkedBlockingQueue<Runnable>();
+
+    @Override
+    public void execute(Runnable command) {
+        Preconditions.checkNotNull(command);
+        mQueue.add(command);
+    }
+
+    @Override
+    public void run() {
+        while (true) {
+            try {
+                final Runnable command = mQueue.take();
+                command.run();
+            } catch (InterruptedException e) {
+                // That was weird; let's go look for more tasks.
+            }
+        }
+    }
+}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java
index 47dbcdf..3a8a3fb 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java
@@ -49,9 +49,7 @@
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
 public class RecentLoader extends AsyncTaskLoader<DirectoryResult> {
@@ -74,30 +72,7 @@
     /** MIME types that should always be excluded from recents. */
     private static final String[] RECENT_REJECT_MIMES = new String[] { Document.MIME_TYPE_DIR };
 
-    private static ExecutorService sExecutor;
-
-    /**
-     * Create a bounded thread pool for fetching recents; it creates threads as
-     * needed (up to maximum) and reclaims them when finished.
-     */
-    private synchronized static ExecutorService getExecutor(Context context) {
-        if (sExecutor == null) {
-            final ActivityManager am = (ActivityManager) context.getSystemService(
-                    Context.ACTIVITY_SERVICE);
-            final int maxOutstanding = am.isLowRamDevice() ? MAX_OUTSTANDING_RECENTS_SVELTE
-                    : MAX_OUTSTANDING_RECENTS;
-
-            // Create a bounded thread pool for fetching recents; it creates
-            // threads as needed (up to maximum) and reclaims them when finished.
-            final ThreadPoolExecutor executor = new ThreadPoolExecutor(
-                    maxOutstanding, maxOutstanding, 10, TimeUnit.SECONDS,
-                    new LinkedBlockingQueue<Runnable>());
-            executor.allowCoreThreadTimeOut(true);
-            sExecutor = executor;
-        }
-
-        return sExecutor;
-    }
+    private final Semaphore mQueryPermits;
 
     private final RootsCache mRoots;
     private final State mState;
@@ -129,6 +104,20 @@
         public void run() {
             if (isCancelled()) return;
 
+            try {
+                mQueryPermits.acquire();
+            } catch (InterruptedException e) {
+                return;
+            }
+
+            try {
+                runInternal();
+            } finally {
+                mQueryPermits.release();
+            }
+        }
+
+        public void runInternal() {
             ContentProviderClient client = null;
             try {
                 client = DocumentsApplication.acquireUnstableProviderOrThrow(
@@ -138,6 +127,7 @@
                 final Cursor cursor = client.query(
                         uri, null, null, null, DirectoryLoader.getQuerySortOrder(mSortOrder));
                 mWithRoot = new RootCursorWrapper(authority, rootId, cursor, MAX_DOCS_FROM_ROOT);
+
             } catch (Exception e) {
                 Log.w(TAG, "Failed to load " + authority + ", " + rootId, e);
             } finally {
@@ -162,12 +152,17 @@
         super(context);
         mRoots = roots;
         mState = state;
+
+        // Keep clients around on high-RAM devices, since we'd be spinning them
+        // up moments later to fetch thumbnails anyway.
+        final ActivityManager am = (ActivityManager) getContext().getSystemService(
+                Context.ACTIVITY_SERVICE);
+        mQueryPermits = new Semaphore(
+                am.isLowRamDevice() ? MAX_OUTSTANDING_RECENTS_SVELTE : MAX_OUTSTANDING_RECENTS);
     }
 
     @Override
     public DirectoryResult loadInBackground() {
-        final ExecutorService executor = getExecutor(getContext());
-
         if (mFirstPassLatch == null) {
             // First time through we kick off all the recent tasks, and wait
             // around to see if everyone finishes quickly.
@@ -182,7 +177,7 @@
 
             mFirstPassLatch = new CountDownLatch(mTasks.size());
             for (RecentTask task : mTasks.values()) {
-                executor.execute(task);
+                ProviderExecutor.forAuthority(task.authority).execute(task);
             }
 
             try {
@@ -224,7 +219,6 @@
 
         if (LOGD) {
             Log.d(TAG, "Found " + cursors.size() + " of " + mTasks.size() + " recent queries done");
-            Log.d(TAG, executor.toString());
         }
 
         final DirectoryResult result = new DirectoryResult();
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java
index e9f2c71..0caddcc 100644
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java
@@ -66,6 +66,7 @@
     private static final boolean CHILD_WEDGE = false;
     private static final boolean CHILD_CRASH = false;
 
+    private static final boolean THUMB_HUNDREDS = false;
     private static final boolean THUMB_WEDGE = false;
     private static final boolean THUMB_CRASH = false;
 
@@ -225,6 +226,12 @@
         includeFile(result, "localfile3", 0);
         includeFile(result, "localfile4", 0);
 
+        if (THUMB_HUNDREDS) {
+            for (int i = 0; i < 256; i++) {
+                includeFile(result, "i maded u an picshure", Document.FLAG_SUPPORTS_THUMBNAIL);
+            }
+        }
+
         synchronized (this) {
             // Try picking up an existing network fetch
             CloudTask task = mTask != null ? mTask.get() : null;
@@ -292,7 +299,7 @@
     public AssetFileDescriptor openDocumentThumbnail(
             String docId, Point sizeHint, CancellationSignal signal) throws FileNotFoundException {
 
-        if (THUMB_WEDGE) SystemClock.sleep(Integer.MAX_VALUE);
+        if (THUMB_WEDGE) wedgeUntilCanceled(signal);
         if (THUMB_CRASH) System.exit(12);
 
         final Bitmap bitmap = Bitmap.createBitmap(32, 32, Bitmap.Config.ARGB_8888);
@@ -332,6 +339,18 @@
         return true;
     }
 
+    private static void wedgeUntilCanceled(CancellationSignal signal) {
+        if (signal != null) {
+            while (true) {
+                signal.throwIfCanceled();
+                SystemClock.sleep(500);
+            }
+        } else {
+            Log.w(TAG, "WEDGING WITHOUT A CANCELLATIONSIGNAL");
+            SystemClock.sleep(Integer.MAX_VALUE);
+        }
+    }
+
     private static void includeFile(MatrixCursor result, String docId, int flags) {
         final RowBuilder row = result.newRow();
         row.add(Document.COLUMN_DOCUMENT_ID, docId);
diff --git a/packages/Keyguard/res/values-ca/strings.xml b/packages/Keyguard/res/values-ca/strings.xml
index 77c44ea..cf750ab 100644
--- a/packages/Keyguard/res/values-ca/strings.xml
+++ b/packages/Keyguard/res/values-ca/strings.xml
@@ -73,7 +73,7 @@
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botó de parada"</string>
     <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloqueja per continuar"</string>
     <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"S\'ha cancel·lat l\'inici"</string>
-    <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Deixa anar <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> perquè se suprimeixi."</string>
+    <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Deixa anar <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> per suprimir-lo."</string>
     <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"No se suprimirà <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
diff --git a/packages/Keyguard/res/values-sl/strings.xml b/packages/Keyguard/res/values-sl/strings.xml
index b893422..7c791db 100644
--- a/packages/Keyguard/res/values-sl/strings.xml
+++ b/packages/Keyguard/res/values-sl/strings.xml
@@ -73,7 +73,7 @@
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Gumb za ustavitev"</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">"Povlecite pripomoček <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, da ga izbrišete."</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>
     <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Pripomoček <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ne bo izbrisan."</string>
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
diff --git a/packages/Keyguard/res/values-zh-rTW/strings.xml b/packages/Keyguard/res/values-zh-rTW/strings.xml
index 2c24c52..42fffe6 100644
--- a/packages/Keyguard/res/values-zh-rTW/strings.xml
+++ b/packages/Keyguard/res/values-zh-rTW/strings.xml
@@ -73,7 +73,7 @@
     <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"[停止] 按鈕"</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>
+    <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"拖放「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>」即可將其刪除。"</string>
     <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>」將不會遭到刪除。"</string>
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
diff --git a/packages/PrintSpooler/res/values-af/strings.xml b/packages/PrintSpooler/res/values-af/strings.xml
index 7e15080..6361df4 100644
--- a/packages/PrintSpooler/res/values-af/strings.xml
+++ b/packages/PrintSpooler/res/values-af/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Alle drukkers…"</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Kies drukdiens"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Soek in Play-winkel"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Geen drukkers gekry nie"</string>
     <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>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Drukkerfout by <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 bac0527..be683ba 100644
--- a/packages/PrintSpooler/res/values-am/strings.xml
+++ b/packages/PrintSpooler/res/values-am/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"ሁሉም አታሚዎች…"</string>
     <string name="search" msgid="5421724265322228497">"ፍለጋ"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"ሁሉም አታሚዎች"</string>
+    <string name="add_print_service_label" msgid="5356702546188981940">"አገልግሎት አክል"</string>
     <string name="choose_print_service" msgid="3740309762324459694">"የህትመት አገልግሎት ይምረጡ"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"በPlay ሱቅ ውስጥ ይፈልጉ"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"ምንም አታሚዎች አልተገኙም"</string>
     <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 4cca804..eae6a91 100644
--- a/packages/PrintSpooler/res/values-ar/strings.xml
+++ b/packages/PrintSpooler/res/values-ar/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"جميع الطابعات…"</string>
     <string name="search" msgid="5421724265322228497">"بحث"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"جميع الطابعات"</string>
+    <string name="add_print_service_label" msgid="5356702546188981940">"إضافة خدمة"</string>
     <string name="choose_print_service" msgid="3740309762324459694">"اختر خدمة طباعة"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"البحث في سوق Play"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"لم يتم العثور على طابعات"</string>
     <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-bg/strings.xml b/packages/PrintSpooler/res/values-bg/strings.xml
index 737fc23..b0f5506 100644
--- a/packages/PrintSpooler/res/values-bg/strings.xml
+++ b/packages/PrintSpooler/res/values-bg/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Всички принтери…"</string>
     <string name="search" msgid="5421724265322228497">"Търсене"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Всички принтери"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Избиране на услуга за отпечатване"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Търсене в Google Play Магазин"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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>
@@ -45,8 +48,7 @@
     <string name="restart" msgid="2472034227037808749">"Рестартиране"</string>
     <string name="no_connection_to_printer" msgid="2159246915977282728">"Няма връзка с принтера"</string>
     <string name="reason_unknown" msgid="5507940196503246139">"няма данни"</string>
-    <!-- no translation found for printer_unavailable (2434170617003315690) -->
-    <skip />
+    <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – не е налице"</string>
   <string-array name="color_mode_labels">
     <item msgid="7602948745415174937">"Черно-бяло"</item>
     <item msgid="2762241247228983754">"Цветно"</item>
diff --git a/packages/PrintSpooler/res/values-ca/strings.xml b/packages/PrintSpooler/res/values-ca/strings.xml
index 9bc03f9..700d2c9 100644
--- a/packages/PrintSpooler/res/values-ca/strings.xml
+++ b/packages/PrintSpooler/res/values-ca/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Totes les impressores…"</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Selecció del servei d\'impressió"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Cerca a Play Store"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"No s\'ha trobat cap impressora"</string>
     <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 6cb024d..151165f 100644
--- a/packages/PrintSpooler/res/values-cs/strings.xml
+++ b/packages/PrintSpooler/res/values-cs/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Všechny tiskárny…"</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Zvolte službu tisku"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Vyhledat v Obchodě Play"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Nebyly nalezeny žádné tiskárny"</string>
     <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>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Chyba tiskárny u úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
@@ -45,8 +46,7 @@
     <string name="restart" msgid="2472034227037808749">"Restartovat"</string>
     <string name="no_connection_to_printer" msgid="2159246915977282728">"Nelze se připojit k tiskárně"</string>
     <string name="reason_unknown" msgid="5507940196503246139">"neznámé"</string>
-    <!-- no translation found for printer_unavailable (2434170617003315690) -->
-    <skip />
+    <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – není k dispozici"</string>
   <string-array name="color_mode_labels">
     <item msgid="7602948745415174937">"Černobíle"</item>
     <item msgid="2762241247228983754">"Barevně"</item>
diff --git a/packages/PrintSpooler/res/values-da/strings.xml b/packages/PrintSpooler/res/values-da/strings.xml
index 26457b6..e9c4d6d 100644
--- a/packages/PrintSpooler/res/values-da/strings.xml
+++ b/packages/PrintSpooler/res/values-da/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Alle printere..."</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Vælg udskriftstjeneste"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Søg i Play Butik"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Der blev ikke fundet nogen printere"</string>
     <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 ceffeda..417792e 100644
--- a/packages/PrintSpooler/res/values-de/strings.xml
+++ b/packages/PrintSpooler/res/values-de/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Alle Drucker…"</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Druckdienst auswählen"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Im Play Store suchen"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Keine Drucker gefunden"</string>
     <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>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Druckerfehler <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-el/strings.xml b/packages/PrintSpooler/res/values-el/strings.xml
index 44ba5d4..331315d 100644
--- a/packages/PrintSpooler/res/values-el/strings.xml
+++ b/packages/PrintSpooler/res/values-el/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Όλοι οι εκτυπωτές…"</string>
     <string name="search" msgid="5421724265322228497">"Αναζήτηση"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Όλοι οι εκτυπωτές"</string>
+    <string name="add_print_service_label" msgid="5356702546188981940">"Προσθήκη υπηρεσίας"</string>
     <string name="choose_print_service" msgid="3740309762324459694">"Επιλέξτε υπηρεσία εκτύπωσης"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Αναζήτηση στο play store"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Δεν βρέθηκαν εκτυπωτές"</string>
     <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-rGB/strings.xml b/packages/PrintSpooler/res/values-en-rGB/strings.xml
index 7b77483..5fc9c68 100644
--- a/packages/PrintSpooler/res/values-en-rGB/strings.xml
+++ b/packages/PrintSpooler/res/values-en-rGB/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"All printers…"</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Choose print service"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Search in Play Store"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"No printers found"</string>
     <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>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Printer error <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 7b77483..5fc9c68 100644
--- a/packages/PrintSpooler/res/values-en-rIN/strings.xml
+++ b/packages/PrintSpooler/res/values-en-rIN/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"All printers…"</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Choose print service"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Search in Play Store"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"No printers found"</string>
     <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>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Printer error <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-es-rUS/strings.xml b/packages/PrintSpooler/res/values-es-rUS/strings.xml
index 8f76e9d..444561d 100644
--- a/packages/PrintSpooler/res/values-es-rUS/strings.xml
+++ b/packages/PrintSpooler/res/values-es-rUS/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Todas las impresoras…"</string>
     <string name="search" msgid="5421724265322228497">"Buscar"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Todas las impresoras"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Elegir servicio de impresión"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Buscar en Play Store"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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 26343e5..350834a 100644
--- a/packages/PrintSpooler/res/values-es/strings.xml
+++ b/packages/PrintSpooler/res/values-es/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Todas las impresoras…"</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Seleccionar servicio de impresión"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Buscar en Play Store"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"No se encontraron impresoras"</string>
     <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>
@@ -51,8 +52,8 @@
     <item msgid="2762241247228983754">"Color"</item>
   </string-array>
   <string-array name="orientation_labels">
-    <item msgid="4061931020926489228">"Retrato"</item>
-    <item msgid="3199660090246166812">"Paisaje"</item>
+    <item msgid="4061931020926489228">"Vertical"</item>
+    <item msgid="3199660090246166812">"Horizontal"</item>
   </string-array>
   <string-array name="page_options_labels">
     <item msgid="7421377442011699994">"Todo"</item>
diff --git a/packages/PrintSpooler/res/values-et-rEE/strings.xml b/packages/PrintSpooler/res/values-et-rEE/strings.xml
index 0d28170..94a6775 100644
--- a/packages/PrintSpooler/res/values-et-rEE/strings.xml
+++ b/packages/PrintSpooler/res/values-et-rEE/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Kõik printerid …"</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Prinditeenuse valimine"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Otsi Play poest"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Printereid ei leitud"</string>
     <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>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Printeri viga: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-fa/strings.xml b/packages/PrintSpooler/res/values-fa/strings.xml
index 709d529..320dfb0 100644
--- a/packages/PrintSpooler/res/values-fa/strings.xml
+++ b/packages/PrintSpooler/res/values-fa/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"همه چاپگرها..."</string>
     <string name="search" msgid="5421724265322228497">"جستجو"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"همه چاپگرها"</string>
+    <string name="add_print_service_label" msgid="5356702546188981940">"افزودن سرویس"</string>
     <string name="choose_print_service" msgid="3740309762324459694">"انتخاب سرویس چاپ"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"جستجو در فروشگاه Play"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"هیچ چاپگری یافت نشد"</string>
     <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>
@@ -45,8 +46,7 @@
     <string name="restart" msgid="2472034227037808749">"راه‌اندازی مجدد"</string>
     <string name="no_connection_to_printer" msgid="2159246915977282728">"اتصال با چاپگر برقرار نیست"</string>
     <string name="reason_unknown" msgid="5507940196503246139">"نامعلوم"</string>
-    <!-- no translation found for printer_unavailable (2434170617003315690) -->
-    <skip />
+    <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - در دسترس نیست"</string>
   <string-array name="color_mode_labels">
     <item msgid="7602948745415174937">"سیاه و سفید"</item>
     <item msgid="2762241247228983754">"رنگی"</item>
diff --git a/packages/PrintSpooler/res/values-fi/strings.xml b/packages/PrintSpooler/res/values-fi/strings.xml
index cbf9931..9e92744 100644
--- a/packages/PrintSpooler/res/values-fi/strings.xml
+++ b/packages/PrintSpooler/res/values-fi/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Kaikki tulostimet…"</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Valitse tulostuspalvelu"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Haku Play-kaupasta"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Tulostimia ei löydy"</string>
     <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>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Tulostinvirhe työlle <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 f5c504f..0a50d49 100644
--- a/packages/PrintSpooler/res/values-fr-rCA/strings.xml
+++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Toutes les imprimantes…"</string>
     <string name="search" msgid="5421724265322228497">"Rechercher"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Toutes les imprimantes"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Sélectionner le service d\'impression"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Rechercher dans la boutique Google Play Store"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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 2d6a7a1..6b47686 100644
--- a/packages/PrintSpooler/res/values-fr/strings.xml
+++ b/packages/PrintSpooler/res/values-fr/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Toutes les imprimantes…"</string>
     <string name="search" msgid="5421724265322228497">"Rechercher"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Toutes les imprimantes"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Sélectionner le service d\'impression"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Rechercher sur le Play Store"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Erreur impression pour \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\""</string>
diff --git a/packages/PrintSpooler/res/values-hi/strings.xml b/packages/PrintSpooler/res/values-hi/strings.xml
index 59a88a8..59a4054 100644
--- a/packages/PrintSpooler/res/values-hi/strings.xml
+++ b/packages/PrintSpooler/res/values-hi/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"सभी प्रिंटर..."</string>
     <string name="search" msgid="5421724265322228497">"खोजें"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"सभी प्रिंटर"</string>
+    <string name="add_print_service_label" msgid="5356702546188981940">"सेवा जोड़ें"</string>
     <string name="choose_print_service" msgid="3740309762324459694">"प्रिंट सेवा चुनें"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Play स्टोर में खोजें"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"कोई प्रिंटर नहीं मिला"</string>
     <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-hr/strings.xml b/packages/PrintSpooler/res/values-hr/strings.xml
index 399e14e..19f546e 100644
--- a/packages/PrintSpooler/res/values-hr/strings.xml
+++ b/packages/PrintSpooler/res/values-hr/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Svi pisači…"</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Odaberite uslugu ispisa"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Pretraži u Trgovini Play"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Nije pronađen nijedan pisač"</string>
     <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 ea997c5..31505f0 100644
--- a/packages/PrintSpooler/res/values-hu/strings.xml
+++ b/packages/PrintSpooler/res/values-hu/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Az összes nyomtató…"</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Nyomtatási szolgáltatás kiválasztása"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Keresés a Play Áruházban"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Nem található nyomtató"</string>
     <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>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Nyomtatási hiba: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-hy-rAM/strings.xml b/packages/PrintSpooler/res/values-hy-rAM/strings.xml
index 47d8627..5ccb0ab4 100644
--- a/packages/PrintSpooler/res/values-hy-rAM/strings.xml
+++ b/packages/PrintSpooler/res/values-hy-rAM/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Բոլոր տպիչները..."</string>
     <string name="search" msgid="5421724265322228497">"Որոնել"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Բոլոր տպիչները"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Ընտրեք տպելու ծառայությունը"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Որոնել Play Store-ում"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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-in/strings.xml b/packages/PrintSpooler/res/values-in/strings.xml
index d4878cd..a7a2fdc 100644
--- a/packages/PrintSpooler/res/values-in/strings.xml
+++ b/packages/PrintSpooler/res/values-in/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Semua printer…"</string>
     <string name="search" msgid="5421724265322228497">"Cari"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Semua printer"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Pilih layanan cetak"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Cari di Play Store"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Ada kesalahan printer <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 a623bb6..d8f8eab 100644
--- a/packages/PrintSpooler/res/values-it/strings.xml
+++ b/packages/PrintSpooler/res/values-it/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Tutte le stampanti…"</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Scegli servizio di stampa"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Cerca nel Play Store"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Nessuna stampante trovata"</string>
     <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>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Errore della stampante: <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 15b097c..44a001a 100644
--- a/packages/PrintSpooler/res/values-iw/strings.xml
+++ b/packages/PrintSpooler/res/values-iw/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"כל המדפסות…"</string>
     <string name="search" msgid="5421724265322228497">"חפש"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"כל המדפסות"</string>
+    <string name="add_print_service_label" msgid="5356702546188981940">"הוסף שירות"</string>
     <string name="choose_print_service" msgid="3740309762324459694">"בחר שירות הדפסה"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"חפש בחנות Play"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"לא נמצאו מדפסות"</string>
     <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-ja/strings.xml b/packages/PrintSpooler/res/values-ja/strings.xml
index 116c7fe..6212b32 100644
--- a/packages/PrintSpooler/res/values-ja/strings.xml
+++ b/packages/PrintSpooler/res/values-ja/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"すべてのプリンタ…"</string>
     <string name="search" msgid="5421724265322228497">"検索"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"すべてのプリンタ"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"印刷サービスの選択"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Playストアで検索"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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-ka-rGE/strings.xml b/packages/PrintSpooler/res/values-ka-rGE/strings.xml
index 05ad4c7..2cb994c 100644
--- a/packages/PrintSpooler/res/values-ka-rGE/strings.xml
+++ b/packages/PrintSpooler/res/values-ka-rGE/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"ყველა პრინტერი…"</string>
     <string name="search" msgid="5421724265322228497">"ძიება"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"ყველა პრინტერი"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"აირჩიეთ ბეჭდვის სერვისი"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Play Store-ში ძიება"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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>
@@ -45,8 +48,7 @@
     <string name="restart" msgid="2472034227037808749">"გადატვირთვა"</string>
     <string name="no_connection_to_printer" msgid="2159246915977282728">"პრინტერთან კავშირი არ არის"</string>
     <string name="reason_unknown" msgid="5507940196503246139">"უცნობი"</string>
-    <!-- no translation found for printer_unavailable (2434170617003315690) -->
-    <skip />
+    <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – მიუწვდომელია"</string>
   <string-array name="color_mode_labels">
     <item msgid="7602948745415174937">"შავ-თეთრი"</item>
     <item msgid="2762241247228983754">"ფერი"</item>
diff --git a/packages/PrintSpooler/res/values-km-rKH/strings.xml b/packages/PrintSpooler/res/values-km-rKH/strings.xml
index b9a52f1..1d682e3 100644
--- a/packages/PrintSpooler/res/values-km-rKH/strings.xml
+++ b/packages/PrintSpooler/res/values-km-rKH/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"ម៉ាស៊ីន​បោះពុម្ព​ទាំងអស់ ..."</string>
     <string name="search" msgid="5421724265322228497">"ស្វែងរក"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"ម៉ាស៊ីន​បោះពុម្ព​ទាំងអស់"</string>
+    <string name="add_print_service_label" msgid="5356702546188981940">"បន្ថែម​សេវាកម្ម"</string>
     <string name="choose_print_service" msgid="3740309762324459694">"ជ្រើស​សេវា​បោះពុម្ព"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"ស្វែងរក​ក្នុង​ឃ្លាំង​កម្មវិធី"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"រក​មិន​ឃើញ​ម៉ាស៊ីន​បោះពុម្ព"</string>
     <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-ko/strings.xml b/packages/PrintSpooler/res/values-ko/strings.xml
index ed3942b..a512f62 100644
--- a/packages/PrintSpooler/res/values-ko/strings.xml
+++ b/packages/PrintSpooler/res/values-ko/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"모든 프린터…"</string>
     <string name="search" msgid="5421724265322228497">"검색"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"모든 프린터"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"인쇄 서비스 선택"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Play 스토어에서 검색"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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>
@@ -45,8 +48,7 @@
     <string name="restart" msgid="2472034227037808749">"다시 시작"</string>
     <string name="no_connection_to_printer" msgid="2159246915977282728">"프린터와 연결되지 않음"</string>
     <string name="reason_unknown" msgid="5507940196503246139">"알 수 없음"</string>
-    <!-- no translation found for printer_unavailable (2434170617003315690) -->
-    <skip />
+    <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – 사용할 수 없음"</string>
   <string-array name="color_mode_labels">
     <item msgid="7602948745415174937">"흑백"</item>
     <item msgid="2762241247228983754">"컬러"</item>
diff --git a/packages/PrintSpooler/res/values-lo-rLA/strings.xml b/packages/PrintSpooler/res/values-lo-rLA/strings.xml
index cefb82c..ced114b 100644
--- a/packages/PrintSpooler/res/values-lo-rLA/strings.xml
+++ b/packages/PrintSpooler/res/values-lo-rLA/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"ທຸກເຄື່ອງພິມ..."</string>
     <string name="search" msgid="5421724265322228497">"ຊອກຫາ"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"ທຸກເຄື່ອງພິມ"</string>
+    <string name="add_print_service_label" msgid="5356702546188981940">"ເພີ່ມບໍລິການ"</string>
     <string name="choose_print_service" msgid="3740309762324459694">"ເລືອກບໍລິການການພິມ"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"ຊອກຫາໃນ play store"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"ບໍ່ພົບເຄື່ອງພິມ"</string>
     <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>
@@ -45,8 +46,7 @@
     <string name="restart" msgid="2472034227037808749">"ປິດເປີດໃໝ່"</string>
     <string name="no_connection_to_printer" msgid="2159246915977282728">"ບໍ່ມີການເຊື່ອມຕໍ່ຫາເຄື່ອງພິມ"</string>
     <string name="reason_unknown" msgid="5507940196503246139">"ບໍ່ຮູ້ຈັກ"</string>
-    <!-- no translation found for printer_unavailable (2434170617003315690) -->
-    <skip />
+    <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - ບໍ່ມີຢູ່"</string>
   <string-array name="color_mode_labels">
     <item msgid="7602948745415174937">"ຂາວດຳ"</item>
     <item msgid="2762241247228983754">"ສີ"</item>
diff --git a/packages/PrintSpooler/res/values-lt/strings.xml b/packages/PrintSpooler/res/values-lt/strings.xml
index 6778b75..dc72e8a 100644
--- a/packages/PrintSpooler/res/values-lt/strings.xml
+++ b/packages/PrintSpooler/res/values-lt/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Visi spausdintuvai…"</string>
     <string name="search" msgid="5421724265322228497">"Ieškoti"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Visi spausdintuvai"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Pasirinkite spausdinimo paslaugą"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Ieškoti „Google Play“ parduotuvėje"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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 a255001..aae7b97 100644
--- a/packages/PrintSpooler/res/values-lv/strings.xml
+++ b/packages/PrintSpooler/res/values-lv/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Visi printeri…"</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Izvēlieties drukāšanas pakalpojumu"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Meklēt Play veikalā"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Netika atrasts neviens printeris."</string>
     <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 b1dfc28..af5f066 100644
--- a/packages/PrintSpooler/res/values-mn-rMN/strings.xml
+++ b/packages/PrintSpooler/res/values-mn-rMN/strings.xml
@@ -24,7 +24,7 @@
     <string name="label_paper_size" msgid="8681895607876809323">"Цаасны хэмжээ"</string>
     <string name="label_color" msgid="1108690305218188969">"Өнгө"</string>
     <string name="label_orientation" msgid="2853142581990496477">"Чиглэл"</string>
-    <string name="label_pages" msgid="6300874667546617333">"ХУУДСУУД (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
+    <string name="label_pages" msgid="6300874667546617333">"(<xliff:g id="PAGE_COUNT">%1$s</xliff:g>) хуудас"</string>
     <string name="pages_range_example" msgid="4069269138547562081">"жнь. 1–5, 8, 11–13"</string>
     <string name="print_preview" msgid="8010217796057763343">"Хэвлэхээр урьдчилан харах"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"Урьдчилан харахын тулд PDF харагчийг суулгах"</string>
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Бүх принтерүүд…"</string>
     <string name="search" msgid="5421724265322228497">"Хайх"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Бүх принтерүүд"</string>
+    <string name="add_print_service_label" msgid="5356702546188981940">"Үйлчилгээ нэмэх"</string>
     <string name="choose_print_service" msgid="3740309762324459694">"Хэвлэх үйлчилгээг сонгох"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Play Store-с хайх"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Принтер олдсонгүй"</string>
     <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-ms-rMY/strings.xml b/packages/PrintSpooler/res/values-ms-rMY/strings.xml
index 43ebf77..6c70bc2 100644
--- a/packages/PrintSpooler/res/values-ms-rMY/strings.xml
+++ b/packages/PrintSpooler/res/values-ms-rMY/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Semua pencetak..."</string>
     <string name="search" msgid="5421724265322228497">"Cari"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Semua pencetak"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Pilih perkhidmatan cetak"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Cari di gedung play"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Ralat pencetak <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
@@ -45,8 +48,7 @@
     <string name="restart" msgid="2472034227037808749">"Mulakan semula"</string>
     <string name="no_connection_to_printer" msgid="2159246915977282728">"Tiada sambungan ke pencetak"</string>
     <string name="reason_unknown" msgid="5507940196503246139">"tidak diketahui"</string>
-    <!-- no translation found for printer_unavailable (2434170617003315690) -->
-    <skip />
+    <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – tidak tersedia"</string>
   <string-array name="color_mode_labels">
     <item msgid="7602948745415174937">"Hitam &amp; Putih"</item>
     <item msgid="2762241247228983754">"Warna"</item>
diff --git a/packages/PrintSpooler/res/values-nb/strings.xml b/packages/PrintSpooler/res/values-nb/strings.xml
index b80975a..ebdbe2f 100644
--- a/packages/PrintSpooler/res/values-nb/strings.xml
+++ b/packages/PrintSpooler/res/values-nb/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Alle skrivere"</string>
     <string name="search" msgid="5421724265322228497">"Søk"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Alle skrivere"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Velg utskriftstjeneste"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Søk i Play-butikken"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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>
@@ -45,8 +48,7 @@
     <string name="restart" msgid="2472034227037808749">"Start på nytt"</string>
     <string name="no_connection_to_printer" msgid="2159246915977282728">"Ingen forbindelse med skriveren"</string>
     <string name="reason_unknown" msgid="5507940196503246139">"ukjent"</string>
-    <!-- no translation found for printer_unavailable (2434170617003315690) -->
-    <skip />
+    <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – utilgjengelig"</string>
   <string-array name="color_mode_labels">
     <item msgid="7602948745415174937">"Svart og hvitt"</item>
     <item msgid="2762241247228983754">"Farge"</item>
diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml
index 2d27eed..2548edd 100644
--- a/packages/PrintSpooler/res/values-nl/strings.xml
+++ b/packages/PrintSpooler/res/values-nl/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Alle printers…"</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Afdrukservice kiezen"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Zoeken in de Play Store"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Geen printers gevonden"</string>
     <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 6f8aab2..397ef3f 100644
--- a/packages/PrintSpooler/res/values-pl/strings.xml
+++ b/packages/PrintSpooler/res/values-pl/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Wszystkie drukarki…"</string>
     <string name="search" msgid="5421724265322228497">"Szukaj"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Wszystkie drukarki"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Wybierz usługę drukowania"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Szukaj w Sklepie Play"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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 db37f90..5fe98ef 100644
--- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml
+++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Todas as impressoras..."</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Escolher o serviço de impressão"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Pesquisar na Play Store"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Nenhuma impressora encontrada"</string>
     <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 1a7a737..1afbe3e 100644
--- a/packages/PrintSpooler/res/values-pt/strings.xml
+++ b/packages/PrintSpooler/res/values-pt/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Todas as impressoras…"</string>
     <string name="search" msgid="5421724265322228497">"Pesquisar"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Todas as impressoras"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Selecione o serviço de impressão"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Pesquisar na Play Store"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Erro ao imprimir <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 301691e..c17f308 100644
--- a/packages/PrintSpooler/res/values-ro/strings.xml
+++ b/packages/PrintSpooler/res/values-ro/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Toate imprimantele..."</string>
     <string name="search" msgid="5421724265322228497">"Căutați"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Toate imprimantele"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Alegeți serviciul de printare"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Căutați în Magazin Play"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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>
@@ -45,8 +48,7 @@
     <string name="restart" msgid="2472034227037808749">"Reporniți"</string>
     <string name="no_connection_to_printer" msgid="2159246915977282728">"Nu există conexiune la o imprimantă"</string>
     <string name="reason_unknown" msgid="5507940196503246139">"necunoscut"</string>
-    <!-- no translation found for printer_unavailable (2434170617003315690) -->
-    <skip />
+    <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - indisponibil"</string>
   <string-array name="color_mode_labels">
     <item msgid="7602948745415174937">"Alb-negru"</item>
     <item msgid="2762241247228983754">"Color"</item>
diff --git a/packages/PrintSpooler/res/values-ru/strings.xml b/packages/PrintSpooler/res/values-ru/strings.xml
index 4ca08bf..0a89171 100644
--- a/packages/PrintSpooler/res/values-ru/strings.xml
+++ b/packages/PrintSpooler/res/values-ru/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Все принтеры"</string>
     <string name="search" msgid="5421724265322228497">"Поиск"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Все принтеры"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Выберите службу печати"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Поиск в Google Play"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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>
@@ -45,8 +48,7 @@
     <string name="restart" msgid="2472034227037808749">"Повторить"</string>
     <string name="no_connection_to_printer" msgid="2159246915977282728">"Нет связи с принтером"</string>
     <string name="reason_unknown" msgid="5507940196503246139">"неизвестно"</string>
-    <!-- no translation found for printer_unavailable (2434170617003315690) -->
-    <skip />
+    <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – недоступен"</string>
   <string-array name="color_mode_labels">
     <item msgid="7602948745415174937">"Черно-белое"</item>
     <item msgid="2762241247228983754">"Цветное"</item>
diff --git a/packages/PrintSpooler/res/values-sk/strings.xml b/packages/PrintSpooler/res/values-sk/strings.xml
index 22d4a2f..667a456 100644
--- a/packages/PrintSpooler/res/values-sk/strings.xml
+++ b/packages/PrintSpooler/res/values-sk/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Všetky tlačiarne..."</string>
     <string name="search" msgid="5421724265322228497">"VYHĽADÁVANIE"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Všetky tlačiarne"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Výber tlačovej služby"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Vyhľadať v Obchode Play"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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>
@@ -45,8 +48,7 @@
     <string name="restart" msgid="2472034227037808749">"Spustiť znova"</string>
     <string name="no_connection_to_printer" msgid="2159246915977282728">"Žiadne pripojenie k tlačiarni"</string>
     <string name="reason_unknown" msgid="5507940196503246139">"neznáme"</string>
-    <!-- no translation found for printer_unavailable (2434170617003315690) -->
-    <skip />
+    <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – nie je k dispozícii"</string>
   <string-array name="color_mode_labels">
     <item msgid="7602948745415174937">"Čiernobiele"</item>
     <item msgid="2762241247228983754">"Farba"</item>
diff --git a/packages/PrintSpooler/res/values-sl/strings.xml b/packages/PrintSpooler/res/values-sl/strings.xml
index dca67b2..398268a 100644
--- a/packages/PrintSpooler/res/values-sl/strings.xml
+++ b/packages/PrintSpooler/res/values-sl/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Vsi tiskalniki …"</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Izberite tiskalno storitev"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Iskanje v Trgovini Play"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Tiskalnikov ni mogoče najti"</string>
     <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>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Napaka tiskalnika: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
@@ -45,8 +46,7 @@
     <string name="restart" msgid="2472034227037808749">"Začni znova"</string>
     <string name="no_connection_to_printer" msgid="2159246915977282728">"Ni povezave s tiskalnikom"</string>
     <string name="reason_unknown" msgid="5507940196503246139">"neznano"</string>
-    <!-- no translation found for printer_unavailable (2434170617003315690) -->
-    <skip />
+    <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ni na voljo"</string>
   <string-array name="color_mode_labels">
     <item msgid="7602948745415174937">"Črno-belo"</item>
     <item msgid="2762241247228983754">"Barvno"</item>
diff --git a/packages/PrintSpooler/res/values-sr/strings.xml b/packages/PrintSpooler/res/values-sr/strings.xml
index 3b03e10..5d1fc71 100644
--- a/packages/PrintSpooler/res/values-sr/strings.xml
+++ b/packages/PrintSpooler/res/values-sr/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Сви штампачи…"</string>
     <string name="search" msgid="5421724265322228497">"Претражи"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Сви штампачи"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Изаберите услугу штампања"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Претражи у Play продавници"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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 413c372..3ceefe8 100644
--- a/packages/PrintSpooler/res/values-sv/strings.xml
+++ b/packages/PrintSpooler/res/values-sv/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Alla skrivare ..."</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Välj utskriftstjänst"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Sök i Play Butik"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Det gick inte att hitta några skrivare"</string>
     <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>
@@ -45,8 +46,7 @@
     <string name="restart" msgid="2472034227037808749">"Starta om"</string>
     <string name="no_connection_to_printer" msgid="2159246915977282728">"Ingen anslutning till skrivaren"</string>
     <string name="reason_unknown" msgid="5507940196503246139">"okänt"</string>
-    <!-- no translation found for printer_unavailable (2434170617003315690) -->
-    <skip />
+    <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – inte tillgänglig"</string>
   <string-array name="color_mode_labels">
     <item msgid="7602948745415174937">"Svartvit"</item>
     <item msgid="2762241247228983754">"Färg"</item>
diff --git a/packages/PrintSpooler/res/values-sw/strings.xml b/packages/PrintSpooler/res/values-sw/strings.xml
index 148d8fc..9378b8d 100644
--- a/packages/PrintSpooler/res/values-sw/strings.xml
+++ b/packages/PrintSpooler/res/values-sw/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Printa zote..."</string>
     <string name="search" msgid="5421724265322228497">"Tafuta"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Printa zote"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Chagua huduma ya printa"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Tafuta katika duka la Google Play"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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>
@@ -45,8 +48,7 @@
     <string name="restart" msgid="2472034227037808749">"Anzisha upya"</string>
     <string name="no_connection_to_printer" msgid="2159246915977282728">"Hakuna muunganisho kwa printa"</string>
     <string name="reason_unknown" msgid="5507940196503246139">"haijulikani"</string>
-    <!-- no translation found for printer_unavailable (2434170617003315690) -->
-    <skip />
+    <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - haipatikani"</string>
   <string-array name="color_mode_labels">
     <item msgid="7602948745415174937">"Nyeusi na Nyeupe"</item>
     <item msgid="2762241247228983754">"Rangi"</item>
diff --git a/packages/PrintSpooler/res/values-th/strings.xml b/packages/PrintSpooler/res/values-th/strings.xml
index ba20aaf..f46588f 100644
--- a/packages/PrintSpooler/res/values-th/strings.xml
+++ b/packages/PrintSpooler/res/values-th/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"เครื่องพิมพ์ทั้งหมด…"</string>
     <string name="search" msgid="5421724265322228497">"ค้นหา"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"เครื่องพิมพ์ทั้งหมด"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"เลือกบริการพิมพ์"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"ค้นหาใน Play สโตร์"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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-tl/strings.xml b/packages/PrintSpooler/res/values-tl/strings.xml
index a0fd8ad..6aac2e8 100644
--- a/packages/PrintSpooler/res/values-tl/strings.xml
+++ b/packages/PrintSpooler/res/values-tl/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Lahat ng printer…"</string>
     <string name="search" msgid="5421724265322228497">"Hanapin"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Lahat ng printer"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Pumili ng serbisyo ng pag-print"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Hanapin sa play store"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Error sa printer <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 ef57400..95e52a4 100644
--- a/packages/PrintSpooler/res/values-tr/strings.xml
+++ b/packages/PrintSpooler/res/values-tr/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Tüm yazıcılar…"</string>
     <string name="search" msgid="5421724265322228497">"Ara"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Tüm yazıcılar"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Yazdırma hizmetini seçin"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Google Play Store\'da ara"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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>
@@ -45,8 +48,7 @@
     <string name="restart" msgid="2472034227037808749">"Yeniden başlat"</string>
     <string name="no_connection_to_printer" msgid="2159246915977282728">"Yazıcı bağlantısı yok"</string>
     <string name="reason_unknown" msgid="5507940196503246139">"bilinmiyor"</string>
-    <!-- no translation found for printer_unavailable (2434170617003315690) -->
-    <skip />
+    <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – kullanılamıyor"</string>
   <string-array name="color_mode_labels">
     <item msgid="7602948745415174937">"Siyah Beyaz"</item>
     <item msgid="2762241247228983754">"Renkli"</item>
diff --git a/packages/PrintSpooler/res/values-uk/strings.xml b/packages/PrintSpooler/res/values-uk/strings.xml
index 0aa514f..f88da45 100644
--- a/packages/PrintSpooler/res/values-uk/strings.xml
+++ b/packages/PrintSpooler/res/values-uk/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Усі принтери…"</string>
     <string name="search" msgid="5421724265322228497">"Пошук"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Усі принтери"</string>
+    <string name="add_print_service_label" msgid="5356702546188981940">"Додати службу"</string>
     <string name="choose_print_service" msgid="3740309762324459694">"Вибрати службу друку"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Шукати в магазині Play"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Принтери не знайдено"</string>
     <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-vi/strings.xml b/packages/PrintSpooler/res/values-vi/strings.xml
index bb06d8b0..9141cba 100644
--- a/packages/PrintSpooler/res/values-vi/strings.xml
+++ b/packages/PrintSpooler/res/values-vi/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"Tất cả máy in…"</string>
     <string name="search" msgid="5421724265322228497">"Tìm kiếm"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"Tất cả máy in"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"Chọn dịch vụ in"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Tìm kiếm trong Cửa hàng Play"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"Lỗi máy in <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/PrintSpooler/res/values-zh-rCN/strings.xml b/packages/PrintSpooler/res/values-zh-rCN/strings.xml
index 71ea194..c5899b3 100644
--- a/packages/PrintSpooler/res/values-zh-rCN/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rCN/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"所有打印机…"</string>
     <string name="search" msgid="5421724265322228497">"搜索"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"所有打印机"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"选择打印服务"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"在 Play 商店中搜索"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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>
@@ -45,8 +48,7 @@
     <string name="restart" msgid="2472034227037808749">"重新开始"</string>
     <string name="no_connection_to_printer" msgid="2159246915977282728">"未与打印机建立连接"</string>
     <string name="reason_unknown" msgid="5507940196503246139">"未知"</string>
-    <!-- no translation found for printer_unavailable (2434170617003315690) -->
-    <skip />
+    <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - 无法使用"</string>
   <string-array name="color_mode_labels">
     <item msgid="7602948745415174937">"黑白"</item>
     <item msgid="2762241247228983754">"彩色"</item>
diff --git a/packages/PrintSpooler/res/values-zh-rHK/strings.xml b/packages/PrintSpooler/res/values-zh-rHK/strings.xml
index 99eb30a..6a30ad1 100644
--- a/packages/PrintSpooler/res/values-zh-rHK/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rHK/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"所有打印機…"</string>
     <string name="search" msgid="5421724265322228497">"搜尋"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"所有打印機"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"選擇列印服務"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"前往「Play 商店」搜尋"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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 4f20161..1e192cf 100644
--- a/packages/PrintSpooler/res/values-zh-rTW/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rTW/strings.xml
@@ -35,8 +35,11 @@
     <string name="all_printers" msgid="5018829726861876202">"所有印表機…"</string>
     <string name="search" msgid="5421724265322228497">"搜尋"</string>
     <string name="all_printers_label" msgid="3178848870161526399">"所有印表機"</string>
+    <!-- no translation found for add_print_service_label (5356702546188981940) -->
+    <skip />
     <string name="choose_print_service" msgid="3740309762324459694">"選擇列印服務"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"前往 Play 商店搜尋"</string>
+    <!-- no translation found for print_no_printers_found (5932593791392441303) -->
+    <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 7ad8ce2..e93fb1a 100644
--- a/packages/PrintSpooler/res/values-zu/strings.xml
+++ b/packages/PrintSpooler/res/values-zu/strings.xml
@@ -35,8 +35,9 @@
     <string name="all_printers" msgid="5018829726861876202">"Wonke amaphrinta…"</string>
     <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>
     <string name="choose_print_service" msgid="3740309762324459694">"Khetha isevisi yephrinta"</string>
-    <string name="search_play_store" msgid="1575218005860538249">"Sesha ku-Google Play Isitolo"</string>
+    <string name="print_no_printers_found" msgid="5932593791392441303">"Awekho amaphrinta atholiwe"</string>
     <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/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
index 44362d4..8474115 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
@@ -56,6 +56,7 @@
 import android.text.TextUtils;
 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;
@@ -735,8 +736,12 @@
                 if (resultCode == RESULT_OK) {
                     PrinterId printerId = (PrinterId) data.getParcelableExtra(
                             INTENT_EXTRA_PRINTER_ID);
-                    mEditor.selectPrinter(printerId);
+                    if (printerId != null) {
+                        mEditor.ensurePrinterSelected(printerId);
+                        break;
+                    }
                 }
+                mEditor.ensureCurrentPrinterSelected();
             } break;
         }
     }
@@ -817,6 +822,8 @@
 
         private Button mPrintButton;
 
+        private PrinterId mNextPrinterId;
+
         private PrinterInfo mCurrentPrinter;
 
         private final OnItemSelectedListener mOnItemSelectedListener =
@@ -830,10 +837,6 @@
                     }
 
                     if (id == DEST_ADAPTER_ITEM_ID_ALL_PRINTERS) {
-                        // The selection changed to the all printers item. We
-                        // want to select back the last selected printer.
-                        mIgnoreNextDestinationChange = true;
-                        mEditor.selectPrinter(mCurrentPrinter.getId());
                         startSelectPrinterActivity();
                         return;
                     }
@@ -1157,6 +1160,13 @@
                         mDestinationSpinner.setSelection(0);
                     }
 
+                    // If there is a next printer to select and we succeed selecting
+                    // it - done. Let the selection handling code make everything right.
+                    if (mNextPrinterId != null && selectPrinter(mNextPrinterId)) {
+                        mNextPrinterId = null;
+                        return;
+                    }
+
                     // If the current printer properties changed, we update the UI.
                     if (mCurrentPrinter != null) {
                         final int printerCount = mDestinationSpinnerAdapter.getCount();
@@ -1299,10 +1309,32 @@
             }
         }
 
-        public void selectPrinter(PrinterId printerId) {
-            mDestinationSpinnerAdapter.ensurePrinterShownPrinterShown(printerId);
+        public void ensurePrinterSelected(PrinterId printerId) {
+            // If the printer is not present maybe the loader is not
+            // updated yet. In this case make a note and as soon as
+            // the printer appears will will select it.
+            if (!selectPrinter(printerId)) {
+                mNextPrinterId = printerId;
+            }
+        }
+
+        public boolean selectPrinter(PrinterId printerId) {
+            mDestinationSpinnerAdapter.ensurePrinterInVisibleAdapterPosition(printerId);
             final int position = mDestinationSpinnerAdapter.getPrinterIndex(printerId);
-            mDestinationSpinner.setSelection(position);
+            if (position != AdapterView.INVALID_POSITION
+                    && position != mDestinationSpinner.getSelectedItemPosition()) {
+                Object item = mDestinationSpinnerAdapter.getItem(position);
+                mCurrentPrinter = (PrinterInfo) item;
+                mDestinationSpinner.setSelection(position);
+                return true;
+            }
+            return false;
+        }
+
+        public void ensureCurrentPrinterSelected() {
+            if (mCurrentPrinter != null) {
+                selectPrinter(mCurrentPrinter.getId());
+            }
         }
 
         public boolean isPrintingToPdf() {
@@ -2015,8 +2047,6 @@
 
             private final PrinterInfo mFakePdfPrinter;
 
-            private PrinterId mLastShownPrinterId;
-
             public DestinationAdapter() {
                 getLoaderManager().initLoader(LOADER_ID_PRINTERS_LOADER, null, this);
                 mFakePdfPrinter = createFakePdfPrinter();
@@ -2032,9 +2062,23 @@
                 return AdapterView.INVALID_POSITION;
             }
 
-            public void ensurePrinterShownPrinterShown(PrinterId printerId) {
-                mLastShownPrinterId = printerId;
-                ensureLastShownPrinterInPosition();
+            public void ensurePrinterInVisibleAdapterPosition(PrinterId printerId) {
+                final int printerCount = mPrinters.size();
+                for (int i = 0; i < printerCount; i++) {
+                    PrinterInfo printer = (PrinterInfo) mPrinters.get(i);
+                    if (printer.getId().equals(printerId)) {
+                        // If already in the list - do nothing.
+                        if (i < getCount() - 2) {
+                            return;
+                        }
+                        // Else replace the last one (two items are not printers).
+                        final int lastPrinterIndex = getCount() - 3;
+                        mPrinters.set(i, mPrinters.get(lastPrinterIndex));
+                        mPrinters.set(lastPrinterIndex, printer);
+                        notifyDataSetChanged();
+                        return;
+                    }
+                }
             }
 
             @Override
@@ -2172,9 +2216,46 @@
             @Override
             public void onLoadFinished(Loader<List<PrinterInfo>> loader,
                     List<PrinterInfo> printers) {
+                // 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.
+
+                // No old printers - do not bother keeping their position.
+                if (mPrinters.isEmpty()) {
+                    mPrinters.addAll(printers);
+                    mEditor.ensureCurrentPrinterSelected();
+                    notifyDataSetChanged();
+                    return;
+                }
+
+                // Add the new printers to a map.
+                ArrayMap<PrinterId, PrinterInfo> newPrintersMap =
+                        new ArrayMap<PrinterId, PrinterInfo>();
+                final int printerCount = printers.size();
+                for (int i = 0; i < printerCount; i++) {
+                    PrinterInfo printer = printers.get(i);
+                    newPrintersMap.put(printer.getId(), printer);
+                }
+
+                List<PrinterInfo> newPrinters = new ArrayList<PrinterInfo>();
+
+                // Update printers we already have.
+                final int oldPrinterCount = mPrinters.size();
+                for (int i = 0; i < oldPrinterCount; i++) {
+                    PrinterId oldPrinterId = mPrinters.get(i).getId();
+                    PrinterInfo updatedPrinter = newPrintersMap.remove(oldPrinterId);
+                    if (updatedPrinter != null) {
+                        newPrinters.add(updatedPrinter);
+                    }
+                }
+
+                // Add the rest of the new printers, i.e. what is left.
+                newPrinters.addAll(newPrintersMap.values());
+
                 mPrinters.clear();
-                mPrinters.addAll(printers);
-                ensureLastShownPrinterInPosition();
+                mPrinters.addAll(newPrinters);
+
+                mEditor.ensureCurrentPrinterSelected();
                 notifyDataSetChanged();
             }
 
@@ -2184,27 +2265,6 @@
                 notifyDataSetInvalidated();
             }
 
-            private void ensureLastShownPrinterInPosition() {
-                if (mLastShownPrinterId == null) {
-                    return;
-                }
-                final int printerCount = mPrinters.size();
-                for (int i = 0; i < printerCount; i++) {
-                    PrinterInfo printer = (PrinterInfo) mPrinters.get(i);
-                    if (printer.getId().equals(mLastShownPrinterId)) {
-                        // If already in the list - do nothing.
-                        if (i < getCount() - 2) {
-                            return;
-                        }
-                        // Else replace the last one.
-                        final int lastPrinter = getCount() - 2;
-                        mPrinters.set(i, mPrinters.get(lastPrinter - 1));
-                        mPrinters.set(lastPrinter - 1, printer);
-                        return;
-                    }
-                }
-            }
-
             private PrinterInfo createFakePdfPrinter() {
                 final MediaSize defaultMediaSize;
                 String currentCountry = getResources().getConfiguration().locale.getCountry();
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
index 87181f7..d1d71cd 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
@@ -236,7 +236,7 @@
     @Override
     protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         synchronized (mLock) {
-            String prefix = args[0];
+            String prefix = (args.length > 0) ? args[0] : "";
             String tab = "  ";
 
             pw.append(prefix).append("print jobs:").println();
diff --git a/packages/SystemUI/res/drawable-hdpi/nav_background.9.png b/packages/SystemUI/res/drawable-hdpi/nav_background.9.png
new file mode 100644
index 0000000..db36d2b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/nav_background.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_background.9.png b/packages/SystemUI/res/drawable-hdpi/status_background.9.png
new file mode 100644
index 0000000..66d14675
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/status_background.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/nav_background.9.png b/packages/SystemUI/res/drawable-mdpi/nav_background.9.png
new file mode 100644
index 0000000..45e6e8f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/nav_background.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_background.9.png b/packages/SystemUI/res/drawable-mdpi/status_background.9.png
new file mode 100644
index 0000000..49076d3
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/status_background.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/nav_background.9.png b/packages/SystemUI/res/drawable-xhdpi/nav_background.9.png
new file mode 100644
index 0000000..152e4ac
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/nav_background.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/status_background.9.png b/packages/SystemUI/res/drawable-xhdpi/status_background.9.png
new file mode 100644
index 0000000..75ec8f5
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/status_background.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/nav_background.9.png b/packages/SystemUI/res/drawable-xxhdpi/nav_background.9.png
new file mode 100644
index 0000000..cce2e062
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/nav_background.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/status_background.9.png b/packages/SystemUI/res/drawable-xxhdpi/status_background.9.png
new file mode 100644
index 0000000..679ca5d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/status_background.9.png
Binary files differ
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 2f0d0f9..ce94162 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -21,8 +21,6 @@
     <drawable name="ticker_background_color">#ff1d1d1d</drawable>
     <drawable name="system_bar_background">#ff000000</drawable>
     <color name="system_bar_background_semi_transparent">#66000000</color> <!-- 40% black -->
-    <color name="system_bar_background_gradient_start">#8c000000</color> <!-- 55% black -->
-    <color name="system_bar_background_gradient_end">#00000000</color>
     <color name="notification_panel_solid_background">#ff000000</color>
     <drawable name="status_bar_recents_app_thumbnail_background">#88000000</drawable>
     <color name="status_bar_recents_app_label_color">#ffffffff</color>
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 0c25c83..ce578e5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
@@ -23,8 +23,6 @@
 import android.content.res.Resources;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.GradientDrawable;
-import android.graphics.drawable.GradientDrawable.Orientation;
 import android.graphics.drawable.TransitionDrawable;
 import android.util.Log;
 import android.view.View;
@@ -50,15 +48,12 @@
 
     private final int mOpaque;
     private final int mSemiTransparent;
-    private final int mGradientStart;
-    private final int mGradientEnd;
 
     private int mMode;
     private ValueAnimator mColorDrawableAnimator;
     private boolean mColorDrawableShowing;
 
     private final ColorDrawable mColorDrawable;
-    private final GradientDrawable mGradientDrawable;
     private final TransitionDrawable mTransitionDrawable;
     private final AnimatorUpdateListener mAnimatorListener = new AnimatorUpdateListener() {
         @Override
@@ -67,7 +62,7 @@
         }
     };
 
-    public BarTransitions(View view) {
+    public BarTransitions(View view, int gradientResourceId) {
         mTag = "BarTransitions." + view.getClass().getSimpleName();
         mView = view;
         final Resources res = mView.getContext().getResources();
@@ -75,20 +70,14 @@
         if (DEBUG_COLORS) {
             mOpaque = 0xff0000ff;
             mSemiTransparent = 0x7f0000ff;
-            mGradientStart = 0x7fff0000;
-            mGradientEnd = 0x7f00ff00;
         } else {
             mOpaque = res.getColor(R.drawable.system_bar_background);
             mSemiTransparent = res.getColor(R.color.system_bar_background_semi_transparent);
-            mGradientStart = res.getColor(R.color.system_bar_background_gradient_start);
-            mGradientEnd = res.getColor(R.color.system_bar_background_gradient_end);
         }
 
         mColorDrawable = new ColorDrawable(mOpaque);
-        mGradientDrawable = new GradientDrawable(Orientation.BOTTOM_TOP,
-                new int[] { mGradientStart, mGradientEnd });
         mTransitionDrawable = new TransitionDrawable(
-                new Drawable[] { mGradientDrawable, mColorDrawable });
+                new Drawable[] { res.getDrawable(gradientResourceId), mColorDrawable });
         mTransitionDrawable.setCrossFadeEnabled(true);
         mTransitionDrawable.resetTransition();
         if (mSupportsTransitions) {
@@ -96,13 +85,6 @@
         }
     }
 
-    protected void setOrientation(GradientDrawable.Orientation orientation) {
-        if (orientation.equals(mGradientDrawable.getOrientation())) return; // GD doesn't check
-        if (DEBUG) Log.d(mTag, "setOrientation " + orientation);
-        mGradientDrawable.mutate();
-        mGradientDrawable.setOrientation(orientation);
-    }
-
     public int getMode() {
         return mMode;
     }
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 04922fb..4e92179 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java
@@ -19,7 +19,6 @@
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.content.Context;
-import android.graphics.drawable.GradientDrawable.Orientation;
 import android.os.ServiceManager;
 import android.view.MotionEvent;
 import android.view.View;
@@ -35,9 +34,11 @@
     private final IStatusBarService mBarService;
 
     private boolean mLightsOut;
+    private boolean mVertical;
+    private int mRequestedMode;
 
     public NavigationBarTransitions(NavigationBarView view) {
-        super(view);
+        super(view, R.drawable.nav_background);
         mView = view;
         mBarService = IStatusBarService.Stub.asInterface(
                 ServiceManager.getService(Context.STATUS_BAR_SERVICE));
@@ -50,7 +51,18 @@
     }
 
     public void setVertical(boolean isVertical) {
-        setOrientation(isVertical ? Orientation.RIGHT_LEFT : Orientation.BOTTOM_TOP);
+        mVertical = isVertical;
+        transitionTo(mRequestedMode, false /*animate*/);
+    }
+
+    @Override
+    public void transitionTo(int mode, boolean animate) {
+        mRequestedMode = mode;
+        if (mVertical && mode == MODE_TRANSPARENT) {
+            // fully transparent mode not allowed when vertical
+            mode = MODE_OPAQUE;
+        }
+        super.transitionTo(mode, animate);
     }
 
     @Override
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 a492d76..6bb6776 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
@@ -37,7 +37,7 @@
     private Animator mCurrentAnimation;
 
     public PhoneStatusBarTransitions(PhoneStatusBarView view) {
-        super(view);
+        super(view, R.drawable.status_background);
         mView = view;
         final Resources res = mView.getContext().getResources();
         mIconAlphaWhenOpaque = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1);
@@ -49,7 +49,6 @@
         mSignalCluster = mView.findViewById(R.id.signal_cluster);
         mBattery = mView.findViewById(R.id.battery);
         mClock = mView.findViewById(R.id.clock);
-        setOrientation(Orientation.TOP_BOTTOM);
         applyModeBackground(-1, getMode(), false /*animate*/);
         applyMode(getMode(), false /*animate*/);
     }
diff --git a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
index 42b8cce..3d5654a 100644
--- a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
+++ b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
@@ -147,7 +147,7 @@
         mHandler.removeMessages(0);
 
         if (!isFinishing()) {
-            if (mConfig.startTime != 0) {
+            if (mConfig.startTime != -1) {
                 long seconds = (SystemClock.elapsedRealtime() - mConfig.startTime) / 1000;
                 mDuration.setText(String.format("%02d:%02d:%02d",
                         seconds / 3600, seconds / 60 % 60, seconds % 60));
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 7f93c28..54a5107 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -374,6 +374,7 @@
     static final Rect mTmpOverscanFrame = new Rect();
     static final Rect mTmpContentFrame = new Rect();
     static final Rect mTmpVisibleFrame = new Rect();
+    static final Rect mTmpDecorFrame = new Rect();
     static final Rect mTmpNavigationFrame = new Rect();
 
     WindowState mTopFullscreenOpaqueWindowState;
@@ -1620,10 +1621,6 @@
                 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
                 WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
 
-            if (!compatInfo.supportsScreen()) {
-                win.addFlags(WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW);
-            }
-
             win.setDefaultIcon(icon);
             win.setDefaultLogo(logo);
 
@@ -1638,6 +1635,11 @@
             params.privateFlags |=
                     WindowManager.LayoutParams.PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED;
             params.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+
+            if (!compatInfo.supportsScreen()) {
+                params.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
+            }
+
             params.setTitle("Starting " + packageName);
 
             wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
@@ -2680,10 +2682,12 @@
         final Rect df = mTmpDisplayFrame;
         final Rect of = mTmpOverscanFrame;
         final Rect vf = mTmpVisibleFrame;
+        final Rect dcf = mTmpDecorFrame;
         pf.left = df.left = of.left = vf.left = mDockLeft;
         pf.top = df.top = of.top = vf.top = mDockTop;
         pf.right = df.right = of.right = vf.right = mDockRight;
         pf.bottom = df.bottom = of.bottom = vf.bottom = mDockBottom;
+        dcf.setEmpty();  // Decor frame N/A for system bars.
 
         if (isDefaultDisplay) {
             // For purposes of putting out fake window up to steal focus, we will
@@ -2706,7 +2710,7 @@
             } else if (mHideNavFakeWindow == null) {
                 mHideNavFakeWindow = mWindowManagerFuncs.addFakeWindow(
                         mHandler.getLooper(), mHideNavInputEventReceiverFactory,
-                        "hidden nav", WindowManager.LayoutParams.TYPE_HIDDEN_NAV_CONSUMER,
+                        "hidden nav", WindowManager.LayoutParams.TYPE_HIDDEN_NAV_CONSUMER, 0,
                         0, false, false, true);
             }
 
@@ -2781,7 +2785,7 @@
                 mStatusBarLayer = mNavigationBar.getSurfaceLayer();
                 // And compute the final frame.
                 mNavigationBar.computeFrameLw(mTmpNavigationFrame, mTmpNavigationFrame,
-                        mTmpNavigationFrame, mTmpNavigationFrame, mTmpNavigationFrame);
+                        mTmpNavigationFrame, mTmpNavigationFrame, mTmpNavigationFrame, dcf);
                 if (DEBUG_LAYOUT) Slog.i(TAG, "mNavigationBar frame: " + mTmpNavigationFrame);
                 if (mNavigationBarController.checkHiddenLw()) {
                     updateSysUiVisibility = true;
@@ -2806,7 +2810,7 @@
                 mStatusBarLayer = mStatusBar.getSurfaceLayer();
 
                 // Let the status bar determine its size.
-                mStatusBar.computeFrameLw(pf, df, vf, vf, vf);
+                mStatusBar.computeFrameLw(pf, df, vf, vf, vf, dcf);
 
                 // For layout, the status bar is always at the top with our fixed height.
                 mStableTop = mUnrestrictedScreenTop + mStatusBarHeight;
@@ -2854,11 +2858,7 @@
 
     /** {@inheritDoc} */
     @Override
-    public int getSystemDecorRectLw(Rect systemRect) {
-        systemRect.left = mSystemLeft;
-        systemRect.top = mSystemTop;
-        systemRect.right = mSystemRight;
-        systemRect.bottom = mSystemBottom;
+    public int getSystemDecorLayerLw() {
         if (mStatusBar != null) return mStatusBar.getSurfaceLayer();
         if (mNavigationBar != null) return mNavigationBar.getSurfaceLayer();
         return 0;
@@ -2961,6 +2961,8 @@
         final Rect of = mTmpOverscanFrame;
         final Rect cf = mTmpContentFrame;
         final Rect vf = mTmpVisibleFrame;
+        final Rect dcf = mTmpDecorFrame;
+        dcf.setEmpty();
 
         final boolean hasNavBar = (isDefaultDisplay && mHasNavigationBar
                 && mNavigationBar != null && mNavigationBar.isVisibleLw());
@@ -2991,6 +2993,27 @@
             attrs.gravity = Gravity.BOTTOM;
             mDockLayer = win.getSurfaceLayer();
         } else {
+
+            // Default policy decor for the default display
+            dcf.left = mSystemLeft;
+            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) {
+                    // Ensure policy decor includes status bar
+                    dcf.top = mStableTop;
+                }
+                if ((sysUiFl & View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION) == 0) {
+                    // Ensure policy decor includes navigation bar
+                    dcf.bottom = mStableBottom;
+                    dcf.right = mStableRight;
+                }
+            }
+
             if ((fl & (FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR))
                     == (FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR)) {
                 if (DEBUG_LAYOUT) Slog.v(TAG, "layoutWindowLw(" + attrs.getTitle() 
@@ -3026,7 +3049,7 @@
                         if (DEBUG_LAYOUT) Slog.v(TAG, String.format(
                                         "Laying out status bar window: (%d,%d - %d,%d)",
                                         pf.left, pf.top, pf.right, pf.bottom));
-                    } else if ((attrs.flags&FLAG_LAYOUT_IN_OVERSCAN) != 0
+                    } else if ((fl & FLAG_LAYOUT_IN_OVERSCAN) != 0
                             && attrs.type >= WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW
                             && attrs.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW) {
                         // Asking to layout into the overscan region, so give it that pure
@@ -3071,7 +3094,7 @@
                         of.bottom = mUnrestrictedScreenTop + mUnrestrictedScreenHeight;
                     }
 
-                    if ((attrs.flags&FLAG_FULLSCREEN) == 0) {
+                    if ((fl & FLAG_FULLSCREEN) == 0) {
                         if (adjust != SOFT_INPUT_ADJUST_RESIZE) {
                             cf.left = mDockLeft;
                             cf.top = mDockTop;
@@ -3093,7 +3116,6 @@
                         cf.right = mRestrictedScreenLeft + mRestrictedScreenWidth;
                         cf.bottom = mRestrictedScreenTop + mRestrictedScreenHeight;
                     }
-
                     applyStableConstraints(sysUiFl, fl, cf);
                     if (adjust != SOFT_INPUT_ADJUST_NOTHING) {
                         vf.left = mCurLeft;
@@ -3164,7 +3186,7 @@
                             = mUnrestrictedScreenLeft + mUnrestrictedScreenWidth;
                     pf.bottom = df.bottom = of.bottom = cf.bottom
                             = mUnrestrictedScreenTop + mUnrestrictedScreenHeight;
-                } else if ((attrs.flags & FLAG_LAYOUT_IN_OVERSCAN) != 0
+                } else if ((fl & FLAG_LAYOUT_IN_OVERSCAN) != 0
                         && attrs.type >= WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW
                         && attrs.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW) {
                     // Asking to layout into the overscan region, so give it that pure
@@ -3275,9 +3297,10 @@
                 + String.format(" flags=0x%08x", fl)
                 + " pf=" + pf.toShortString() + " df=" + df.toShortString()
                 + " of=" + of.toShortString()
-                + " cf=" + cf.toShortString() + " vf=" + vf.toShortString());
+                + " cf=" + cf.toShortString() + " vf=" + vf.toShortString()
+                + " dcf=" + dcf.toShortString());
 
-        win.computeFrameLw(pf, df, of, cf, vf);
+        win.computeFrameLw(pf, df, of, cf, vf, dcf);
 
         // Dock windows carve out the bottom of the screen, so normal windows
         // can't appear underneath them.
diff --git a/services/input/InputDispatcher.cpp b/services/input/InputDispatcher.cpp
index 9e7a15d..274009f 100644
--- a/services/input/InputDispatcher.cpp
+++ b/services/input/InputDispatcher.cpp
@@ -474,6 +474,7 @@
         const InputWindowInfo* windowInfo = windowHandle->getInfo();
         if (windowInfo->displayId == displayId) {
             int32_t flags = windowInfo->layoutParamsFlags;
+            int32_t privateFlags = windowInfo->layoutParamsPrivateFlags;
 
             if (windowInfo->visible) {
                 if (!(flags & InputWindowInfo::FLAG_NOT_TOUCHABLE)) {
@@ -486,7 +487,7 @@
                 }
             }
 
-            if (flags & InputWindowInfo::FLAG_SYSTEM_ERROR) {
+            if (privateFlags & InputWindowInfo::PRIVATE_FLAG_SYSTEM_ERROR) {
                 // Error window is on top but not visible, so touch is dropped.
                 return NULL;
             }
@@ -1215,13 +1216,14 @@
                 continue; // wrong display
             }
 
-            int32_t flags = windowInfo->layoutParamsFlags;
-            if (flags & InputWindowInfo::FLAG_SYSTEM_ERROR) {
+            int32_t privateFlags = windowInfo->layoutParamsPrivateFlags;
+            if (privateFlags & InputWindowInfo::PRIVATE_FLAG_SYSTEM_ERROR) {
                 if (topErrorWindowHandle == NULL) {
                     topErrorWindowHandle = windowHandle;
                 }
             }
 
+            int32_t flags = windowInfo->layoutParamsFlags;
             if (windowInfo->visible) {
                 if (! (flags & InputWindowInfo::FLAG_NOT_TOUCHABLE)) {
                     isTouchModal = (flags & (InputWindowInfo::FLAG_NOT_FOCUSABLE
diff --git a/services/input/InputWindow.h b/services/input/InputWindow.h
index 136870a..28fa7ab 100644
--- a/services/input/InputWindow.h
+++ b/services/input/InputWindow.h
@@ -59,13 +59,13 @@
         FLAG_TURN_SCREEN_ON = 0x00200000,
         FLAG_DISMISS_KEYGUARD = 0x00400000,
         FLAG_SPLIT_TOUCH = 0x00800000,
-        FLAG_HARDWARE_ACCELERATED = 0x01000000,
-        FLAG_HARDWARE_ACCELERATED_SYSTEM = 0x02000000,
-        FLAG_SLIPPERY = 0x04000000,
-        FLAG_NEEDS_MENU_KEY = 0x08000000,
-        FLAG_KEEP_SURFACE_WHILE_ANIMATING = 0x10000000,
-        FLAG_COMPATIBLE_WINDOW = 0x20000000,
-        FLAG_SYSTEM_ERROR = 0x40000000,
+        FLAG_SLIPPERY = 0x20000000,
+        FLAG_NEEDS_MENU_KEY = 0x40000000,
+    };
+
+    // Private Window flags from WindowManager.LayoutParams
+    enum {
+        PRIVATE_FLAG_SYSTEM_ERROR = 0x00000100,
     };
 
     // Window types from WindowManager.LayoutParams
@@ -117,6 +117,7 @@
     sp<InputChannel> inputChannel;
     String8 name;
     int32_t layoutParamsFlags;
+    int32_t layoutParamsPrivateFlags;
     int32_t layoutParamsType;
     nsecs_t dispatchingTimeout;
     int32_t frameLeft;
diff --git a/services/java/com/android/server/accessibility/ScreenMagnifier.java b/services/java/com/android/server/accessibility/ScreenMagnifier.java
index 1bf2c42..5f12cf4 100644
--- a/services/java/com/android/server/accessibility/ScreenMagnifier.java
+++ b/services/java/com/android/server/accessibility/ScreenMagnifier.java
@@ -502,6 +502,7 @@
 
         public MagnifiedContentInteractonStateHandler(Context context) {
             mScaleGestureDetector = new ScaleGestureDetector(context, this);
+            mScaleGestureDetector.setQuickScaleEnabled(false);
             mGestureDetector = new GestureDetector(context, this);
         }
 
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index f2ff9ca..f23bcba 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -254,7 +254,7 @@
     static final boolean IS_USER_BUILD = "user".equals(Build.TYPE);
 
     // Maximum number of recent tasks that we can remember.
-    static final int MAX_RECENT_TASKS = 20;
+    static final int MAX_RECENT_TASKS = ActivityManager.isLowRamDeviceStatic() ? 10 : 20;
 
     // Amount of time after a call to stopAppSwitches() during which we will
     // prevent further untrusted switches from happening.
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 28c87d1..45b30f1 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -121,6 +121,9 @@
     // convertToTranslucent().
     static final long TRANSLUCENT_CONVERSION_TIMEOUT = 2000;
 
+    static final boolean SCREENSHOT_FORCE_565 = ActivityManager
+            .isLowRamDeviceStatic() ? true : false;
+
     enum ActivityState {
         INITIALIZING,
         RESUMED,
@@ -691,10 +694,10 @@
                     || mLastScreenshotBitmap.getHeight() != h) {
                 mLastScreenshotActivity = who;
                 mLastScreenshotBitmap = mWindowManager.screenshotApplications(
-                        who.appToken, Display.DEFAULT_DISPLAY, w, h);
+                        who.appToken, Display.DEFAULT_DISPLAY, w, h, SCREENSHOT_FORCE_565);
             }
             if (mLastScreenshotBitmap != null) {
-                return mLastScreenshotBitmap.copy(Config.ARGB_8888, true);
+                return mLastScreenshotBitmap.copy(mLastScreenshotBitmap.getConfig(), true);
             }
         }
         return null;
diff --git a/services/java/com/android/server/am/AppErrorDialog.java b/services/java/com/android/server/am/AppErrorDialog.java
index fffa75e..0ba62c5 100644
--- a/services/java/com/android/server/am/AppErrorDialog.java
+++ b/services/java/com/android/server/am/AppErrorDialog.java
@@ -16,8 +16,6 @@
 
 package com.android.server.am;
 
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR;
-
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.res.Resources;
@@ -72,10 +70,10 @@
         }
 
         setTitle(res.getText(com.android.internal.R.string.aerr_title));
-        getWindow().addFlags(PRIVATE_FLAG_SYSTEM_ERROR);
         WindowManager.LayoutParams attrs = getWindow().getAttributes();
         attrs.setTitle("Application Error: " + app.info.processName);
-        attrs.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+        attrs.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR
+                | WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
         getWindow().setAttributes(attrs);
         if (app.persistent) {
             getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
diff --git a/services/java/com/android/server/am/AppNotRespondingDialog.java b/services/java/com/android/server/am/AppNotRespondingDialog.java
index 4de272d..f4c1664 100644
--- a/services/java/com/android/server/am/AppNotRespondingDialog.java
+++ b/services/java/com/android/server/am/AppNotRespondingDialog.java
@@ -16,8 +16,6 @@
 
 package com.android.server.am;
 
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR;
-
 import android.content.ActivityNotFoundException;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -94,10 +92,10 @@
         if (aboveSystem) {
             getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
         }
-        getWindow().addFlags(PRIVATE_FLAG_SYSTEM_ERROR);
         WindowManager.LayoutParams attrs = getWindow().getAttributes();
         attrs.setTitle("Application Not Responding: " + app.info.processName);
-        attrs.privateFlags = WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+        attrs.privateFlags = WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR |
+                WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
         getWindow().setAttributes(attrs);
     }
 
diff --git a/services/java/com/android/server/am/StrictModeViolationDialog.java b/services/java/com/android/server/am/StrictModeViolationDialog.java
index 5fee0d3..fda1ec1 100644
--- a/services/java/com/android/server/am/StrictModeViolationDialog.java
+++ b/services/java/com/android/server/am/StrictModeViolationDialog.java
@@ -74,7 +74,7 @@
         }
 
         setTitle(res.getText(com.android.internal.R.string.aerr_title));
-        getWindow().addFlags(PRIVATE_FLAG_SYSTEM_ERROR);
+        getWindow().addPrivateFlags(PRIVATE_FLAG_SYSTEM_ERROR);
         getWindow().setTitle("Strict Mode Violation: " + app.info.processName);
 
         // After the timeout, pretend the user clicked the quit button
diff --git a/services/java/com/android/server/connectivity/Vpn.java b/services/java/com/android/server/connectivity/Vpn.java
index 8cc5b4f..45797b2 100644
--- a/services/java/com/android/server/connectivity/Vpn.java
+++ b/services/java/com/android/server/connectivity/Vpn.java
@@ -1096,6 +1096,9 @@
 
                 // Here is the last step and it must be done synchronously.
                 synchronized (Vpn.this) {
+                    // Set the start time
+                    mConfig.startTime = SystemClock.elapsedRealtime();
+
                     // Check if the thread is interrupted while we are waiting.
                     checkpoint(false);
 
diff --git a/services/java/com/android/server/input/InputWindowHandle.java b/services/java/com/android/server/input/InputWindowHandle.java
index ad4fdd1..9eb9a33 100644
--- a/services/java/com/android/server/input/InputWindowHandle.java
+++ b/services/java/com/android/server/input/InputWindowHandle.java
@@ -44,6 +44,7 @@
 
     // Window layout params attributes.  (WindowManager.LayoutParams)
     public int layoutParamsFlags;
+    public int layoutParamsPrivateFlags;
     public int layoutParamsType;
 
     // Dispatching timeout.
diff --git a/services/java/com/android/server/wm/DimLayer.java b/services/java/com/android/server/wm/DimLayer.java
index 39e664f..c189ddd 100644
--- a/services/java/com/android/server/wm/DimLayer.java
+++ b/services/java/com/android/server/wm/DimLayer.java
@@ -48,9 +48,13 @@
     /** Time in milliseconds to take to transition from mStartAlpha to mTargetAlpha */
     long mDuration;
 
-    DimLayer(WindowManagerService service, DisplayContent displayContent) {
-        mDisplayContent = displayContent;
-        final int displayId = displayContent.getDisplayId();
+    /** Owning stack */
+    final TaskStack mStack;
+
+    DimLayer(WindowManagerService service, TaskStack stack) {
+        mStack = stack;
+        mDisplayContent = stack.getDisplayContent();
+        final int displayId = mDisplayContent.getDisplayId();
         if (DEBUG) Slog.v(TAG, "Ctor: displayId=" + displayId);
         SurfaceControl.openTransaction();
         try {
@@ -160,22 +164,29 @@
             return;
         }
 
-        /*
-        // Set surface size to screen size.
-        final DisplayInfo info = mDisplayContent.getDisplayInfo();
-        // Multiply by 1.5 so that rotating a frozen surface that includes this does not expose a
-        // corner.
-        final int dw = (int) (info.logicalWidth * 1.5);
-        final int dh = (int) (info.logicalHeight * 1.5);
-        // back off position so 1/4 of Surface is before and 1/4 is after.
-        final float xPos = -1 * dw / 6;
-        final float yPos = -1 * dh / 6;
-        */
+        final int dw, dh;
+        final float xPos, yPos;
+        if (mStack.hasSibling()) {
+            dw = mBounds.width();
+            dh = mBounds.height();
+            xPos = mBounds.left;
+            yPos = mBounds.right;
+        } else {
+            // Set surface size to screen size.
+            final DisplayInfo info = mDisplayContent.getDisplayInfo();
+            // Multiply by 1.5 so that rotating a frozen surface that includes this does not expose a
+            // corner.
+            dw = (int) (info.logicalWidth * 1.5);
+            dh = (int) (info.logicalHeight * 1.5);
+            // back off position so 1/4 of Surface is before and 1/4 is after.
+            xPos = -1 * dw / 6;
+            yPos = -1 * dh / 6;
+        }
 
         if (!mLastBounds.equals(mBounds) || mLayer != layer) {
             try {
-                mDimSurface.setPosition(mBounds.left, mBounds.top);
-                mDimSurface.setSize(mBounds.width(), mBounds.height());
+                mDimSurface.setPosition(xPos, yPos);
+                mDimSurface.setSize(dw, dh);
                 mDimSurface.setLayer(layer);
             } catch (RuntimeException e) {
                 Slog.w(TAG, "Failure setting size or layer", e);
diff --git a/services/java/com/android/server/wm/DragState.java b/services/java/com/android/server/wm/DragState.java
index 745b886..a737939 100644
--- a/services/java/com/android/server/wm/DragState.java
+++ b/services/java/com/android/server/wm/DragState.java
@@ -115,6 +115,7 @@
             mDragWindowHandle.inputChannel = mServerChannel;
             mDragWindowHandle.layer = getDragLayerLw();
             mDragWindowHandle.layoutParamsFlags = 0;
+            mDragWindowHandle.layoutParamsPrivateFlags = 0;
             mDragWindowHandle.layoutParamsType = WindowManager.LayoutParams.TYPE_DRAG;
             mDragWindowHandle.dispatchingTimeoutNanos =
                     WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
diff --git a/services/java/com/android/server/wm/FakeWindowImpl.java b/services/java/com/android/server/wm/FakeWindowImpl.java
index 5ec72cc..5a3471b 100644
--- a/services/java/com/android/server/wm/FakeWindowImpl.java
+++ b/services/java/com/android/server/wm/FakeWindowImpl.java
@@ -40,8 +40,8 @@
 
     public FakeWindowImpl(WindowManagerService service,
             Looper looper, InputEventReceiver.Factory inputEventReceiverFactory,
-            String name, int windowType, int layoutParamsFlags, boolean canReceiveKeys,
-            boolean hasFocus, boolean touchFullscreen) {
+            String name, int windowType, int layoutParamsFlags, int layoutParamsPrivateFlags,
+            boolean canReceiveKeys, boolean hasFocus, boolean touchFullscreen) {
         mService = service;
 
         InputChannel[] channels = InputChannel.openInputChannelPair(name);
@@ -63,6 +63,7 @@
         mWindowLayer = getLayerLw(windowType);
         mWindowHandle.layer = mWindowLayer;
         mWindowHandle.layoutParamsFlags = layoutParamsFlags;
+        mWindowHandle.layoutParamsPrivateFlags = layoutParamsPrivateFlags;
         mWindowHandle.layoutParamsType = windowType;
         mWindowHandle.dispatchingTimeoutNanos =
                 WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
diff --git a/services/java/com/android/server/wm/InputMonitor.java b/services/java/com/android/server/wm/InputMonitor.java
index 2e13fe2..3d2ec45 100644
--- a/services/java/com/android/server/wm/InputMonitor.java
+++ b/services/java/com/android/server/wm/InputMonitor.java
@@ -166,7 +166,7 @@
     }
 
     private void addInputWindowHandleLw(final InputWindowHandle inputWindowHandle,
-            final WindowState child, int flags, final int type,
+            final WindowState child, int flags, int privateFlags, final int type,
             final boolean isVisible, final boolean hasFocus, final boolean hasWallpaper) {
         // Add a window to our list of input windows.
         inputWindowHandle.name = child.toString();
@@ -181,6 +181,7 @@
             child.getTouchableRegion(inputWindowHandle.touchableRegion);
         }
         inputWindowHandle.layoutParamsFlags = flags;
+        inputWindowHandle.layoutParamsPrivateFlags = privateFlags;
         inputWindowHandle.layoutParamsType = type;
         inputWindowHandle.dispatchingTimeoutNanos = child.getInputDispatchingTimeoutNanos();
         inputWindowHandle.visible = isVisible;
@@ -274,6 +275,7 @@
                 }
 
                 final int flags = child.mAttrs.flags;
+                final int privateFlags = child.mAttrs.privateFlags;
                 final int type = child.mAttrs.type;
 
                 final boolean hasFocus = (child == mInputFocus);
@@ -293,13 +295,14 @@
                     final WindowState u = universeBackground.mWin;
                     if (u.mInputChannel != null && u.mInputWindowHandle != null) {
                         addInputWindowHandleLw(u.mInputWindowHandle, u, u.mAttrs.flags,
-                                u.mAttrs.type, true, u == mInputFocus, false);
+                                u.mAttrs.privateFlags, u.mAttrs.type,
+                                true, u == mInputFocus, false);
                     }
                     addedUniverse = true;
                 }
 
                 if (child.mWinAnimator != universeBackground) {
-                    addInputWindowHandleLw(inputWindowHandle, child, flags, type,
+                    addInputWindowHandleLw(inputWindowHandle, child, flags, privateFlags, type,
                             isVisible, hasFocus, hasWallpaper);
                 }
             }
diff --git a/services/java/com/android/server/wm/TaskStack.java b/services/java/com/android/server/wm/TaskStack.java
index 7bb6734..2347a19 100644
--- a/services/java/com/android/server/wm/TaskStack.java
+++ b/services/java/com/android/server/wm/TaskStack.java
@@ -71,8 +71,8 @@
         mStackId = stackId;
         mDisplayContent = displayContent;
         final int displayId = displayContent.getDisplayId();
-        mDimLayer = new DimLayer(service, displayContent);
-        mAnimationBackgroundSurface = new DimLayer(service, displayContent);
+        mDimLayer = new DimLayer(service, this);
+        mAnimationBackgroundSurface = new DimLayer(service, this);
     }
 
     DisplayContent getDisplayContent() {
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 76ba0ce..2e91e03 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -60,6 +60,7 @@
 import android.content.res.CompatibilityInfo;
 import android.content.res.Configuration;
 import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
 import android.graphics.Canvas;
 import android.graphics.Matrix;
 import android.graphics.PixelFormat;
@@ -440,7 +441,6 @@
             = new ArrayList<IRotationWatcher>();
     int mDeferredRotationPauseCount;
 
-    final Rect mSystemDecorRect = new Rect();
     int mSystemDecorLayer = 0;
     final Rect mScreenRect = new Rect();
 
@@ -2793,7 +2793,8 @@
             if (DEBUG_LAYOUT) Slog.v(TAG, "Relayout " + win + ": viewVisibility=" + viewVisibility
                     + " req=" + requestedWidth + "x" + requestedHeight + " " + win.mAttrs);
 
-            win.mEnforceSizeCompat = (win.mAttrs.flags & PRIVATE_FLAG_COMPATIBLE_WINDOW) != 0;
+            win.mEnforceSizeCompat =
+                    (win.mAttrs.privateFlags & PRIVATE_FLAG_COMPATIBLE_WINDOW) != 0;
 
             if ((attrChanges & WindowManager.LayoutParams.ALPHA_CHANGED) != 0) {
                 winAnimator.mAlpha = attrs.alpha;
@@ -3379,6 +3380,18 @@
         Binder.restoreCallingIdentity(origId);
     }
 
+    private Task createTask(int taskId, int stackId, int userId, AppWindowToken atoken) {
+        final TaskStack stack = mStackIdToStack.get(stackId);
+        if (stack == null) {
+            throw new IllegalArgumentException("addAppToken: invalid stackId=" + stackId);
+        }
+        Task task = new Task(atoken, stack, userId);
+        stack.addTask(task, true);
+        stack.getDisplayContent().moveStack(stack, true);
+        mTaskIdToTask.put(taskId, task);
+        return task;
+    }
+
     @Override
     public void addAppToken(int addPos, IApplicationToken token, int taskId, int stackId,
             int requestedOrientation, boolean fullscreen, boolean showWhenLocked, int userId) {
@@ -3418,14 +3431,7 @@
 
             Task task = mTaskIdToTask.get(taskId);
             if (task == null) {
-                TaskStack stack = mStackIdToStack.get(stackId);
-                if (stack == null) {
-                    throw new IllegalArgumentException("addAppToken: invalid stackId=" + stackId);
-                }
-                task = new Task(atoken, stack, userId);
-                stack.addTask(task, true);
-                stack.getDisplayContent().moveStack(stack, true);
-                mTaskIdToTask.put(taskId, task);
+                task = createTask(taskId, stackId, userId, atoken);
             } else {
                 task.addAppToken(addPos, atoken);
             }
@@ -3459,8 +3465,7 @@
             atoken.groupId = groupId;
             Task newTask = mTaskIdToTask.get(groupId);
             if (newTask == null) {
-                throw new IllegalStateException("setAppGroupId: groupId=" + groupId
-                        + " does not exist");
+                newTask = createTask(groupId, oldTask.mStack.mStackId, oldTask.mUserId, atoken);
             }
             newTask.mAppTokens.add(atoken);
         }
@@ -4786,6 +4791,7 @@
             synchronized(mWindowMap) {
                 Task task = mTaskIdToTask.get(taskId);
                 if (task == null) {
+                    // Normal behavior, addAppToken will be called next and task will be created.
                     return;
                 }
                 final TaskStack stack = task.mStack;
@@ -5508,9 +5514,12 @@
      * @param displayId the Display to take a screenshot of.
      * @param width the width of the target bitmap
      * @param height the height of the target bitmap
+     * @param force565 if true the returned bitmap will be RGB_565, otherwise it
+     *                 will be the same config as the surface
      */
     @Override
-    public Bitmap screenshotApplications(IBinder appToken, int displayId, int width, int height) {
+    public Bitmap screenshotApplications(IBinder appToken, int displayId, int width,
+            int height, boolean force565) {
         if (!checkCallingPermission(android.Manifest.permission.READ_FRAME_BUFFER,
                 "screenshotApplications()")) {
             throw new SecurityException("Requires READ_FRAME_BUFFER permission");
@@ -5713,7 +5722,7 @@
             return null;
         }
 
-        Bitmap bm = Bitmap.createBitmap(width, height, rawss.getConfig());
+        Bitmap bm = Bitmap.createBitmap(width, height, force565 ? Config.RGB_565 : rawss.getConfig());
         frame.scale(scale);
         Matrix matrix = new Matrix();
         ScreenRotationAnimation.createRotationMatrix(rot, dw, dh, matrix);
@@ -7918,11 +7927,8 @@
     }
 
     final void rebuildAppWindowListLocked() {
-        final int numDisplays = mDisplayContents.size();
-        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
-            final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx);
-            rebuildAppWindowListLocked(displayContent);
-        }
+        // TODO: Multidisplay, when ActivityStacks and tasks exist on more than one display.
+        rebuildAppWindowListLocked(getDefaultDisplayContentLocked());
     }
 
     private void rebuildAppWindowListLocked(final DisplayContent displayContent) {
@@ -8197,7 +8203,7 @@
         mPolicy.beginLayoutLw(isDefaultDisplay, dw, dh, mRotation);
         if (isDefaultDisplay) {
             // Not needed on non-default displays.
-            mSystemDecorLayer = mPolicy.getSystemDecorRectLw(mSystemDecorRect);
+            mSystemDecorLayer = mPolicy.getSystemDecorLayerLw();
             mScreenRect.set(0, 0, dw, dh);
         }
 
@@ -10117,12 +10123,13 @@
     @Override
     public FakeWindow addFakeWindow(Looper looper,
             InputEventReceiver.Factory inputEventReceiverFactory,
-            String name, int windowType, int layoutParamsFlags, boolean canReceiveKeys,
-            boolean hasFocus, boolean touchFullscreen) {
+            String name, int windowType, int layoutParamsFlags, int layoutParamsPrivateFlags,
+            boolean canReceiveKeys, boolean hasFocus, boolean touchFullscreen) {
         synchronized (mWindowMap) {
             FakeWindowImpl fw = new FakeWindowImpl(this, looper, inputEventReceiverFactory,
                     name, windowType,
-                    layoutParamsFlags, canReceiveKeys, hasFocus, touchFullscreen);
+                    layoutParamsFlags, layoutParamsPrivateFlags, canReceiveKeys,
+                    hasFocus, touchFullscreen);
             int i=0;
             while (i<mFakeWindows.size()) {
                 if (mFakeWindows.get(i).mWindowLayer <= fw.mWindowLayer) {
@@ -10405,8 +10412,7 @@
                 }
                 pw.println();
         if (dumpAll) {
-            pw.print("  mSystemDecorRect="); pw.print(mSystemDecorRect.toShortString());
-                    pw.print(" mSystemDecorLayer="); pw.print(mSystemDecorLayer);
+            pw.print(" mSystemDecorLayer="); pw.print(mSystemDecorLayer);
                     pw.print(" mScreenRect="); pw.println(mScreenRect.toShortString());
             if (mLastStatusBarVisibility != 0) {
                 pw.print("  mLastStatusBarVisibility=0x");
diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java
index d56e225..2d08792 100644
--- a/services/java/com/android/server/wm/WindowState.java
+++ b/services/java/com/android/server/wm/WindowState.java
@@ -218,6 +218,7 @@
     final Rect mContentFrame = new Rect();
     final Rect mParentFrame = new Rect();
     final Rect mVisibleFrame = new Rect();
+    final Rect mDecorFrame = new Rect();
 
     boolean mContentChanged;
 
@@ -332,7 +333,7 @@
         mContext = mService.mContext;
         DeathRecipient deathRecipient = new DeathRecipient();
         mSeq = seq;
-        mEnforceSizeCompat = (mAttrs.flags & PRIVATE_FLAG_COMPATIBLE_WINDOW) != 0;
+        mEnforceSizeCompat = (mAttrs.privateFlags & PRIVATE_FLAG_COMPATIBLE_WINDOW) != 0;
         if (WindowManagerService.localLOGV) Slog.v(
             TAG, "Window " + this + " client=" + c.asBinder()
             + " token=" + token + " (" + mAttrs.token + ")" + " params=" + a);
@@ -458,7 +459,7 @@
     }
 
     @Override
-    public void computeFrameLw(Rect pf, Rect df, Rect of, Rect cf, Rect vf) {
+    public void computeFrameLw(Rect pf, Rect df, Rect of, Rect cf, Rect vf, Rect dcf) {
         mHaveFrame = true;
 
         TaskStack stack = mAppToken != null ? getStack() : null;
@@ -524,6 +525,7 @@
         mOverscanFrame.set(of);
         mContentFrame.set(cf);
         mVisibleFrame.set(vf);
+        mDecorFrame.set(dcf);
 
         final int fw = mFrame.width();
         final int fh = mFrame.height();
@@ -1404,6 +1406,8 @@
             pw.print(prefix); pw.print("    content="); mContentFrame.printShortString(pw);
                     pw.print(" visible="); mVisibleFrame.printShortString(pw);
                     pw.println();
+            pw.print(prefix); pw.print("    decor="); mDecorFrame.printShortString(pw);
+                    pw.println();
             pw.print(prefix); pw.print("Cur insets: overscan=");
                     mOverscanInsets.printShortString(pw);
                     pw.print(" content="); mContentInsets.printShortString(pw);
diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java
index 533f626..e2fae89 100644
--- a/services/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/java/com/android/server/wm/WindowStateAnimator.java
@@ -1100,12 +1100,14 @@
             } else {
                 applyDecorRect(mService.mScreenRect);
             }
-        } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND) {
-            // The universe background isn't cropped.
+        } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND
+                || w.mDecorFrame.isEmpty()) {
+            // The universe background isn't cropped, nor windows without policy decor.
             w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(),
                     w.mCompatFrame.height());
         } else {
-            applyDecorRect(mService.mSystemDecorRect);
+            // Crop to the system decor specified by policy.
+            applyDecorRect(w.mDecorFrame);
         }
 
         if (!w.mSystemDecorRect.equals(w.mLastSystemDecorRect)) {
diff --git a/services/jni/com_android_server_input_InputWindowHandle.cpp b/services/jni/com_android_server_input_InputWindowHandle.cpp
index bbb27d3..82e3dad 100644
--- a/services/jni/com_android_server_input_InputWindowHandle.cpp
+++ b/services/jni/com_android_server_input_InputWindowHandle.cpp
@@ -35,6 +35,7 @@
     jfieldID inputChannel;
     jfieldID name;
     jfieldID layoutParamsFlags;
+    jfieldID layoutParamsPrivateFlags;
     jfieldID layoutParamsType;
     jfieldID dispatchingTimeoutNanos;
     jfieldID frameLeft;
@@ -109,6 +110,8 @@
 
     mInfo->layoutParamsFlags = env->GetIntField(obj,
             gInputWindowHandleClassInfo.layoutParamsFlags);
+    mInfo->layoutParamsPrivateFlags = env->GetIntField(obj,
+            gInputWindowHandleClassInfo.layoutParamsPrivateFlags);
     mInfo->layoutParamsType = env->GetIntField(obj,
             gInputWindowHandleClassInfo.layoutParamsType);
     mInfo->dispatchingTimeout = env->GetLongField(obj,
@@ -244,6 +247,9 @@
     GET_FIELD_ID(gInputWindowHandleClassInfo.layoutParamsFlags, clazz,
             "layoutParamsFlags", "I");
 
+    GET_FIELD_ID(gInputWindowHandleClassInfo.layoutParamsPrivateFlags, clazz,
+            "layoutParamsPrivateFlags", "I");
+
     GET_FIELD_ID(gInputWindowHandleClassInfo.layoutParamsType, clazz,
             "layoutParamsType", "I");
 
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index fd7a645..225b0c3 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -266,8 +266,8 @@
     }
 
     @Override
-    public Bitmap screenshotApplications(IBinder arg0, int displayId, int arg1, int arg2)
-            throws RemoteException {
+    public Bitmap screenshotApplications(IBinder arg0, int displayId, int arg1,
+            int arg2, boolean arg3) throws RemoteException {
         // TODO Auto-generated method stub
         return null;
     }