Merge changes I7261cf87,Icabfcf47,I09e6b032,I252cf139,If85ade73, ... into nyc-dev

* changes:
  Revert "Death to synchronous transactions (2/2)"
  Fix a few weird state issues from race-conditions
  Fix lifecycle bug in when calling positionTask
  Animation fixes when task is not resumed
  Keep stack from mReuseTask
  Final fixes for growing recents transition
diff --git a/Android.mk b/Android.mk
index f875be2..da53db7 100644
--- a/Android.mk
+++ b/Android.mk
@@ -331,7 +331,7 @@
 	core/java/com/android/internal/textservice/ISpellCheckerSessionListener.aidl \
 	core/java/com/android/internal/textservice/ITextServicesManager.aidl \
 	core/java/com/android/internal/textservice/ITextServicesSessionListener.aidl \
-	core/java/com/android/internal/view/IDropPermissions.aidl \
+	core/java/com/android/internal/view/IDragAndDropPermissions.aidl \
 	core/java/com/android/internal/view/IInputContext.aidl \
 	core/java/com/android/internal/view/IInputContextCallback.aidl \
 	core/java/com/android/internal/view/IInputMethod.aidl \
diff --git a/api/current.txt b/api/current.txt
index 00a2b7a..91340a9 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -3580,7 +3580,7 @@
     method public boolean releaseInstance();
     method public final deprecated void removeDialog(int);
     method public void reportFullyDrawn();
-    method public android.view.DropPermissions requestDropPermissions(android.view.DragEvent);
+    method public android.view.DragAndDropPermissions requestDragAndDropPermissions(android.view.DragEvent);
     method public final void requestKeyboardShortcutsHelper();
     method public final void requestPermissions(java.lang.String[], int);
     method public boolean requestVisibleBehind(boolean);
@@ -40973,6 +40973,10 @@
     field public static final android.os.Parcelable.Creator<android.view.Display.Mode> CREATOR;
   }
 
+  public final class DragAndDropPermissions {
+    method public void release();
+  }
+
   public class DragEvent implements android.os.Parcelable {
     method public int describeContents();
     method public int getAction();
@@ -40992,10 +40996,6 @@
     field public static final android.os.Parcelable.Creator<android.view.DragEvent> CREATOR;
   }
 
-  public final class DropPermissions {
-    method public void release();
-  }
-
   public class FocusFinder {
     method public android.view.View findNearestTouchable(android.view.ViewGroup, int, int, int, int[]);
     method public final android.view.View findNextFocus(android.view.ViewGroup, android.view.View, int);
diff --git a/api/system-current.txt b/api/system-current.txt
index f017bb0..39f87ad 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -3699,7 +3699,7 @@
     method public boolean releaseInstance();
     method public final deprecated void removeDialog(int);
     method public void reportFullyDrawn();
-    method public android.view.DropPermissions requestDropPermissions(android.view.DragEvent);
+    method public android.view.DragAndDropPermissions requestDragAndDropPermissions(android.view.DragEvent);
     method public final void requestKeyboardShortcutsHelper();
     method public final void requestPermissions(java.lang.String[], int);
     method public boolean requestVisibleBehind(boolean);
@@ -43924,6 +43924,10 @@
     field public static final android.os.Parcelable.Creator<android.view.Display.Mode> CREATOR;
   }
 
+  public final class DragAndDropPermissions {
+    method public void release();
+  }
+
   public class DragEvent implements android.os.Parcelable {
     method public int describeContents();
     method public int getAction();
@@ -43943,10 +43947,6 @@
     field public static final android.os.Parcelable.Creator<android.view.DragEvent> CREATOR;
   }
 
-  public final class DropPermissions {
-    method public void release();
-  }
-
   public class FocusFinder {
     method public android.view.View findNearestTouchable(android.view.ViewGroup, int, int, int, int[]);
     method public final android.view.View findNextFocus(android.view.ViewGroup, android.view.View, int);
diff --git a/api/test-current.txt b/api/test-current.txt
index d5ecfd1..84ce5a5 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -3580,7 +3580,7 @@
     method public boolean releaseInstance();
     method public final deprecated void removeDialog(int);
     method public void reportFullyDrawn();
-    method public android.view.DropPermissions requestDropPermissions(android.view.DragEvent);
+    method public android.view.DragAndDropPermissions requestDragAndDropPermissions(android.view.DragEvent);
     method public final void requestKeyboardShortcutsHelper();
     method public final void requestPermissions(java.lang.String[], int);
     method public boolean requestVisibleBehind(boolean);
@@ -41050,6 +41050,10 @@
     field public static final android.os.Parcelable.Creator<android.view.Display.Mode> CREATOR;
   }
 
+  public final class DragAndDropPermissions {
+    method public void release();
+  }
+
   public class DragEvent implements android.os.Parcelable {
     method public int describeContents();
     method public int getAction();
@@ -41069,10 +41073,6 @@
     field public static final android.os.Parcelable.Creator<android.view.DragEvent> CREATOR;
   }
 
-  public final class DropPermissions {
-    method public void release();
-  }
-
   public class FocusFinder {
     method public android.view.View findNearestTouchable(android.view.ViewGroup, int, int, int, int[]);
     method public final android.view.View findNextFocus(android.view.ViewGroup, android.view.View, int);
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 9bd648f..5ea3903 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -85,8 +85,8 @@
 import android.view.ContextMenu;
 import android.view.ContextMenu.ContextMenuInfo;
 import android.view.ContextThemeWrapper;
+import android.view.DragAndDropPermissions;
 import android.view.DragEvent;
-import android.view.DropPermissions;
 import android.view.InputDevice;
 import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
@@ -6505,16 +6505,16 @@
     }
 
     /**
-     * Create {@link DropPermissions} object bound to this activity and controlling the access
-     * permissions for content URIs associated with the {@link DragEvent}.
+     * Create {@link DragAndDropPermissions} object bound to this activity and controlling the
+     * access permissions for content URIs associated with the {@link DragEvent}.
      * @param event Drag event
-     * @return The DropPermissions object used to control access to the content URIs. Null if
-     * no content URIs are associated with the event or if permissions could not be granted.
+     * @return The {@link DragAndDropPermissions} object used to control access to the content URIs.
+     * Null if no content URIs are associated with the event or if permissions could not be granted.
      */
-    public DropPermissions requestDropPermissions(DragEvent event) {
-        DropPermissions dropPermissions = DropPermissions.obtain(event);
-        if (dropPermissions != null && dropPermissions.take(getActivityToken())) {
-            return dropPermissions;
+    public DragAndDropPermissions requestDragAndDropPermissions(DragEvent event) {
+        DragAndDropPermissions dragAndDropPermissions = DragAndDropPermissions.obtain(event);
+        if (dragAndDropPermissions != null && dragAndDropPermissions.take(getActivityToken())) {
+            return dragAndDropPermissions;
         }
         return null;
     }
diff --git a/core/java/android/view/DropPermissions.java b/core/java/android/view/DragAndDropPermissions.java
similarity index 69%
rename from core/java/android/view/DropPermissions.java
rename to core/java/android/view/DragAndDropPermissions.java
index 5411dad..a3dbdb1 100644
--- a/core/java/android/view/DropPermissions.java
+++ b/core/java/android/view/DragAndDropPermissions.java
@@ -19,51 +19,52 @@
 import android.app.ActivityManagerNative;
 import android.os.IBinder;
 import android.os.RemoteException;
-import com.android.internal.view.IDropPermissions;
+import com.android.internal.view.IDragAndDropPermissions;
 import dalvik.system.CloseGuard;
 
 
 /**
- * {@link DropPermissions} controls the access permissions for the content URIs associated with a
- * {@link DragEvent}.
+ * {@link DragAndDropPermissions} controls the access permissions for the content URIs associated
+ * with a {@link DragEvent}.
  * <p>
  * Permission are granted when this object is created by {@link
- * android.app.Activity#requestDropPermissions(DragEvent) Activity.requestDropPermissions}.
+ * android.app.Activity#requestDragAndDropPermissions(DragEvent)
+ * Activity.requestDragAndDropPermissions}.
  * Which permissions are granted is defined by the set of flags passed to {@link
  * View#startDragAndDrop(android.content.ClipData, View.DragShadowBuilder, Object, int)
  * View.startDragAndDrop} by the app that started the drag operation.
  * <p>
  * The life cycle of the permissions is bound to the activity used to call {@link
- * android.app.Activity#requestDropPermissions(DragEvent) requestDropPermissions}. The
+ * android.app.Activity#requestDragAndDropPermissions(DragEvent) requestDragAndDropPermissions}. The
  * permissions are revoked when this activity is destroyed, or when {@link #release()} is called,
  * whichever occurs first.
  */
-public final class DropPermissions {
+public final class DragAndDropPermissions {
 
-    private final IDropPermissions mDropPermissions;
+    private final IDragAndDropPermissions mDragAndDropPermissions;
 
     private IBinder mPermissionOwnerToken;
 
     private final CloseGuard mCloseGuard = CloseGuard.get();
 
     /**
-     * Create a new {@link DropPermissions} object to control the access permissions for content
-     * URIs associated with {@link DragEvent}.
+     * Create a new {@link DragAndDropPermissions} object to control the access permissions for
+     * content URIs associated with {@link DragEvent}.
      * @param dragEvent Drag event
-     * @return {@link DropPermissions} object or null if there are no content URIs associated with
-     * the {@link DragEvent}.
+     * @return {@link DragAndDropPermissions} object or null if there are no content URIs associated
+     * with the {@link DragEvent}.
      * @hide
      */
-    public static DropPermissions obtain(DragEvent dragEvent) {
-        if (dragEvent.getDropPermissions() == null) {
+    public static DragAndDropPermissions obtain(DragEvent dragEvent) {
+        if (dragEvent.getDragAndDropPermissions() == null) {
             return null;
         }
-        return new DropPermissions(dragEvent.getDropPermissions());
+        return new DragAndDropPermissions(dragEvent.getDragAndDropPermissions());
     }
 
     /** @hide */
-    private DropPermissions(IDropPermissions dropPermissions) {
-        mDropPermissions = dropPermissions;
+    private DragAndDropPermissions(IDragAndDropPermissions dragAndDropPermissions) {
+        mDragAndDropPermissions = dragAndDropPermissions;
     }
 
     /**
@@ -74,7 +75,7 @@
      */
     public boolean take(IBinder activityToken) {
         try {
-            mDropPermissions.take(activityToken);
+            mDragAndDropPermissions.take(activityToken);
         } catch (RemoteException e) {
             return false;
         }
@@ -91,7 +92,7 @@
         try {
             mPermissionOwnerToken = ActivityManagerNative.getDefault().
                     newUriPermissionOwner("drop");
-            mDropPermissions.takeTransient(mPermissionOwnerToken);
+            mDragAndDropPermissions.takeTransient(mPermissionOwnerToken);
         } catch (RemoteException e) {
             return false;
         }
@@ -104,7 +105,7 @@
      */
     public void release() {
         try {
-            mDropPermissions.release();
+            mDragAndDropPermissions.release();
             mPermissionOwnerToken = null;
         } catch (RemoteException e) {
         }
diff --git a/core/java/android/view/DragEvent.java b/core/java/android/view/DragEvent.java
index 71db0b5..0dfbe70 100644
--- a/core/java/android/view/DragEvent.java
+++ b/core/java/android/view/DragEvent.java
@@ -21,7 +21,7 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-import com.android.internal.view.IDropPermissions;
+import com.android.internal.view.IDragAndDropPermissions;
 
 //TODO: Improve Javadoc
 /**
@@ -130,7 +130,7 @@
     float mX, mY;
     ClipDescription mClipDescription;
     ClipData mClipData;
-    IDropPermissions mDropPermissions;
+    IDragAndDropPermissions mDragAndDropPermissions;
 
     Object mLocalState;
     boolean mDragResult;
@@ -257,13 +257,13 @@
     }
 
     private void init(int action, float x, float y, ClipDescription description, ClipData data,
-            IDropPermissions dropPermissions, Object localState, boolean result) {
+            IDragAndDropPermissions dragAndDropPermissions, Object localState, boolean result) {
         mAction = action;
         mX = x;
         mY = y;
         mClipDescription = description;
         mClipData = data;
-        mDropPermissions = dropPermissions;
+        this.mDragAndDropPermissions = dragAndDropPermissions;
         mLocalState = localState;
         mDragResult = result;
     }
@@ -274,13 +274,14 @@
 
     /** @hide */
     public static DragEvent obtain(int action, float x, float y, Object localState,
-            ClipDescription description, ClipData data, IDropPermissions dropPermissions,
-            boolean result) {
+            ClipDescription description, ClipData data,
+            IDragAndDropPermissions dragAndDropPermissions, boolean result) {
         final DragEvent ev;
         synchronized (gRecyclerLock) {
             if (gRecyclerTop == null) {
                 ev = new DragEvent();
-                ev.init(action, x, y, description, data, dropPermissions, localState, result);
+                ev.init(action, x, y, description, data, dragAndDropPermissions, localState,
+                        result);
                 return ev;
             }
             ev = gRecyclerTop;
@@ -291,7 +292,7 @@
         ev.mRecycled = false;
         ev.mNext = null;
 
-        ev.init(action, x, y, description, data, dropPermissions, localState, result);
+        ev.init(action, x, y, description, data, dragAndDropPermissions, localState, result);
 
         return ev;
     }
@@ -299,7 +300,7 @@
     /** @hide */
     public static DragEvent obtain(DragEvent source) {
         return obtain(source.mAction, source.mX, source.mY, source.mLocalState,
-                source.mClipDescription, source.mClipData, source.mDropPermissions,
+                source.mClipDescription, source.mClipData, source.mDragAndDropPermissions,
                 source.mDragResult);
     }
 
@@ -365,8 +366,8 @@
     }
 
     /** @hide */
-    public IDropPermissions getDropPermissions() {
-        return mDropPermissions;
+    public IDragAndDropPermissions getDragAndDropPermissions() {
+        return mDragAndDropPermissions;
     }
 
     /**
@@ -489,11 +490,11 @@
             dest.writeInt(1);
             mClipDescription.writeToParcel(dest, flags);
         }
-        if (mDropPermissions == null) {
+        if (mDragAndDropPermissions == null) {
             dest.writeInt(0);
         } else {
             dest.writeInt(1);
-            dest.writeStrongBinder(mDropPermissions.asBinder());
+            dest.writeStrongBinder(mDragAndDropPermissions.asBinder());
         }
     }
 
@@ -515,7 +516,8 @@
                 event.mClipDescription = ClipDescription.CREATOR.createFromParcel(in);
             }
             if (in.readInt() != 0) {
-                event.mDropPermissions = IDropPermissions.Stub.asInterface(in.readStrongBinder());;
+                event.mDragAndDropPermissions =
+                        IDragAndDropPermissions.Stub.asInterface(in.readStrongBinder());;
             }
             return event;
         }
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 440ef21..5d2683f 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -77,8 +77,8 @@
 import android.view.ActionMode.Callback;
 import android.view.ContextMenu;
 import android.view.DisplayListCanvas;
+import android.view.DragAndDropPermissions;
 import android.view.DragEvent;
-import android.view.DropPermissions;
 import android.view.Gravity;
 import android.view.InputDevice;
 import android.view.LayoutInflater;
@@ -2379,9 +2379,9 @@
     void onDrop(DragEvent event) {
         StringBuilder content = new StringBuilder("");
 
-        final DropPermissions dropPermissions = DropPermissions.obtain(event);
-        if (dropPermissions != null) {
-            dropPermissions.takeTransient();
+        final DragAndDropPermissions permissions = DragAndDropPermissions.obtain(event);
+        if (permissions != null) {
+            permissions.takeTransient();
         }
 
         try {
@@ -2393,8 +2393,8 @@
             }
         }
         finally {
-            if (dropPermissions != null) {
-                dropPermissions.release();
+            if (permissions != null) {
+                permissions.release();
             }
         }
 
diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java
index 9c9784b..3c967ac 100644
--- a/core/java/android/widget/ProgressBar.java
+++ b/core/java/android/widget/ProgressBar.java
@@ -1397,6 +1397,10 @@
     /**
      * Sets the current progress to the specified value. Does not do anything
      * if the progress bar is in indeterminate mode.
+     * <p>
+     * This method will immediately update the visual position of the progress
+     * indicator. To animate the visual position to the target value, use
+     * {@link #setProgress(int, boolean)}}.
      *
      * @param progress the new progress, between 0 and {@link #getMax()}
      *
@@ -1412,7 +1416,7 @@
 
     /**
      * Sets the current progress to the specified value, optionally animating
-     * between the current and target values.
+     * the visual position between the current and target values.
      * <p>
      * Animation does not affect the result of {@link #getProgress()}, which
      * will return the target value immediately after this method is called.
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 8097d7a..3216fba 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -1591,6 +1591,7 @@
         }
     }
 
+    @android.view.RemotableViewMethod
     @Override
     public void setEnabled(boolean enabled) {
         if (enabled == isEnabled()) {
diff --git a/core/java/com/android/internal/view/IDropPermissions.aidl b/core/java/com/android/internal/view/IDragAndDropPermissions.aidl
similarity index 96%
rename from core/java/com/android/internal/view/IDropPermissions.aidl
rename to core/java/com/android/internal/view/IDragAndDropPermissions.aidl
index 74ff4b4..64c2d04 100644
--- a/core/java/com/android/internal/view/IDropPermissions.aidl
+++ b/core/java/com/android/internal/view/IDragAndDropPermissions.aidl
@@ -22,7 +22,7 @@
  * Interface to allow a drop receiver to request permissions for URIs passed along with ClipData
  * contained in DragEvent.
  */
-interface IDropPermissions {
+interface IDragAndDropPermissions {
     void take(IBinder activityToken);
     void takeTransient(IBinder permissionOwnerToken);
     void release();
diff --git a/core/java/com/android/internal/view/menu/CascadingMenuPopup.java b/core/java/com/android/internal/view/menu/CascadingMenuPopup.java
index 5cb307f..72ed9d0 100644
--- a/core/java/com/android/internal/view/menu/CascadingMenuPopup.java
+++ b/core/java/com/android/internal/view/menu/CascadingMenuPopup.java
@@ -181,8 +181,10 @@
     private View mAnchorView;
     private View mShownAnchorView;
     private int mLastPosition;
-    private int mInitXOffset;
-    private int mInitYOffset;
+    private boolean mHasXOffset;
+    private boolean mHasYOffset;
+    private int mXOffset;
+    private int mYOffset;
     private boolean mForceShowIcon;
     private boolean mShowTitle;
     private Callback mPresenterCallback;
@@ -379,9 +381,6 @@
             parentView = null;
         }
 
-        final int x;
-        final int y;
-        final Rect epicenterBounds;
         if (parentView != null) {
             // This menu is a cascading submenu anchored to a parent view.
             popupWindow.setTouchModal(false);
@@ -401,6 +400,7 @@
 
             // By now, mDropDownGravity is the resolved absolute gravity, so
             // this should work in both LTR and RTL.
+            final int x;
             if ((mDropDownGravity & Gravity.RIGHT) == Gravity.RIGHT) {
                 if (showOnRight) {
                     x = parentOffsetLeft + menuWidth;
@@ -415,17 +415,21 @@
                 }
             }
 
-            y = parentOffsetTop;
-            epicenterBounds = null;
+            popupWindow.setHorizontalOffset(x);
+
+            final int y = parentOffsetTop;
+            popupWindow.setVerticalOffset(y);
         } else {
-            x = mInitXOffset;
-            y = mInitYOffset;
-            epicenterBounds = getEpicenterBounds();
+            if (mHasXOffset) {
+                popupWindow.setHorizontalOffset(mXOffset);
+            }
+            if (mHasYOffset) {
+                popupWindow.setVerticalOffset(mYOffset);
+            }
+            final Rect epicenterBounds = getEpicenterBounds();
+            popupWindow.setEpicenterBounds(epicenterBounds);
         }
 
-        popupWindow.setHorizontalOffset(x);
-        popupWindow.setVerticalOffset(y);
-        popupWindow.setEpicenterBounds(epicenterBounds);
 
         final CascadingMenuInfo menuInfo = new CascadingMenuInfo(popupWindow, menu, mLastPosition);
         mShowingMenus.add(menuInfo);
@@ -712,12 +716,14 @@
 
     @Override
     public void setHorizontalOffset(int x) {
-        mInitXOffset = x;
+        mHasXOffset = true;
+        mXOffset = x;
     }
 
     @Override
     public void setVerticalOffset(int y) {
-        mInitYOffset = y;
+        mHasYOffset = true;
+        mYOffset = y;
     }
 
     @Override
diff --git a/core/java/com/android/internal/view/menu/StandardMenuPopup.java b/core/java/com/android/internal/view/menu/StandardMenuPopup.java
index 339c2bf..169caa585 100644
--- a/core/java/com/android/internal/view/menu/StandardMenuPopup.java
+++ b/core/java/com/android/internal/view/menu/StandardMenuPopup.java
@@ -108,8 +108,6 @@
 
     private int mDropDownGravity = Gravity.NO_GRAVITY;
 
-    private int mXOffset;
-    private int mYOffset;
     private boolean mShowTitle;
 
     public StandardMenuPopup(Context context, MenuBuilder menu, View anchorView, int popupStyleAttr,
@@ -177,8 +175,6 @@
 
         mPopup.setContentWidth(mContentWidth);
         mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED);
-        mPopup.setHorizontalOffset(mXOffset);
-        mPopup.setVerticalOffset(mYOffset);
         mPopup.setEpicenterBounds(getEpicenterBounds());
         mPopup.show();
 
@@ -276,7 +272,9 @@
             mMenu.close(false /* closeAllMenus */);
 
             // Show the new sub-menu popup at the same location as this popup.
-            if (subPopup.tryShow(mXOffset, mYOffset)) {
+            final int horizontalOffset = mPopup.getHorizontalOffset();
+            final int verticalOffset = mPopup.getVerticalOffset();
+            if (subPopup.tryShow(horizontalOffset, verticalOffset)) {
                 if (mPresenterCallback != null) {
                     mPresenterCallback.onOpenSubMenu(subMenu);
                 }
@@ -338,12 +336,12 @@
 
     @Override
     public void setHorizontalOffset(int x) {
-        mXOffset = x;
+        mPopup.setHorizontalOffset(x);
     }
 
     @Override
     public void setVerticalOffset(int y) {
-        mYOffset = y;
+        mPopup.setVerticalOffset(y);
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java
index 9bc85c8..fb76918 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java
@@ -54,7 +54,7 @@
         // TODO: Live?
     }
 
-    private void addSystemTiles(QSTileHost host) {
+    private void addSystemTiles(final QSTileHost host) {
         String possible = mContext.getString(R.string.quick_settings_tiles_default)
                 + ",hotspot,inversion,saver,work,cast,night";
         String[] possibleTiles = possible.split(",");
@@ -93,7 +93,7 @@
                 mainHandler.post(new Runnable() {
                     @Override
                     public void run() {
-                        new QueryTilesTask().execute();
+                        new QueryTilesTask().execute(host.getTiles());
                     }
                 });
             }
@@ -133,9 +133,10 @@
         public boolean isSystem;
     }
 
-    private class QueryTilesTask extends AsyncTask<Void, Void, Collection<TileInfo>> {
+    private class QueryTilesTask extends
+            AsyncTask<Collection<QSTile<?>>, Void, Collection<TileInfo>> {
         @Override
-        protected Collection<TileInfo> doInBackground(Void... params) {
+        protected Collection<TileInfo> doInBackground(Collection<QSTile<?>>... params) {
             List<TileInfo> tiles = new ArrayList<>();
             PackageManager pm = mContext.getPackageManager();
             List<ResolveInfo> services = pm.queryIntentServicesAsUser(
@@ -143,7 +144,13 @@
             for (ResolveInfo info : services) {
                 String packageName = info.serviceInfo.packageName;
                 ComponentName componentName = new ComponentName(packageName, info.serviceInfo.name);
+                final CharSequence appLabel = info.serviceInfo.applicationInfo.loadLabel(pm);
                 String spec = CustomTile.toSpec(componentName);
+                State state = getState(params[0], spec);
+                if (state != null) {
+                    addTile(spec, appLabel, state, false);
+                    continue;
+                }
                 if (info.serviceInfo.icon == 0) {
                     continue;
                 }
@@ -157,12 +164,22 @@
                 icon.mutate();
                 icon.setTint(mContext.getColor(android.R.color.white));
                 CharSequence label = info.serviceInfo.loadLabel(pm);
-                final CharSequence appLabel = info.serviceInfo.applicationInfo.loadLabel(pm);
                 addTile(spec, icon, label != null ? label.toString() : "null", appLabel, mContext);
             }
             return tiles;
         }
 
+        private State getState(Collection<QSTile<?>> tiles, String spec) {
+            for (QSTile<?> tile : tiles) {
+                if (spec.equals(tile.getTileSpec())) {
+                    final QSTile.State state = tile.newTileState();
+                    tile.getState().copyTo(state);
+                    return state;
+                }
+            }
+            return null;
+        }
+
         @Override
         protected void onPostExecute(Collection<TileInfo> result) {
             mTiles.addAll(result);
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index 4791818..87dedc9 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -4696,26 +4696,20 @@
             ceHelper.getWritableDatabase();
             ceHelper.close();
             if (removeOldDb) {
-                // TODO STOPSHIP - backup file during testing. Remove file before the release
-                Log.i(TAG, "Migration complete - creating backup of old db " + preNDatabaseFile);
-                renameToBakFile(preNDatabaseFile);
+                Slog.i(TAG, "Migration complete - removing pre-N db " + preNDatabaseFile);
+                if (!SQLiteDatabase.deleteDatabase(preNDatabaseFile)) {
+                    Slog.e(TAG, "Cannot remove pre-N db " + preNDatabaseFile);
+                }
             }
             return ceHelper;
         }
 
-        private static void renameToBakFile(File file) {
-            File bakFile = new File(file.getPath() + ".bak");
-            if (!file.renameTo(bakFile)) {
-                Log.e(TAG, "Cannot move file to " + bakFile);
-            }
-        }
-
         private static boolean migratePreNDbToCe(File oldDbFile, File ceDbFile) {
-            Log.i(TAG, "Moving pre-N DB " + oldDbFile + " to CE " + ceDbFile);
+            Slog.i(TAG, "Moving pre-N DB " + oldDbFile + " to CE " + ceDbFile);
             try {
                 FileUtils.copyFileOrThrow(oldDbFile, ceDbFile);
             } catch (IOException e) {
-                Log.e(TAG, "Cannot copy file to " + ceDbFile + " from " + oldDbFile, e);
+                Slog.e(TAG, "Cannot copy file to " + ceDbFile + " from " + oldDbFile, e);
                 // Try to remove potentially damaged file if I/O error occurred
                 deleteDbFileWarnIfFailed(ceDbFile);
                 return false;
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index 8a003de..30ba28a 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -353,7 +353,7 @@
             stack.getDimBounds(mTmpRect);
             if (mTmpRect.height() > 0 && mTmpRect.width() > 0) {
                 mDimLayer.setBounds(mTmpRect);
-                mDimLayer.show(mDisplayContent.mService.mLayersController.getResizeDimLayer(),
+                mDimLayer.show(mService.mLayersController.getResizeDimLayer(),
                         alpha, 0 /* duration */);
             } else {
                 visibleAndValid = false;
@@ -543,6 +543,9 @@
         } else if (mAnimatingForIme) {
             return animateForIme(now);
         } else {
+            if (mDimLayer != null) {
+                mDimLayer.setLayer(mService.mLayersController.getResizeDimLayer());
+            }
             return false;
         }
     }
diff --git a/services/core/java/com/android/server/wm/DropPermissionsHandler.java b/services/core/java/com/android/server/wm/DragAndDropPermissionsHandler.java
similarity index 91%
rename from services/core/java/com/android/server/wm/DropPermissionsHandler.java
rename to services/core/java/com/android/server/wm/DragAndDropPermissionsHandler.java
index 5889fb8..1831ff9 100644
--- a/services/core/java/com/android/server/wm/DropPermissionsHandler.java
+++ b/services/core/java/com/android/server/wm/DragAndDropPermissionsHandler.java
@@ -23,11 +23,12 @@
 import android.os.IBinder;
 import android.os.RemoteException;
 
-import com.android.internal.view.IDropPermissions;
+import com.android.internal.view.IDragAndDropPermissions;
 
 import java.util.ArrayList;
 
-class DropPermissionsHandler extends IDropPermissions.Stub implements IBinder.DeathRecipient {
+class DragAndDropPermissionsHandler extends IDragAndDropPermissions.Stub
+        implements IBinder.DeathRecipient {
 
     private final int mSourceUid;
     private final String mTargetPackage;
@@ -40,8 +41,8 @@
     private IBinder mActivityToken = null;
     private IBinder mPermissionOwnerToken = null;
 
-    DropPermissionsHandler(ClipData clipData, int sourceUid, String targetPackage, int mode,
-            int sourceUserId, int targetUserId) {
+    DragAndDropPermissionsHandler(ClipData clipData, int sourceUid, String targetPackage, int mode,
+                                  int sourceUserId, int targetUserId) {
         mSourceUid = sourceUid;
         mTargetPackage = targetPackage;
         mMode = mode;
diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java
index ffe0336..0539b05 100644
--- a/services/core/java/com/android/server/wm/DragState.java
+++ b/services/core/java/com/android/server/wm/DragState.java
@@ -59,7 +59,7 @@
 import com.android.server.wm.WindowManagerService.DragInputEventReceiver;
 import com.android.server.wm.WindowManagerService.H;
 
-import com.android.internal.view.IDropPermissions;
+import com.android.internal.view.IDragAndDropPermissions;
 
 import java.util.ArrayList;
 
@@ -484,10 +484,10 @@
 
         final int targetUserId = UserHandle.getUserId(touchedWin.getOwningUid());
 
-        DropPermissionsHandler dropPermissions = null;
+        DragAndDropPermissionsHandler dragAndDropPermissions = null;
         if ((mFlags & View.DRAG_FLAG_GLOBAL) != 0 &&
                 (mFlags & DRAG_FLAGS_URI_ACCESS) != 0) {
-            dropPermissions = new DropPermissionsHandler(
+            dragAndDropPermissions = new DragAndDropPermissionsHandler(
                     mData,
                     mUid,
                     touchedWin.getOwningPackage(),
@@ -501,7 +501,7 @@
         final int myPid = Process.myPid();
         final IBinder token = touchedWin.mClient.asBinder();
         DragEvent evt = obtainDragEvent(touchedWin, DragEvent.ACTION_DROP, x, y,
-                null, null, mData, dropPermissions, false);
+                null, null, mData, dragAndDropPermissions, false);
         try {
             touchedWin.mClient.dispatchDragEvent(evt);
 
@@ -524,12 +524,12 @@
     private static DragEvent obtainDragEvent(WindowState win, int action,
             float x, float y, Object localState,
             ClipDescription description, ClipData data,
-            IDropPermissions dropPermissions,
+            IDragAndDropPermissions dragAndDropPermissions,
             boolean result) {
         final float winX = win.translateToWindowX(x);
         final float winY = win.translateToWindowY(y);
         return DragEvent.obtain(action, winX, winY, localState, description, data,
-                dropPermissions, result);
+                dragAndDropPermissions, result);
     }
 
     boolean stepAnimationLocked(long currentTimeMs) {
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 467f5b6..00de7e4 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -118,7 +118,6 @@
     // Whether the stack and all its tasks is currently being drag-resized
     private boolean mDragResizing;
 
-    private final Rect mLastContentBounds = new Rect();
     private final Rect mTmpAdjustedBounds = new Rect();
     private boolean mAdjustedForIme;
     private boolean mImeGoingAway;
@@ -974,7 +973,6 @@
             contentBounds.bottom = imeTop;
         }
 
-        mLastContentBounds.set(contentBounds);
         final int yOffset = displayContentRect.bottom - contentBounds.bottom;
 
         final int dividerWidth =
@@ -1084,7 +1082,6 @@
         }
         if (!adjust) {
             mTmpAdjustedBounds.setEmpty();
-            mLastContentBounds.setEmpty();
         }
         setAdjustedBounds(mTmpAdjustedBounds);
 
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 3af03c7..ff63632 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -173,6 +173,7 @@
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
 import static android.view.WindowManager.DOCKED_BOTTOM;
 import static android.view.WindowManager.DOCKED_INVALID;
+import static android.view.WindowManager.DOCKED_TOP;
 import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
 import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
 import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
@@ -7466,6 +7467,10 @@
         final boolean imeVisible = imeWin != null && imeWin.isVisibleLw() && imeWin.isDisplayedLw();
         final boolean dockVisible = isStackVisibleLocked(DOCKED_STACK_ID);
         final TaskStack imeTargetStack = getImeTargetStackLocked();
+        final int imeDockSide = (dockVisible && imeTargetStack != null) ?
+                imeTargetStack.getDockSide() : DOCKED_INVALID;
+        final boolean imeOnTop = (imeDockSide == DOCKED_TOP);
+        final boolean imeOnBottom = (imeDockSide == DOCKED_BOTTOM);
 
         // The divider could be adjusted for IME position, or be thinner than usual,
         // or both. There are three possible cases:
@@ -7473,20 +7478,19 @@
         // - If IME is visible, and focus is on bottom, divider is moved for IME and thinner.
         // - If IME is not visible, divider is not moved and is normal width.
 
-        if (imeVisible && dockVisible && imeTargetStack != null) {
-            final boolean isFocusOnBottom = imeTargetStack.getDockSide() == DOCKED_BOTTOM;
+        if (imeVisible && dockVisible && (imeOnTop || imeOnBottom)) {
             final ArrayList<TaskStack> stacks = displayContent.getStacks();
             for (int i = stacks.size() - 1; i >= 0; --i) {
                 final TaskStack stack = stacks.get(i);
                 final boolean isDockedOnBottom = stack.getDockSide() == DOCKED_BOTTOM;
-                if (stack.isVisibleLocked() && (isFocusOnBottom || isDockedOnBottom)) {
+                if (stack.isVisibleLocked() && (imeOnBottom || isDockedOnBottom)) {
                     stack.setAdjustedForIme(imeWin);
                 } else {
                     stack.resetAdjustedForIme(false);
                 }
             }
             displayContent.mDividerControllerLocked.setAdjustedForIme(
-                    isFocusOnBottom /*ime*/, true /*divider*/, true /*animate*/, imeWin);
+                    imeOnBottom /*ime*/, true /*divider*/, true /*animate*/, imeWin);
         } else {
             final ArrayList<TaskStack> stacks = displayContent.getStacks();
             for (int i = stacks.size() - 1; i >= 0; --i) {