Merge "clarify MediaCodec.setVideoScalingMode behavior" into nyc-dev
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 6bb853a..f2e5997 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -1958,6 +1958,10 @@
             }
 
             if (res != null) {
+                if (!res.exists()) {
+                    Log.wtf(TAG, "Data directory doesn't exist for package " + getPackageName(),
+                            new Throwable());
+                }
                 return res;
             } else {
                 throw new RuntimeException(
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index fb70c71..2be55317 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -379,6 +379,11 @@
             // Add path to libraries in apk for current abi. Do this now because more entries
             // will be added to zipPaths that shouldn't be part of the library path.
             if (aInfo.primaryCpuAbi != null) {
+                // Add fake libs into the library search path if we target prior to N.
+                if (aInfo.targetSdkVersion <= 23) {
+                    outLibPaths.add("/system/fake-libs" +
+                        (VMRuntime.is64BitAbi(aInfo.primaryCpuAbi) ? "64" : ""));
+                }
                 for (String apk : outZipPaths) {
                     outLibPaths.add(apk + "!/lib/" + aInfo.primaryCpuAbi);
                 }
diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java
index d9c3a02..c67b008 100644
--- a/graphics/java/android/graphics/drawable/LayerDrawable.java
+++ b/graphics/java/android/graphics/drawable/LayerDrawable.java
@@ -1419,9 +1419,13 @@
 
     @Override
     public void jumpToCurrentState() {
-        final ChildDrawable[] children = mLayerState.mChildren;
-        for (int i = 0, count = mLayerState.mNum; i < count; i++) {
-            children[i].mDrawable.jumpToCurrentState();
+        final ChildDrawable[] array = mLayerState.mChildren;
+        final int N = mLayerState.mNum;
+        for (int i = 0; i < N; i++) {
+            final Drawable dr = array[i].mDrawable;
+            if (dr != null) {
+                dr.jumpToCurrentState();
+            }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java
index 2ec180d..0e5ebc9 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java
@@ -257,8 +257,12 @@
             case MotionEvent.ACTION_UP:
             case MotionEvent.ACTION_CANCEL: {
                 if (mDragRequested) {
+                    boolean cancelled = action == MotionEvent.ACTION_CANCEL;
+                    if (cancelled) {
+                        EventBus.getDefault().send(new DragDropTargetChangedEvent(mDragTask, null));
+                    }
                     EventBus.getDefault().send(new DragEndEvent(mDragTask, mTaskView,
-                            action == MotionEvent.ACTION_UP ? mLastDropTarget : null));
+                            !cancelled ? mLastDropTarget : null));
                     break;
                 }
             }
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 5249131..a7c994b 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -3457,7 +3457,7 @@
         // First things first: if this activity is currently visible,
         // and the resumed activity is not yet visible, then hold off on
         // finishing until the resumed one becomes visible.
-        if (mode == FINISH_AFTER_VISIBLE && r.nowVisible) {
+        if (mode == FINISH_AFTER_VISIBLE && (r.visible || r.nowVisible)) {
             if (!mStackSupervisor.mStoppingActivities.contains(r)) {
                 addToStopping(r, false /* immediate */);
             }
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index f21966d..547379d 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -18819,7 +18819,8 @@
         } catch (Exception e) {
             logCriticalInfo(Log.WARN, "Destroying user " + userId + " on volume " + volumeUuid
                     + " because we failed to prepare: " + e);
-            destroyUserDataLI(volumeUuid, userId, flags);
+            destroyUserDataLI(volumeUuid, userId,
+                    StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE);
 
             if (allowRecover) {
                 // Try one last time; if we fail again we're really in trouble
diff --git a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java
index 553c5de..29b9b92 100644
--- a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java
+++ b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java
@@ -32,6 +32,7 @@
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.service.vr.IVrManager;
+import android.service.vr.IVrStateCallbacks;
 import android.util.DisplayMetrics;
 import android.util.Slog;
 import android.util.SparseBooleanArray;
@@ -70,7 +71,9 @@
     private long mPanicTime;
     private WindowManager mWindowManager;
     private int mCurrentUserId;
-    private IVrManager mVrManager;
+    // Local copy of vr mode enabled state, to avoid calling into VrManager with
+    // the lock held.
+    boolean mVrModeEnabled = false;
 
     public ImmersiveModeConfirmation(Context context) {
         mContext = context;
@@ -117,22 +120,19 @@
         }
     }
 
-    private boolean getVrMode() {
-        boolean vrMode = false;
-        if (mVrManager == null) {
-            // lazily grab this service since it may not be available at construction time
-            mVrManager = (IVrManager) IVrManager.Stub.asInterface(
+    void systemReady() {
+        IVrManager vrManager = IVrManager.Stub.asInterface(
                 ServiceManager.getService(VrManagerService.VR_MANAGER_BINDER_SERVICE));
-        }
-        if (mVrManager != null) {
+        if (vrManager != null) {
             try {
-                vrMode = mVrManager.getVrModeState();
-            } catch (RemoteException ex) { }
+                vrManager.registerListener(mVrStateCallbacks);
+                mVrModeEnabled = vrManager.getVrModeState();
+            } catch (RemoteException re) {
+            }
         }
-        return vrMode;
     }
 
-    public void immersiveModeChanged(String pkg, boolean isImmersiveMode,
+    public void immersiveModeChangedLw(String pkg, boolean isImmersiveMode,
             boolean userSetupComplete) {
         mHandler.removeMessages(H.SHOW);
         if (isImmersiveMode) {
@@ -142,7 +142,7 @@
             if (!disabled
                     && (DEBUG_SHOW_EVERY_TIME || !mConfirmed)
                     && userSetupComplete
-                    && !getVrMode()) {
+                    && !mVrModeEnabled) {
                 mHandler.sendEmptyMessageDelayed(H.SHOW, mShowDelayMs);
             }
         } else {
@@ -375,4 +375,11 @@
             }
         }
     }
+
+    private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() {
+        @Override
+        public void onVrStateChanged(boolean enabled) throws RemoteException {
+            mVrModeEnabled = enabled;
+        }
+    };
 }
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 9f31f4f..4e4b2f3 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -6653,6 +6653,7 @@
             mKeyguardDelegate.onBootCompleted();
         }
         mSystemGestures.systemReady();
+        mImmersiveModeConfirmation.systemReady();
     }
 
     /** {@inheritDoc} */
@@ -7357,7 +7358,7 @@
         boolean newImmersiveMode = isImmersiveMode(vis);
         if (win != null && oldImmersiveMode != newImmersiveMode) {
             final String pkg = win.getOwningPackage();
-            mImmersiveModeConfirmation.immersiveModeChanged(pkg, newImmersiveMode,
+            mImmersiveModeConfirmation.immersiveModeChangedLw(pkg, newImmersiveMode,
                     isUserSetupComplete());
         }
 
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 037f316..6f8207e 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -383,6 +383,12 @@
     }
 
     boolean updateBoundsAfterConfigChange(boolean scheduleResize) {
+        if (mFullscreen) {
+            // Bounds will already be set correctly when display info is updated in the case of
+            // fullscreen.
+            return false;
+        }
+
         if (mLastConfigChangedRotation != mLastUpdateDisplayInfoRotation) {
             // We wait for the rotation values after configuration change and display info. update
             // to be equal before updating the bounds due to rotation change otherwise things might
@@ -399,6 +405,7 @@
         }
 
         final int oldDockSide = mStackId == DOCKED_STACK_ID ? getDockSide() : DOCKED_INVALID;
+        mTmpRect2.set(mBounds);
         mDisplayContent.rotateBounds(mRotation, newRotation, mTmpRect2);
         if (mStackId == DOCKED_STACK_ID) {
             repositionDockedStackAfterRotation(mTmpRect2);