Fixes #1886237. Views drawing cache was not generated properly.

In compatibility mode, a View's drawing cache was created at the 160 density
scale instead of the right scale.
diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java
index ee8229d..d35b048 100644
--- a/core/java/android/view/ViewRoot.java
+++ b/core/java/android/view/ViewRoot.java
@@ -94,18 +94,18 @@
 
     static final ThreadLocal<RunQueue> sRunQueues = new ThreadLocal<RunQueue>();
 
-    private static int sDrawTime;    
+    private static int sDrawTime;
 
     long mLastTrackballTime = 0;
     final TrackballAxis mTrackballAxisX = new TrackballAxis();
     final TrackballAxis mTrackballAxisY = new TrackballAxis();
 
     final int[] mTmpLocation = new int[2];
-    
+
     final InputMethodCallback mInputMethodCallback;
     final SparseArray<Object> mPendingEvents = new SparseArray<Object>();
     int mPendingEventSeq = 0;
-    
+
     final Thread mThread;
 
     final WindowLeaked mLocation;
@@ -127,7 +127,7 @@
     int mHeight;
     Rect mDirty; // will be a graphics.Region soon
     boolean mIsAnimating;
-    
+
     private CompatibilityInfo mCompatibilityInfo;
 
     final View.AttachInfo mAttachInfo;
@@ -170,7 +170,7 @@
     int mScrollY;
     int mCurScrollY;
     Scroller mScroller;
-    
+
     EGL10 mEgl;
     EGLDisplay mEglDisplay;
     EGLContext mEglContext;
@@ -180,7 +180,7 @@
     boolean mUseGL;
     boolean mGlWanted;
 
-    final ViewConfiguration mViewConfiguration;    
+    final ViewConfiguration mViewConfiguration;
 
     /**
      * see {@link #playSoundEffect(int)}
@@ -399,13 +399,15 @@
                 mSoftInputMode = attrs.softInputMode;
                 mWindowAttributesChanged = true;
                 mAttachInfo.mRootView = view;
+                mAttachInfo.mScalingRequired = mCompatibilityInfo.mScalingRequired;
+                mAttachInfo.mApplicationScale = mCompatibilityInfo.mApplicationScale;
                 if (panelParentView != null) {
                     mAttachInfo.mPanelParentWindowToken
                             = panelParentView.getApplicationWindowToken();
                 }
                 mAdded = true;
                 int res; /* = WindowManagerImpl.ADD_OKAY; */
-                
+
                 // Schedule the first layout -before- adding to the window
                 // manager, to make sure we do the relayout before receiving
                 // any other events from the system.
@@ -594,7 +596,7 @@
     int getHostVisibility() {
         return mAppVisible ? mView.getVisibility() : View.GONE;
     }
-    
+
     private void performTraversals() {
         // cache mView since it is used so much below...
         final View host = mView;
@@ -638,7 +640,7 @@
             fullRedrawNeeded = true;
             mLayoutRequested = true;
 
-            DisplayMetrics packageMetrics = 
+            DisplayMetrics packageMetrics =
                 mView.getContext().getResources().getDisplayMetrics();
             desiredWindowWidth = packageMetrics.widthPixels;
             desiredWindowHeight = packageMetrics.heightPixels;
@@ -685,7 +687,7 @@
         }
 
         boolean insetsChanged = false;
-        
+
         if (mLayoutRequested) {
             if (mFirst) {
                 host.fitSystemWindows(mAttachInfo.mContentInsets);
@@ -710,7 +712,7 @@
                         || lp.height == ViewGroup.LayoutParams.WRAP_CONTENT) {
                     windowResizesToFitContent = true;
 
-                    DisplayMetrics packageMetrics = 
+                    DisplayMetrics packageMetrics =
                         mView.getContext().getResources().getDisplayMetrics();
                     desiredWindowWidth = packageMetrics.widthPixels;
                     desiredWindowHeight = packageMetrics.heightPixels;
@@ -770,7 +772,7 @@
                 }
             }
         }
-        
+
         if (params != null && (host.mPrivateFlags & View.REQUEST_TRANSPARENT_REGIONS) != 0) {
             if (!PixelFormat.formatHasAlpha(params.format)) {
                 params.format = PixelFormat.TRANSLUCENT;
@@ -799,7 +801,7 @@
                 // computed insets.
                 insetsPending = computesInternalInsets
                         && (mFirst || viewVisibilityChanged);
-                
+
                 if (mWindowAttributes.memoryType == WindowManager.LayoutParams.MEMORY_TYPE_GPU) {
                     if (params == null) {
                         params = mWindowAttributes;
@@ -835,7 +837,7 @@
                         + " content=" + mPendingContentInsets.toShortString()
                         + " visible=" + mPendingVisibleInsets.toShortString()
                         + " surface=" + mSurface);
-                
+
                 contentInsetsChanged = !mPendingContentInsets.equals(
                         mAttachInfo.mContentInsets);
                 visibleInsetsChanged = !mPendingVisibleInsets.equals(
@@ -863,7 +865,7 @@
                         // all at once.
                         newSurface = true;
                         fullRedrawNeeded = true;
-    
+
                         if (mGlWanted && !mUseGL) {
                             initializeGL();
                             initialized = mGlCanvas != null;
@@ -908,7 +910,7 @@
                         + " mHeight=" + mHeight
                         + " measuredHeight" + host.mMeasuredHeight
                         + " coveredInsetsChanged=" + contentInsetsChanged);
-                
+
                  // Ask host how big it wants to be
                 host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
 
@@ -983,7 +985,7 @@
                         mTmpLocation[1] + host.mBottom - host.mTop);
 
                 host.gatherTransparentRegion(mTransparentRegion);
-                mTransparentRegion.scale(appScale);                
+                mTransparentRegion.scale(appScale);
                 if (!mTransparentRegion.equals(mPreviousTransparentRegion)) {
                     mPreviousTransparentRegion.set(mTransparentRegion);
                     // reconfigure window manager
@@ -1027,7 +1029,7 @@
                 }
             }
         }
-            
+
         if (mFirst) {
             // handle first focus request
             if (DEBUG_INPUT_RESIZE) Log.v(TAG, "First: mView.hasFocus()="
@@ -1065,7 +1067,7 @@
                 }
             }
         }
-        
+
         boolean cancelDraw = attachInfo.mTreeObserver.dispatchOnPreDraw();
 
         if (!cancelDraw && !newSurface) {
@@ -1153,7 +1155,7 @@
             mAttachInfo.mViewScrollChanged = false;
             mAttachInfo.mTreeObserver.dispatchOnScrollChanged();
         }
-        
+
         int yoff;
         final boolean scrolling = mScroller != null && mScroller.computeScrollOffset();
         if (scrolling) {
@@ -1318,7 +1320,7 @@
                     EventLog.writeEvent(60000, SystemClock.elapsedRealtime() - startTime);
                 }
             }
-            
+
         } finally {
             surface.unlockCanvasAndPost(canvas);
         }
@@ -1326,7 +1328,7 @@
         if (LOCAL_LOGV) {
             Log.v("ViewRoot", "Surface " + surface + " unlockCanvasAndPost");
         }
-        
+
         if (scrolling) {
             mFullRedrawNeeded = true;
             scheduleTraversals();
@@ -1339,7 +1341,7 @@
         final Rect vi = attachInfo.mVisibleInsets;
         int scrollY = 0;
         boolean handled = false;
-        
+
         if (vi.left > ci.left || vi.top > ci.top
                 || vi.right > ci.right || vi.bottom > ci.bottom) {
             // We'll assume that we aren't going to change the scroll
@@ -1426,7 +1428,7 @@
                 }
             }
         }
-        
+
         if (scrollY != mScrollY) {
             if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Pan scroll changed: old="
                     + mScrollY + " , new=" + scrollY);
@@ -1440,10 +1442,10 @@
             }
             mScrollY = scrollY;
         }
-        
+
         return handled;
     }
-    
+
     public void requestChildFocus(View child, View focused) {
         checkThread();
         if (mFocusedView != focused) {
@@ -1523,7 +1525,7 @@
         } catch (RemoteException e) {
         }
     }
-    
+
     /**
      * Return true if child is an ancestor of parent, (or equal to the parent).
      */
@@ -1727,10 +1729,10 @@
                         }
                     }
                 }
-                
+
                 mLastWasImTarget = WindowManager.LayoutParams
                         .mayUseInputMethod(mWindowAttributes.flags);
-                
+
                 InputMethodManager imm = InputMethodManager.peekInstance();
                 if (mView != null) {
                     if (hasWindowFocus && imm != null && mLastWasImTarget) {
@@ -2151,50 +2153,50 @@
     }
 
     /**
-     * log motion events 
+     * log motion events
      */
     private static void captureMotionLog(String subTag, MotionEvent ev) {
-        //check dynamic switch        
+        //check dynamic switch
         if (ev == null ||
                 SystemProperties.getInt(ViewDebug.SYSTEM_PROPERTY_CAPTURE_EVENT, 0) == 0) {
             return;
-        } 
-        
-        StringBuilder sb = new StringBuilder(subTag + ": ");        
-        sb.append(ev.getDownTime()).append(',');        
-        sb.append(ev.getEventTime()).append(',');        
-        sb.append(ev.getAction()).append(',');        
-        sb.append(ev.getX()).append(',');        
-        sb.append(ev.getY()).append(',');        
-        sb.append(ev.getPressure()).append(',');        
-        sb.append(ev.getSize()).append(',');        
-        sb.append(ev.getMetaState()).append(',');        
-        sb.append(ev.getXPrecision()).append(',');        
-        sb.append(ev.getYPrecision()).append(',');        
-        sb.append(ev.getDeviceId()).append(',');        
-        sb.append(ev.getEdgeFlags());
-        Log.d(TAG, sb.toString());        
-    }
-    /**
-     * log motion events 
-     */
-    private static void captureKeyLog(String subTag, KeyEvent ev) {
-        //check dynamic switch                
-        if (ev == null || 
-                SystemProperties.getInt(ViewDebug.SYSTEM_PROPERTY_CAPTURE_EVENT, 0) == 0) {
-            return;
         }
-        StringBuilder sb = new StringBuilder(subTag + ": ");        
+
+        StringBuilder sb = new StringBuilder(subTag + ": ");
         sb.append(ev.getDownTime()).append(',');
         sb.append(ev.getEventTime()).append(',');
         sb.append(ev.getAction()).append(',');
-        sb.append(ev.getKeyCode()).append(',');        
+        sb.append(ev.getX()).append(',');
+        sb.append(ev.getY()).append(',');
+        sb.append(ev.getPressure()).append(',');
+        sb.append(ev.getSize()).append(',');
+        sb.append(ev.getMetaState()).append(',');
+        sb.append(ev.getXPrecision()).append(',');
+        sb.append(ev.getYPrecision()).append(',');
+        sb.append(ev.getDeviceId()).append(',');
+        sb.append(ev.getEdgeFlags());
+        Log.d(TAG, sb.toString());
+    }
+    /**
+     * log motion events
+     */
+    private static void captureKeyLog(String subTag, KeyEvent ev) {
+        //check dynamic switch
+        if (ev == null ||
+                SystemProperties.getInt(ViewDebug.SYSTEM_PROPERTY_CAPTURE_EVENT, 0) == 0) {
+            return;
+        }
+        StringBuilder sb = new StringBuilder(subTag + ": ");
+        sb.append(ev.getDownTime()).append(',');
+        sb.append(ev.getEventTime()).append(',');
+        sb.append(ev.getAction()).append(',');
+        sb.append(ev.getKeyCode()).append(',');
         sb.append(ev.getRepeatCount()).append(',');
         sb.append(ev.getMetaState()).append(',');
         sb.append(ev.getDeviceId()).append(',');
         sb.append(ev.getScanCode());
-        Log.d(TAG, sb.toString());        
-    }    
+        Log.d(TAG, sb.toString());
+    }
 
     int enqueuePendingEvent(Object event, boolean sendDone) {
         int seq = mPendingEventSeq+1;
@@ -2212,7 +2214,7 @@
         }
         return event;
     }
-    
+
     private void deliverKeyEvent(KeyEvent event, boolean sendDone) {
         // If mView is null, we just consume the key event because it doesn't
         // make sense to do anything else with it.
@@ -2269,7 +2271,7 @@
             }
         }
     }
-    
+
     private void deliverKeyEventToViewHierarchy(KeyEvent event, boolean sendDone) {
         try {
             if (mView != null && mAdded) {
@@ -2278,8 +2280,8 @@
 
                 if (checkForLeavingTouchModeAndConsume(event)) {
                     return;
-                }                
-                
+                }
+
                 if (Config.LOGV) {
                     captureKeyLog("captureDispatchKeyEvent", event);
                 }
@@ -2384,12 +2386,12 @@
         }
         return relayoutResult;
     }
-    
+
     /**
      * Adjust the window's layout parameter for compatibility mode. It replaces FILL_PARENT
      * with the default window size, and centers if the window wanted to fill
      * horizontally.
-     * 
+     *
      * @param attrs the window's layout params to adjust
      */
     private void adjustWindowAttributesForCompatibleMode(WindowManager.LayoutParams attrs) {
@@ -2628,14 +2630,14 @@
             boolean immediate) {
         return scrollToRectOrFocus(rectangle, immediate);
     }
-    
+
     static class InputMethodCallback extends IInputMethodCallback.Stub {
         private WeakReference<ViewRoot> mViewRoot;
 
         public InputMethodCallback(ViewRoot viewRoot) {
             mViewRoot = new WeakReference<ViewRoot>(viewRoot);
         }
-        
+
         public void finishedEvent(int seq, boolean handled) {
             final ViewRoot viewRoot = mViewRoot.get();
             if (viewRoot != null) {
@@ -2647,13 +2649,13 @@
             // Stub -- not for use in the client.
         }
     }
-    
+
     static class EventCompletion extends Handler {
         final IWindow mWindow;
         final KeyEvent mKeyEvent;
         final boolean mIsPointer;
         final MotionEvent mMotionEvent;
-        
+
         EventCompletion(Looper looper, IWindow window, KeyEvent key,
                 boolean isPointer, MotionEvent motion) {
             super(looper);
@@ -2663,7 +2665,7 @@
             mMotionEvent = motion;
             sendEmptyMessage(0);
         }
-        
+
         @Override
         public void handleMessage(Message msg) {
             if (mKeyEvent != null) {
@@ -2705,7 +2707,7 @@
             }
         }
     }
-    
+
     static class W extends IWindow.Stub {
         private final WeakReference<ViewRoot> mViewRoot;
         private final Looper mMainLooper;
@@ -2827,14 +2829,14 @@
          * The maximum amount of acceleration we will apply.
          */
         static final float MAX_ACCELERATION = 20;
-        
+
         /**
          * The maximum amount of time (in milliseconds) between events in order
          * for us to consider the user to be doing fast trackball movements,
          * and thus apply an acceleration.
          */
         static final long FAST_MOVE_TIME = 150;
-        
+
         /**
          * Scaling factor to the time (in milliseconds) between events to how
          * much to multiple/divide the current acceleration.  When movement
@@ -2842,7 +2844,7 @@
          * FAST_MOVE_TIME it divides it.
          */
         static final float ACCEL_MOVE_SCALING_FACTOR = (1.0f/40);
-        
+
         float position;
         float absPosition;
         float acceleration = 1;
@@ -2894,7 +2896,7 @@
             } else {
                 normTime = 0;
             }
-            
+
             // The number of milliseconds between each movement that is
             // considered "normal" and will not result in any acceleration
             // or deceleration, scaled by the offset we have here.
@@ -3052,7 +3054,7 @@
         sRunQueues.set(rq);
         return rq;
     }
-    
+
     /**
      * @hide
      */