Merge "Fix resource-loading code for TransitionSet" into klp-dev
diff --git a/api/current.txt b/api/current.txt
index 4967b52..1ad4377 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -19368,12 +19368,6 @@
     method public android.print.PrintDocumentInfo.Builder setPageCount(int);
   }
 
-  public class PrintFileDocumentAdapter extends android.print.PrintDocumentAdapter {
-    ctor public PrintFileDocumentAdapter(android.content.Context, java.io.File, android.print.PrintDocumentInfo);
-    method public void onLayout(android.print.PrintAttributes, android.print.PrintAttributes, android.os.CancellationSignal, android.print.PrintDocumentAdapter.LayoutResultCallback, android.os.Bundle);
-    method public void onWrite(android.print.PageRange[], android.os.ParcelFileDescriptor, android.os.CancellationSignal, android.print.PrintDocumentAdapter.WriteResultCallback);
-  }
-
   public final class PrintJob {
     method public void cancel();
     method public android.print.PrintJobId getId();
@@ -19403,10 +19397,8 @@
     method public android.print.PageRange[] getPages();
     method public android.print.PrinterId getPrinterId();
     method public int getState();
-    method public java.lang.String getTag();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator CREATOR;
-    field public static final int PRINT_JOB_ID_UNDEFINED = -1; // 0xffffffff
     field public static final int STATE_BLOCKED = 4; // 0x4
     field public static final int STATE_CANCELED = 7; // 0x7
     field public static final int STATE_COMPLETED = 5; // 0x5
@@ -19501,6 +19493,7 @@
     method public android.printservice.PrintDocument getDocument();
     method public android.print.PrintJobId getId();
     method public android.print.PrintJobInfo getInfo();
+    method public java.lang.String getTag();
     method public boolean isBlocked();
     method public boolean isCancelled();
     method public boolean isCompleted();
diff --git a/core/java/android/print/PrintFileDocumentAdapter.java b/core/java/android/print/PrintFileDocumentAdapter.java
index c3a23a5..5d655bf 100644
--- a/core/java/android/print/PrintFileDocumentAdapter.java
+++ b/core/java/android/print/PrintFileDocumentAdapter.java
@@ -41,6 +41,8 @@
  * spooling the data, so you can delete the file if it is a
  * temporary one. To achieve this one must override {@link #onFinish()}
  * and delete the file yourself.
+ *
+ * @hide
  */
 public class PrintFileDocumentAdapter extends PrintDocumentAdapter {
 
diff --git a/core/java/android/print/PrintJobInfo.java b/core/java/android/print/PrintJobInfo.java
index e5d06a2..ccb4f44 100644
--- a/core/java/android/print/PrintJobInfo.java
+++ b/core/java/android/print/PrintJobInfo.java
@@ -26,9 +26,6 @@
  */
 public final class PrintJobInfo implements Parcelable {
 
-    /** Undefined print job id. */
-    public static final int PRINT_JOB_ID_UNDEFINED = -1;
-
     /**
      * Constant for matching any print job state.
      *
@@ -356,6 +353,8 @@
      * Gets the optional tag assigned by a print service.
      *
      * @return The tag.
+     *
+     * @hide
      */
     public String getTag() {
         return mTag;
diff --git a/core/java/android/printservice/PrintJob.java b/core/java/android/printservice/PrintJob.java
index 721e31e..d1dbedf 100644
--- a/core/java/android/printservice/PrintJob.java
+++ b/core/java/android/printservice/PrintJob.java
@@ -301,6 +301,18 @@
         return false;
     }
 
+    /**
+     * Gets the print job tag.
+     *
+     * @return tag The tag or null.
+     *
+     * @see #setTag(String)
+     */
+    public String getTag() {
+        PrintService.throwIfNotCalledOnMainThread();
+        return getInfo().getTag();
+    }
+
     @Override
     public boolean equals(Object obj) {
         if (this == obj) {
diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp
index 73f3639..a0c50fa 100644
--- a/core/jni/android/graphics/TextLayoutCache.cpp
+++ b/core/jni/android/graphics/TextLayoutCache.cpp
@@ -868,6 +868,7 @@
     hb_shape(font, mBuffer, NULL, 0);
     hb_font_destroy(font);
 
+    mShapingPaint.setTypeface(paint->getTypeface());
     return baseGlyphCount;
 }
 
diff --git a/packages/PrintSpooler/res/drawable-hdpi/ic_restart.png b/packages/PrintSpooler/res/drawable-hdpi/ic_restart.png
new file mode 100644
index 0000000..bb9d855
--- /dev/null
+++ b/packages/PrintSpooler/res/drawable-hdpi/ic_restart.png
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-mdpi/ic_restart.png b/packages/PrintSpooler/res/drawable-mdpi/ic_restart.png
new file mode 100644
index 0000000..bd611e8
--- /dev/null
+++ b/packages/PrintSpooler/res/drawable-mdpi/ic_restart.png
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-xhdpi/ic_restart.png b/packages/PrintSpooler/res/drawable-xhdpi/ic_restart.png
new file mode 100644
index 0000000..a7fdc0d
--- /dev/null
+++ b/packages/PrintSpooler/res/drawable-xhdpi/ic_restart.png
Binary files differ
diff --git a/packages/PrintSpooler/res/values/strings.xml b/packages/PrintSpooler/res/values/strings.xml
index 5b947ba..3a888a8 100644
--- a/packages/PrintSpooler/res/values/strings.xml
+++ b/packages/PrintSpooler/res/values/strings.xml
@@ -56,7 +56,7 @@
     <string name="printing_app_crashed">Printing app crashed</string>
 
     <!-- Title if the number of pages in a printed document is unknown. [CHAR LIMIT=20] -->
-    <string name="page_count_unknown">unavailable</string>
+    <string name="page_count_unknown">Pages</string>
 
     <!-- Title for the temporary dialog show while an app is generating a print job. [CHAR LIMIT=30] -->
     <string name="generating_print_job">Generating print job</string>
diff --git a/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java b/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java
index dae7770..2bd0443 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java
@@ -110,7 +110,7 @@
                         printJob.getLabel()))
                 .addAction(R.drawable.stat_notify_cancelling, mContext.getString(R.string.cancel),
                         createCancelIntent(printJob))
-                .addAction(android.R.drawable.ic_secure, mContext.getString(R.string.restart),
+                .addAction(R.drawable.ic_restart, mContext.getString(R.string.restart),
                         createRestartIntent(printJob.getId()))
                 .setContentText(printJob.getPrinterName())
                 .setWhen(System.currentTimeMillis())
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
index 293be1b..f1678ff 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
@@ -1862,18 +1862,17 @@
                         }
                     }
                     final int pageCount = mDocument.info.getPageCount();
-                    mRangeOptionsTitle.setText(getString(R.string.label_pages,
-                            (pageCount == PrintDocumentInfo.PAGE_COUNT_UNKNOWN)
-                                    ? getString(R.string.page_count_unknown)
-                                    : String.valueOf(pageCount)));
+                    String title = (pageCount != PrintDocumentInfo.PAGE_COUNT_UNKNOWN)
+                            ? getString(R.string.label_pages, String.valueOf(pageCount))
+                            : getString(R.string.page_count_unknown);
+                    mRangeOptionsTitle.setText(title);
                 } else {
                     if (mRangeOptionsSpinner.getSelectedItemPosition() != 0) {
                         mIgnoreNextRangeOptionChange = true;
                         mRangeOptionsSpinner.setSelection(0);
                     }
                     mRangeOptionsSpinner.setEnabled(false);
-                    mRangeOptionsTitle.setText(getString(R.string.label_pages,
-                            getString(R.string.page_count_unknown)));
+                    mRangeOptionsTitle.setText(getString(R.string.page_count_unknown));
                     mPageRangeEditText.setEnabled(false);
                     mPageRangeEditText.setVisibility(View.INVISIBLE);
                     mPageRangeTitle.setVisibility(View.INVISIBLE);
diff --git a/packages/SystemUI/res/drawable-hdpi/search_light.png b/packages/SystemUI/res/drawable-hdpi/search_light.png
index c8b5a2e..c64ae19 100644
--- a/packages/SystemUI/res/drawable-hdpi/search_light.png
+++ b/packages/SystemUI/res/drawable-hdpi/search_light.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/search_light.png b/packages/SystemUI/res/drawable-mdpi/search_light.png
index 4b5b2a4..fb99061 100644
--- a/packages/SystemUI/res/drawable-mdpi/search_light.png
+++ b/packages/SystemUI/res/drawable-mdpi/search_light.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/search_light.png b/packages/SystemUI/res/drawable-xhdpi/search_light.png
index 3aa890f..4389707 100644
--- a/packages/SystemUI/res/drawable-xhdpi/search_light.png
+++ b/packages/SystemUI/res/drawable-xhdpi/search_light.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/search_light.png b/packages/SystemUI/res/drawable-xxhdpi/search_light.png
index 74ad3c8..b4fa297 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/search_light.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/search_light.png
Binary files differ
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index 04885f0..6e53363 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -391,7 +391,7 @@
 
         final AccessibilityManager accessibilityManager =
                 (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
-        if (accessibilityManager.isEnabled()) {
+        if (accessibilityManager.isEnabled() && accessibilityManager.isTouchExplorationEnabled()) {
             // In accessibility mode, we add a simple click handler since swipe is tough to
             // trigger near screen edges.
             View camera = getCameraButton();
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index f23bcba..7c15abc 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -15818,9 +15818,11 @@
                     }
                 }
 
-                boolean haveActivities = mStackSupervisor.switchUserLocked(userId, uss);
-                if (!haveActivities) {
+                boolean homeInFront = mStackSupervisor.switchUserLocked(userId, uss);
+                if (homeInFront) {
                     startHomeActivityLocked(userId);
+                } else {
+                    mStackSupervisor.resumeTopActivitiesLocked();
                 }
 
                 EventLogTags.writeAmSwitchUser(userId);
@@ -16146,6 +16148,8 @@
             } catch (RemoteException e) {
             }
         }
+
+        mStackSupervisor.removeUserLocked(userId);
     }
 
     @Override
diff --git a/services/java/com/android/server/am/ActivityRecord.java b/services/java/com/android/server/am/ActivityRecord.java
index 2c0b83b..cf686672 100644
--- a/services/java/com/android/server/am/ActivityRecord.java
+++ b/services/java/com/android/server/am/ActivityRecord.java
@@ -572,8 +572,8 @@
     }
 
     boolean isRootActivity() {
-        ArrayList<ActivityRecord> activities = task.mActivities;
-        return activities.size() == 0 || this == task.mActivities.get(0);
+        final ArrayList<ActivityRecord> activities = task.mActivities;
+        return activities.size() == 0 || this == activities.get(0);
     }
 
     UriPermissionOwner getUriPermissionsLocked() {
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 45b30f1..1014502 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -549,31 +549,26 @@
 
     /*
      * Move the activities around in the stack to bring a user to the foreground.
-     * @return whether there are any activities for the specified user.
      */
-    final boolean switchUserLocked(int userId) {
+    final void switchUserLocked(int userId) {
         if (VALIDATE_TOKENS) {
             validateAppTokensLocked();
         }
         if (mCurrentUser == userId) {
-            return true;
+            return;
         }
         mCurrentUser = userId;
 
         // Move userId's tasks to the top.
-        boolean haveActivities = false;
         int index = mTaskHistory.size();
         for (int i = 0; i < index; ++i) {
             TaskRecord task = mTaskHistory.get(i);
             if (task.userId == userId) {
-                haveActivities = true;
                 mTaskHistory.remove(i);
                 mTaskHistory.add(task);
                 --index;
             }
         }
-
-        return haveActivities;
     }
 
     void minimalResumeActivityLocked(ActivityRecord r) {
@@ -1623,6 +1618,12 @@
     }
 
     private void insertTaskAtTop(TaskRecord task) {
+        // If this is being moved to the top by another activity or being launched from the home
+        // activity, set mOnTopOfHome accordingly.
+        final boolean fromHome = mStackSupervisor.getLastStack().isHomeStack();
+        if (!isHomeStack() && (fromHome || topTask() != task)) {
+            task.mOnTopOfHome = fromHome;
+        }
         mTaskHistory.remove(task);
         // Now put task at top.
         int stackNdx = mTaskHistory.size();
diff --git a/services/java/com/android/server/am/ActivityStackSupervisor.java b/services/java/com/android/server/am/ActivityStackSupervisor.java
index 2b69a4e..dc9036f 100644
--- a/services/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/java/com/android/server/am/ActivityStackSupervisor.java
@@ -70,6 +70,7 @@
 import android.util.Slog;
 import android.util.SparseArray;
 
+import android.util.SparseBooleanArray;
 import com.android.internal.app.HeavyWeightSwitcherActivity;
 import com.android.internal.os.TransferPipe;
 import com.android.server.am.ActivityManagerService.PendingActivityLaunch;
@@ -203,6 +204,9 @@
      */
     final PowerManager.WakeLock mGoingToSleep;
 
+    /** State of the stacks when user switched, indexed by userId. */
+    SparseBooleanArray mUserHomeInFront = new SparseBooleanArray(2);
+
     public ActivityStackSupervisor(ActivityManagerService service, Context context,
             Looper looper) {
         mService = service;
@@ -288,22 +292,6 @@
         return mService.startHomeActivityLocked(mCurrentUser);
     }
 
-    final void setLaunchHomeTaskNextFlag(ActivityRecord sourceRecord, ActivityRecord r,
-            ActivityStack stack) {
-        if (stack == mHomeStack) {
-            return;
-        }
-        if ((sourceRecord == null && getLastStack() == mHomeStack) ||
-                (sourceRecord != null && sourceRecord.isHomeActivity())) {
-            if (r == null) {
-                r = stack.topRunningActivityLocked(null);
-            }
-            if (r != null && !r.isHomeActivity() && r.isRootActivity()) {
-                r.task.mOnTopOfHome = true;
-            }
-        }
-    }
-
     void setDismissKeyguard(boolean dismiss) {
         if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen(" dismiss=" + dismiss);
         mDismissKeyguardOnNextActivity = dismiss;
@@ -1479,7 +1467,6 @@
                         // is the case, so this is it!  And for paranoia, make
                         // sure we have correctly resumed the top activity.
                         if (doResume) {
-                            setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
                             resumeTopActivitiesLocked(targetStack, null, options);
                         } else {
                             ActivityOptions.abort(options);
@@ -1575,9 +1562,6 @@
                         // don't use that intent!)  And for paranoia, make
                         // sure we have correctly resumed the top activity.
                         if (doResume) {
-                            // Reset flag so it gets correctly reevaluated.
-                            intentActivity.task.mOnTopOfHome = false;
-                            setLaunchHomeTaskNextFlag(sourceRecord, intentActivity, targetStack);
                             targetStack.resumeTopActivityLocked(null, options);
                         } else {
                             ActivityOptions.abort(options);
@@ -1615,7 +1599,6 @@
                             // resumed the top activity.
                             topStack.mLastPausedActivity = null;
                             if (doResume) {
-                                setLaunchHomeTaskNextFlag(sourceRecord, null, topStack);
                                 resumeTopActivitiesLocked();
                             }
                             ActivityOptions.abort(options);
@@ -1694,7 +1677,6 @@
                     // resumed the top activity.
                     targetStack.mLastPausedActivity = null;
                     if (doResume) {
-                        setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
                         targetStack.resumeTopActivityLocked(null);
                     }
                     ActivityOptions.abort(options);
@@ -1717,7 +1699,6 @@
                     top.deliverNewIntentLocked(callingUid, r.intent);
                     targetStack.mLastPausedActivity = null;
                     if (doResume) {
-                        setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
                         targetStack.resumeTopActivityLocked(null);
                     }
                     return ActivityManager.START_DELIVERED_TO_TOP;
@@ -1751,7 +1732,6 @@
             EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId);
         }
         ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
-        setLaunchHomeTaskNextFlag(sourceRecord, r, targetStack);
         targetStack.mLastPausedActivity = null;
         targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options);
         mService.setFocusedActivityLocked(r);
@@ -1960,6 +1940,10 @@
         }
     }
 
+    void removeUserLocked(int userId) {
+        mUserHomeInFront.delete(userId);
+    }
+
     /**
      * @return true if some activity was finished (or would have finished if doit were true).
      */
@@ -2278,17 +2262,17 @@
     }
 
     boolean switchUserLocked(int userId, UserStartedState uss) {
+        mUserHomeInFront.put(mCurrentUser, isFrontStack(mHomeStack));
+        final boolean homeInFront = mUserHomeInFront.get(userId, true);
         mCurrentUser = userId;
 
         mStartingUsers.add(uss);
-        boolean haveActivities = false;
         for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
-            haveActivities |= mStacks.get(stackNdx).switchUserLocked(userId);
+            mStacks.get(stackNdx).switchUserLocked(userId);
         }
 
-        resumeTopActivitiesLocked();
-
-        return haveActivities;
+        moveHomeStack(homeInFront);
+        return homeInFront;
     }
 
     final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) {
@@ -2381,6 +2365,7 @@
         pw.print(prefix); pw.print("mStackState="); pw.println(stackStateToString(mStackState));
         pw.print(prefix); pw.println("mSleepTimeout: " + mSleepTimeout);
         pw.print(prefix); pw.println("mCurTaskId: " + mCurTaskId);
+        pw.print(prefix); pw.println("mUserHomeInFront: " + mUserHomeInFront);
     }
 
     ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index f093f2b..d239be7 100755
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -850,6 +850,19 @@
                                 sendPackageBroadcast(Intent.ACTION_MY_PACKAGE_REPLACED,
                                         null, null,
                                         res.pkg.applicationInfo.packageName, null, updateUsers);
+
+                                // treat asec-hosted packages like removable media on upgrade
+                                if (isForwardLocked(res.pkg) || isExternal(res.pkg)) {
+                                    if (DEBUG_INSTALL) {
+                                        Slog.i(TAG, "upgrading pkg " + res.pkg
+                                                + " is ASEC-hosted -> AVAILABLE");
+                                    }
+                                    int[] uidArray = new int[] { res.pkg.applicationInfo.uid };
+                                    ArrayList<String> pkgList = new ArrayList<String>(1);
+                                    pkgList.add(res.pkg.applicationInfo.packageName);
+                                    sendResourcesChangedBroadcast(true, false,
+                                            pkgList,uidArray, null);
+                                }
                             }
                             if (res.removedInfo.args != null) {
                                 // Remove the replaced package's older resources safely now
@@ -4643,6 +4656,20 @@
         // so that we do not end up in a confused state while the user is still using the older
         // version of the application while the new one gets installed.
         if ((parseFlags & PackageManager.INSTALL_REPLACE_EXISTING) != 0) {
+            // If the package lives in an asec, tell everyone that the container is going
+            // away so they can clean up any references to its resources (which would prevent
+            // vold from being able to unmount the asec)
+            if (isForwardLocked(pkg) || isExternal(pkg)) {
+                if (DEBUG_INSTALL) {
+                    Slog.i(TAG, "upgrading pkg " + pkg + " is ASEC-hosted -> UNAVAILABLE");
+                }
+                final int[] uidArray = new int[] { pkg.applicationInfo.uid };
+                final ArrayList<String> pkgList = new ArrayList<String>(1);
+                pkgList.add(pkg.applicationInfo.packageName);
+                sendResourcesChangedBroadcast(false, true, pkgList, uidArray, null);
+            }
+
+            // Post the request that it be killed now that the going-away broadcast is en route
             killApplication(pkg.applicationInfo.packageName,
                         pkg.applicationInfo.uid, "update pkg");
         }
@@ -10731,8 +10758,8 @@
         }
     }
 
-   private void sendResourcesChangedBroadcast(boolean mediaStatus, ArrayList<String> pkgList,
-            int uidArr[], IIntentReceiver finishedReceiver) {
+   private void sendResourcesChangedBroadcast(boolean mediaStatus, boolean replacing,
+           ArrayList<String> pkgList, int uidArr[], IIntentReceiver finishedReceiver) {
         int size = pkgList.size();
         if (size > 0) {
             // Send broadcasts here
@@ -10742,6 +10769,9 @@
             if (uidArr != null) {
                 extras.putIntArray(Intent.EXTRA_CHANGED_UID_LIST, uidArr);
             }
+            if (replacing && !mediaStatus) {
+                extras.putBoolean(Intent.EXTRA_REPLACING, replacing);
+            }
             String action = mediaStatus ? Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE
                     : Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;
             sendPackageBroadcast(action, null, extras, null, finishedReceiver, null);
@@ -10844,7 +10874,7 @@
         }
         // Send a broadcast to let everyone know we are done processing
         if (pkgList.size() > 0) {
-            sendResourcesChangedBroadcast(true, pkgList, uidArr, null);
+            sendResourcesChangedBroadcast(true, false, pkgList, uidArr, null);
         }
         // Force gc to avoid any stale parser references that we might have.
         if (doGc) {
@@ -10921,7 +10951,8 @@
         // broadcast when packages get disabled, force a gc to clean things up.
         // and unload all the containers.
         if (pkgList.size() > 0) {
-            sendResourcesChangedBroadcast(false, pkgList, uidArr, new IIntentReceiver.Stub() {
+            sendResourcesChangedBroadcast(false, false, pkgList, uidArr,
+                    new IIntentReceiver.Stub() {
                 public void performReceive(Intent intent, int resultCode, String data,
                         Bundle extras, boolean ordered, boolean sticky,
                         int sendingUser) throws RemoteException {
@@ -11041,7 +11072,7 @@
                     }
                     if (returnCode == PackageManager.MOVE_SUCCEEDED) {
                         // Send resources unavailable broadcast
-                        sendResourcesChangedBroadcast(false, pkgList, uidArr, null);
+                        sendResourcesChangedBroadcast(false, true, pkgList, uidArr, null);
                         // Update package code and resource paths
                         synchronized (mInstallLock) {
                             synchronized (mPackages) {
@@ -11119,7 +11150,7 @@
                             }
                         }
                         // Send resources available broadcast
-                        sendResourcesChangedBroadcast(true, pkgList, uidArr, null);
+                        sendResourcesChangedBroadcast(true, false, pkgList, uidArr, null);
                     }
                 }
                 if (returnCode != PackageManager.MOVE_SUCCEEDED) {
diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java
index 3b0ee24..b3f0036 100644
--- a/services/java/com/android/server/print/UserState.java
+++ b/services/java/com/android/server/print/UserState.java
@@ -205,6 +205,10 @@
         for (int i = 0; i < cachedPrintJobCount; i++) {
             PrintJobInfo cachedPrintJob = cachedPrintJobs.get(i);
             result.put(cachedPrintJob.getId(), cachedPrintJob);
+            // Strip out the tag - it is visible only to print services.
+            // Also the cached print jobs are delivered only to apps, so
+            // stripping the tag of a cached print job is fine.
+            cachedPrintJob.setTag(null);
         }
 
         // Add everything else the spooler knows about.
@@ -215,6 +219,8 @@
             for (int i = 0; i < printJobCount; i++) {
                 PrintJobInfo printJob = printJobs.get(i);
                 result.put(printJob.getId(), printJob);
+                // Strip out the tag - it is visible only to print services.
+                printJob.setTag(null);
             }
         }