Merge "Maybe fix issue #17700474: manta: high occurrence of device booted..." into lmp-dev
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index 5ba7d50..cc0d51c 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -132,6 +132,7 @@
                 "       am to-uri [INTENT]\n" +
                 "       am to-intent-uri [INTENT]\n" +
                 "       am switch-user <USER_ID>\n" +
+                "       am start-user <USER_ID>\n" +
                 "       am stop-user <USER_ID>\n" +
                 "       am stack start <DISPLAY_ID> <INTENT>\n" +
                 "       am stack movetask <TASK_ID> <STACK_ID> [true|false]\n" +
@@ -233,8 +234,11 @@
                 "am switch-user: switch to put USER_ID in the foreground, starting\n" +
                 "  execution of that user if it is currently stopped.\n" +
                 "\n" +
+                "am start-user: start USER_ID in background if it is currently stopped,\n" +
+                "  use switch-user if you want to start the user in foreground.\n" +
+                "\n" +
                 "am stop-user: stop execution of USER_ID, not allowing it to run any\n" +
-                "  code until a later explicit switch to it.\n" +
+                "  code until a later explicit start or switch to it.\n" +
                 "\n" +
                 "am stack start: start a new activity on <DISPLAY_ID> using <INTENT>.\n" +
                 "\n" +
@@ -340,6 +344,8 @@
             runToUri(true);
         } else if (op.equals("switch-user")) {
             runSwitchUser();
+        } else if (op.equals("start-user")) {
+            runStartUserInBackground();
         } else if (op.equals("stop-user")) {
             runStopUser();
         } else if (op.equals("stack")) {
@@ -1133,6 +1139,16 @@
         mAm.switchUser(Integer.parseInt(user));
     }
 
+    private void runStartUserInBackground() throws Exception {
+        String user = nextArgRequired();
+        boolean success = mAm.startUserInBackground(Integer.parseInt(user));
+        if (success) {
+            System.out.println("Success: user started");
+        } else {
+            System.err.println("Error: could not start user");
+        }
+    }
+
     private void runStopUser() throws Exception {
         String user = nextArgRequired();
         int res = mAm.stopUser(Integer.parseInt(user), null);
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 3d14c58..cd6088f 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -579,7 +579,7 @@
         public TaskDescription(TaskDescription td) {
             mLabel = td.mLabel;
             mIcon = td.mIcon;
-            setPrimaryColor(td.mColorPrimary);
+            mColorPrimary = td.mColorPrimary;
             mIconFilename = td.mIconFilename;
         }
 
@@ -600,7 +600,11 @@
          * @hide
          */
         public void setPrimaryColor(int primaryColor) {
-            mColorPrimary = 0xFF000000 | primaryColor;
+            // Ensure that the given color is valid
+            if ((primaryColor != 0) && (Color.alpha(primaryColor) != 255)) {
+                throw new RuntimeException("A TaskDescription's primary color should be opaque");
+            }
+            mColorPrimary = primaryColor;
         }
 
         /**
diff --git a/core/java/android/app/ApplicationErrorReport.java b/core/java/android/app/ApplicationErrorReport.java
index be4e80e..841bd16 100644
--- a/core/java/android/app/ApplicationErrorReport.java
+++ b/core/java/android/app/ApplicationErrorReport.java
@@ -388,7 +388,7 @@
             dest.writeInt(throwLineNumber);
             dest.writeString(stackTrace);
             int total = dest.dataPosition()-start;
-            if (total > 100*1024) {
+            if (total > 10*1024) {
                 Slog.d("Error", "ERR: exClass=" + exceptionClassName);
                 Slog.d("Error", "ERR: exMsg=" + exceptionMessage);
                 Slog.d("Error", "ERR: file=" + throwFileName);
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 31b39ebb2..4b3aefe 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -798,8 +798,8 @@
     public static final String EXTRA_TEMPLATE = "android.template";
 
     /**
-     * {@link #extras} key: An array of people that this notification relates to, specified
-     * by contacts provider contact URI.
+     * {@link #extras} key: A String array containing the people that this notification relates to,
+     * each of which was supplied to {@link Builder#addPerson(String)}.
      */
     public static final String EXTRA_PEOPLE = "android.people";
 
@@ -2393,10 +2393,27 @@
         /**
          * Add a person that is relevant to this notification.
          *
+         * <P>
+         * Depending on user preferences, this annotation may allow the notification to pass
+         * through interruption filters, and to appear more prominently in the user interface.
+         * </P>
+         *
+         * <P>
+         * The person should be specified by the {@code String} representation of a
+         * {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}.
+         * </P>
+         *
+         * <P>The system will also attempt to resolve {@code mailto:} and {@code tel:} schema
+         * URIs.  The path part of these URIs must exist in the contacts database, in the
+         * appropriate column, or the reference will be discarded as invalid. Telephone schema
+         * URIs will be resolved by {@link android.provider.ContactsContract.PhoneLookup}.
+         * </P>
+         *
+         * @param uri A URI for the person.
          * @see Notification#EXTRA_PEOPLE
          */
-        public Builder addPerson(String handle) {
-            mPeople.add(handle);
+        public Builder addPerson(String uri) {
+            mPeople.add(uri);
             return this;
         }
 
diff --git a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
index 618195a..03540e1 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
@@ -1350,6 +1350,14 @@
         m.set(CaptureRequest.LENS_FOCAL_LENGTH,
                 c.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS)[0]);
 
+        /*
+         * jpeg.*
+         */
+
+        // jpeg.thumbnailSize - set smallest non-zero size if possible
+        Size[] sizes = c.get(CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES);
+        m.set(CaptureRequest.JPEG_THUMBNAIL_SIZE, (sizes.length > 1) ? sizes[1] : sizes[0]);
+
         // TODO: map other request template values
         return m;
     }
diff --git a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
index fd95901..35deb71 100644
--- a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
+++ b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
@@ -16,11 +16,13 @@
 
 package android.hardware.camera2.legacy;
 
+import android.graphics.ImageFormat;
 import android.graphics.SurfaceTexture;
 import android.hardware.Camera;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.impl.CameraDeviceImpl;
+import android.hardware.camera2.params.StreamConfigurationMap;
 import android.hardware.camera2.utils.LongParcelable;
 import android.hardware.camera2.utils.SizeAreaComparator;
 import android.hardware.camera2.impl.CameraMetadataNative;
@@ -36,6 +38,7 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -208,18 +211,23 @@
 
                         int totalSize = data.length + LegacyCameraDevice.nativeGetJpegFooterSize();
                         totalSize = (totalSize + 3) & ~0x3; // round up to nearest octonibble
+                        LegacyCameraDevice.setNextTimestamp(s, timestamp);
 
                         if (USE_BLOB_FORMAT_OVERRIDE) {
                             // Override to RGBA_8888 format.
                             LegacyCameraDevice.setSurfaceFormat(s,
                                     LegacyMetadataMapper.HAL_PIXEL_FORMAT_RGBA_8888);
-                            // divide by 4 if using RGBA format (width is in pixels, not bytes).
-                            totalSize >>= 2;
+
+                            int dimen = (int) Math.ceil(Math.sqrt(totalSize));
+                            dimen = (dimen + 0xf) & ~0xf; // round up to nearest multiple of 16
+                            LegacyCameraDevice.setSurfaceDimens(s, dimen, dimen);
+                            LegacyCameraDevice.produceFrame(s, data, dimen, dimen,
+                                    CameraMetadataNative.NATIVE_JPEG_FORMAT);
+                        } else {
+                            LegacyCameraDevice.setSurfaceDimens(s, totalSize, /*height*/1);
+                            LegacyCameraDevice.produceFrame(s, data, totalSize, /*height*/1,
+                                    CameraMetadataNative.NATIVE_JPEG_FORMAT);
                         }
-                        LegacyCameraDevice.setSurfaceDimens(s, totalSize, /*height*/1);
-                        LegacyCameraDevice.setNextTimestamp(s, timestamp);
-                        LegacyCameraDevice.produceFrame(s, data, totalSize, /*height*/1,
-                                CameraMetadataNative.NATIVE_JPEG_FORMAT);
                     }
                 } catch (LegacyExceptionUtils.BufferQueueAbandonedException e) {
                     Log.w(TAG, "Surface abandoned, dropping frame. ", e);
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java
index f5fc0d7..bbf6ed8 100644
--- a/core/java/android/os/Binder.java
+++ b/core/java/android/os/Binder.java
@@ -430,16 +430,18 @@
         } catch (RemoteException e) {
             if ((flags & FLAG_ONEWAY) != 0) {
                 Log.w(TAG, "Binder call failed.", e);
+            } else {
+                reply.setDataPosition(0);
+                reply.writeException(e);
             }
-            reply.setDataPosition(0);
-            reply.writeException(e);
             res = true;
         } catch (RuntimeException e) {
             if ((flags & FLAG_ONEWAY) != 0) {
                 Log.w(TAG, "Caught a RuntimeException from the binder stub implementation.", e);
+            } else {
+                reply.setDataPosition(0);
+                reply.writeException(e);
             }
-            reply.setDataPosition(0);
-            reply.writeException(e);
             res = true;
         } catch (OutOfMemoryError e) {
             // Unconditionally log this, since this is generally unrecoverable.
@@ -452,6 +454,14 @@
         checkParcel(this, code, reply, "Unreasonably large binder reply buffer");
         reply.recycle();
         data.recycle();
+
+        // Just in case -- we are done with the IPC, so there should be no more strict
+        // mode violations that have gathered for this thread.  Either they have been
+        // parceled and are now in transport off to the caller, or we are returning back
+        // to the main transaction loop to wait for another incoming transaction.  Either
+        // way, strict mode begone!
+        StrictMode.clearGatheredViolations();
+
         return res;
     }
 }
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index 4e9d1f0..0e561bd 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -1693,7 +1693,7 @@
                 int start = p.dataPosition();
                 violations.get(i).writeToParcel(p, 0 /* unused flags? */);
                 int size = p.dataPosition()-start;
-                if (size > 100*1024) {
+                if (size > 10*1024) {
                     Slog.d(TAG, "Wrote violation #" + i + " of " + violations.size() + ": "
                             + (p.dataPosition()-start) + " bytes");
                 }
@@ -1725,6 +1725,11 @@
         for (int i = 0; i < numViolations; ++i) {
             if (LOG_V) Log.d(TAG, "strict mode violation stacks read from binder call.  i=" + i);
             ViolationInfo info = new ViolationInfo(p, !currentlyGathering);
+            if (info.crashInfo.stackTrace.length() > 5000) {
+                RuntimeException here = new RuntimeException("here");
+                here.fillInStackTrace();
+                Slog.w(TAG, "Stack is getting large: " + info.crashInfo.stackTrace, here);
+            }
             info.crashInfo.stackTrace += "# via Binder call with stack:\n" + ourStack;
             BlockGuard.Policy policy = BlockGuard.getThreadPolicy();
             if (policy instanceof AndroidBlockGuardPolicy) {
@@ -2194,7 +2199,7 @@
             dest.writeString(broadcastIntentAction);
             dest.writeStringArray(tags);
             int total = dest.dataPosition()-start;
-            if (total > 100*1024) {
+            if (total > 10*1024) {
                 Slog.d(TAG, "VIO: policy=" + policy + " dur=" + durationMillis
                         + " numLoop=" + violationNumThisLoop
                         + " anim=" + numAnimationsRunning
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index 35fff74..5d6acd8 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -760,6 +760,9 @@
         /**
          * Returns whether the notification matches the user's interruption
          * filter.
+         *
+         * @return {@code true} if the notification is allowed by the filter, or
+         * {@code false} if it is blocked.
          */
         public boolean matchesInterruptionFilter() {
             return mMatchesInterruptionFilter;
diff --git a/core/java/android/view/AccessibilityManagerInternal.java b/core/java/android/view/AccessibilityManagerInternal.java
new file mode 100644
index 0000000..7bb2dc5
--- /dev/null
+++ b/core/java/android/view/AccessibilityManagerInternal.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+/**
+ * Accessibility manager local system service interface.
+ *
+ * @hide Only for use within the system server.
+ */
+public abstract class AccessibilityManagerInternal {
+
+    /**
+     * Queries if the accessibility manager service permits setting
+     * a non-default encryption password.
+     */
+    public abstract boolean isNonDefaultEncryptionPasswordAllowed();
+}
diff --git a/core/java/android/view/GhostView.java b/core/java/android/view/GhostView.java
index 50c927a..20baad0 100644
--- a/core/java/android/view/GhostView.java
+++ b/core/java/android/view/GhostView.java
@@ -324,19 +324,27 @@
         final ArrayList<View> preorderedList = parent.buildOrderedChildList();
         final boolean customOrder = preorderedList == null
                 && parent.isChildrenDrawingOrderEnabled();
+
+        // This default value shouldn't be used because both view and comparedWith
+        // should be in the list. If there is an error, then just return an arbitrary
+        // view is on top.
+        boolean isOnTop = true;
         for (int i = 0; i < childrenCount; i++) {
             int childIndex = customOrder ? parent.getChildDrawingOrder(childrenCount, i) : i;
             final View child = (preorderedList == null)
                     ? parent.getChildAt(childIndex) : preorderedList.get(childIndex);
             if (child == view) {
-                return false;
+                isOnTop = false;
+                break;
             } else if (child == comparedWith) {
-                return true;
+                isOnTop = true;
+                break;
             }
         }
 
-        // Shouldn't get here. Neither of the children is in the parent.
-        // Just return an arbitrary one.
-        return true;
+        if (preorderedList != null) {
+            preorderedList.clear();
+        }
+        return isOnTop;
     }
 }
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 83dfe85..b454681 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -6601,6 +6601,7 @@
      * @see #fitSystemWindows(Rect)
      * @see #setSystemUiVisibility(int)
      */
+    @ViewDebug.ExportedProperty
     public boolean getFitsSystemWindows() {
         return (mViewFlags & FITS_SYSTEM_WINDOWS) == FITS_SYSTEM_WINDOWS;
     }
diff --git a/core/java/android/widget/FrameLayout.java b/core/java/android/widget/FrameLayout.java
index 235e79f..e317524 100644
--- a/core/java/android/widget/FrameLayout.java
+++ b/core/java/android/widget/FrameLayout.java
@@ -29,6 +29,7 @@
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.view.Gravity;
+import android.view.RemotableViewMethod;
 import android.view.View;
 import android.view.ViewDebug;
 import android.view.ViewGroup;
@@ -201,6 +202,15 @@
         }
     }
 
+    @Override
+    @RemotableViewMethod
+    public void setVisibility(@Visibility int visibility) {
+        super.setVisibility(visibility);
+        if (mForeground != null) {
+            mForeground.setVisible(visibility == VISIBLE, false);
+        }
+    }
+
     /**
      * {@inheritDoc}
      */
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 42fc613..c00d209 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -6732,7 +6732,6 @@
         Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE);
         m.arg1 = onBattery ? 1 : 0;
         mHandler.sendMessage(m);
-        mOnBattery = mOnBatteryInternal = onBattery;
 
         final long uptime = mSecUptime * 1000;
         final long realtime = mSecRealtime * 1000;
@@ -6745,10 +6744,11 @@
             boolean reset = false;
             if (!mNoAutoReset && (oldStatus == BatteryManager.BATTERY_STATUS_FULL
                     || level >= 90
-                    || getLowDischargeAmountSinceCharge() >= 60)
-                    || (getHighDischargeAmountSinceCharge() >= 60
-                            && mHistoryBuffer.dataSize() >= MAX_HISTORY_BUFFER)) {
+                    || (mDischargeCurrentLevel < 20 && level >= 80)
+                    || (getHighDischargeAmountSinceCharge() >= 200
+                            && mHistoryBuffer.dataSize() >= MAX_HISTORY_BUFFER))) {
                 Slog.i(TAG, "Resetting battery stats: level=" + level + " status=" + oldStatus
+                        + " dischargeLevel=" + mDischargeCurrentLevel
                         + " lowAmount=" + getLowDischargeAmountSinceCharge()
                         + " highAmount=" + getHighDischargeAmountSinceCharge());
                 // Before we write, collect a snapshot of the final aggregated
@@ -6785,6 +6785,7 @@
                 reset = true;
                 mNumDischargeStepDurations = 0;
             }
+            mOnBattery = mOnBatteryInternal = onBattery;
             mLastDischargeStepLevel = level;
             mMinDischargeStepLevel = level;
             mLastDischargeStepTime = -1;
@@ -6812,6 +6813,7 @@
             mDischargeAmountScreenOff = 0;
             updateTimeBasesLocked(true, !screenOn, uptime, realtime);
         } else {
+            mOnBattery = mOnBatteryInternal = onBattery;
             pullPendingStateUpdatesLocked();
             mHistoryCur.batteryLevel = (byte)level;
             mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 16fa88e..2b7af4b 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -878,6 +878,30 @@
     }
 
     /**
+     * Gets whether the device is encrypted.
+     *
+     * @return Whether the device is encrypted.
+     */
+    public static boolean isDeviceEncrypted() {
+        IMountService mountService = IMountService.Stub.asInterface(
+                ServiceManager.getService("mount"));
+        try {
+            return mountService.getEncryptionState() != IMountService.ENCRYPTION_STATE_NONE
+                    && mountService.getPasswordType() != StorageManager.CRYPT_TYPE_DEFAULT;
+        } catch (RemoteException re) {
+            Log.e(TAG, "Error getting encryption state", re);
+        }
+        return true;
+    }
+
+    /**
+     * Clears the encryption password.
+     */
+    public void clearEncryptionPassword() {
+        updateEncryptionPassword(StorageManager.CRYPT_TYPE_DEFAULT, null);
+    }
+
+    /**
      * Retrieves the quality mode we're in.
      * {@see DevicePolicyManager#getPasswordQuality(android.content.ComponentName)}
      *
diff --git a/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp b/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
index b90e493..8440a0e 100644
--- a/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
+++ b/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
@@ -193,12 +193,13 @@
     if (err != NO_ERROR) return err;
 
     sp<GraphicBuffer> buf(new GraphicBuffer(anb, /*keepOwnership*/false));
-    uint32_t gBufWidth = buf->getWidth();
-    uint32_t gBufHeight = buf->getHeight();
-    if (gBufWidth != width || gBufHeight != height) {
+    uint32_t grallocBufWidth = buf->getWidth();
+    uint32_t grallocBufHeight = buf->getHeight();
+    uint32_t grallocBufStride = buf->getStride();
+    if (grallocBufWidth != width || grallocBufHeight != height) {
         ALOGE("%s: Received gralloc buffer with bad dimensions %" PRIu32 "x%" PRIu32
-                ", expecting dimensions %zu x %zu",  __FUNCTION__, gBufWidth, gBufHeight,
-                width, height);
+                ", expecting dimensions %zu x %zu",  __FUNCTION__, grallocBufWidth,
+                grallocBufHeight, width, height);
         return BAD_VALUE;
     }
 
@@ -210,11 +211,12 @@
         return err;
     }
 
-    uint64_t tmpSize = width * height;
+    uint64_t tmpSize = (pixelFmt == HAL_PIXEL_FORMAT_BLOB) ? grallocBufWidth :
+            4 * grallocBufHeight * grallocBufWidth;
     if (bufFmt != pixelFmt) {
         if (bufFmt == HAL_PIXEL_FORMAT_RGBA_8888 && pixelFmt == HAL_PIXEL_FORMAT_BLOB) {
             ALOGV("%s: Using BLOB to RGBA format override.", __FUNCTION__);
-            tmpSize *= 4;
+            tmpSize = 4 * (grallocBufWidth + grallocBufStride * (grallocBufHeight - 1));
         } else {
             ALOGW("%s: Format mismatch in produceFrame: expecting format %#" PRIx32
                     ", but received buffer with format %#" PRIx32, __FUNCTION__, pixelFmt, bufFmt);
@@ -311,17 +313,12 @@
             int8_t* img = NULL;
             struct camera3_jpeg_blob footer = {
                 jpeg_blob_id: CAMERA3_JPEG_BLOB_ID,
-                jpeg_size: (uint32_t)width
+                jpeg_size: (uint32_t)bufferLength
             };
 
             size_t totalJpegSize = bufferLength + sizeof(footer);
             totalJpegSize = (totalJpegSize + 3) & ~0x3; // round up to nearest octonibble
 
-            if (height != 1) {
-                ALOGE("%s: Invalid height set for JPEG buffer output, %zu", __FUNCTION__, height);
-                return BAD_VALUE;
-            }
-
             if (totalJpegSize > totalSizeBytes) {
                 ALOGE("%s: Pixel buffer needs size %zu, cannot fit in gralloc buffer of size %zu",
                         __FUNCTION__, totalJpegSize, totalSizeBytes);
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
index 4859ee6..8753660 100644
--- a/core/jni/android_util_AssetManager.cpp
+++ b/core/jni/android_util_AssetManager.cpp
@@ -1324,7 +1324,21 @@
         config.density = 0;
 
         // Skip through XML attributes until the end or the next possible match.
-        while (ix < NX && curIdent > curXmlAttr) {
+        // We make two assumptions about the order of attributes:
+        // 1) Among attributes with the same package ID, the attributes are
+        //    sorted by increasing resource ID.
+        // 2) Groups of attributes with the same package ID are in the same
+        //    order.
+        // 3) The same sorting is applied to the input attributes as is
+        //    to the attributes in the XML.
+        //
+        // ex: 02010000, 02010001, 010100f4, 010100f5
+        //
+        // The total order of attributes (including package ID) can not be linear
+        // as shared libraries get assigned dynamic package IDs at runtime, which
+        // may break the sort order established at build time.
+        while (ix < NX && (Res_GETPACKAGE(curIdent) != Res_GETPACKAGE(curXmlAttr) ||
+                    curIdent > curXmlAttr)) {
             ix++;
             curXmlAttr = xmlParser->getAttributeNameResID(ix);
         }
@@ -1339,7 +1353,9 @@
         }
 
         // Skip through the style values until the end or the next possible match.
-        while (styleEnt < endStyleEnt && curIdent > styleEnt->map.name.ident) {
+        while (styleEnt < endStyleEnt &&
+                (Res_GETPACKAGE(curIdent) != Res_GETPACKAGE(styleEnt->map.name.ident) ||
+                 curIdent > styleEnt->map.name.ident)) {
             styleEnt++;
         }
         // Retrieve the current style attribute if it matches, and step to next.
@@ -1355,7 +1371,9 @@
         }
 
         // Skip through the default style values until the end or the next possible match.
-        while (defStyleEnt < endDefStyleEnt && curIdent > defStyleEnt->map.name.ident) {
+        while (defStyleEnt < endDefStyleEnt &&
+                (Res_GETPACKAGE(curIdent) != Res_GETPACKAGE(defStyleEnt->map.name.ident) ||
+                 curIdent > defStyleEnt->map.name.ident)) {
             defStyleEnt++;
         }
         // Retrieve the current default style attribute if it matches, and step to next.
@@ -1517,7 +1535,8 @@
         config.density = 0;
 
         // Skip through XML attributes until the end or the next possible match.
-        while (ix < NX && curIdent > curXmlAttr) {
+        while (ix < NX && (Res_GETPACKAGE(curIdent) != Res_GETPACKAGE(curXmlAttr) ||
+                    curIdent > curXmlAttr)) {
             ix++;
             curXmlAttr = xmlParser->getAttributeNameResID(ix);
         }
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index 2dbd382..e400698 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -264,8 +264,7 @@
         ALOGV("onTransact() on %p calling object %p in env %p vm %p\n", this, mObject, env, mVM);
 
         IPCThreadState* thread_state = IPCThreadState::self();
-        const int strict_policy_before = thread_state->getStrictModePolicy();
-        thread_state->setLastTransactionBinderFlags(flags);
+        const int32_t strict_policy_before = thread_state->getStrictModePolicy();
 
         //printf("Transact from %p to Java code sending: ", this);
         //data.print();
@@ -284,15 +283,11 @@
             env->DeleteLocalRef(excep);
         }
 
-        // Restore the Java binder thread's state if it changed while
-        // processing a call (as it would if the Parcel's header had a
-        // new policy mask and Parcel.enforceInterface() changed
-        // it...)
-        const int strict_policy_after = thread_state->getStrictModePolicy();
-        if (strict_policy_after != strict_policy_before) {
-            // Our thread-local...
-            thread_state->setStrictModePolicy(strict_policy_before);
-            // And the Java-level thread-local...
+        // Check if the strict mode state changed while processing the
+        // call.  The Binder state will be restored by the underlying
+        // Binder system in IPCThreadState, however we need to take care
+        // of the parallel Java state as well.
+        if (thread_state->getStrictModePolicy() != strict_policy_before) {
             set_dalvik_blockguard_policy(env, strict_policy_before);
         }
 
diff --git a/core/res/res/color/primary_text_activated_material_dark.xml b/core/res/res/color/primary_text_activated_material_dark.xml
new file mode 100644
index 0000000..f1b742a
--- /dev/null
+++ b/core/res/res/color/primary_text_activated_material_dark.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_activated="true"
+          android:color="@color/primary_text_default_material_light"/>
+    <item android:color="@color/primary_text_default_material_dark"/>
+</selector>
diff --git a/core/res/res/color/primary_text_activated_material_light.xml b/core/res/res/color/primary_text_activated_material_light.xml
new file mode 100644
index 0000000..d92da63
--- /dev/null
+++ b/core/res/res/color/primary_text_activated_material_light.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_activated="true"
+          android:color="@color/primary_text_default_material_dark"/>
+    <item android:color="@color/primary_text_default_material_light"/>
+</selector>
diff --git a/core/res/res/color/secondary_text_activated_material_dark.xml b/core/res/res/color/secondary_text_activated_material_dark.xml
new file mode 100644
index 0000000..7a8428a
--- /dev/null
+++ b/core/res/res/color/secondary_text_activated_material_dark.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_activated="true"
+          android:color="@color/secondary_text_default_material_light"/>
+    <item android:color="@color/secondary_text_default_material_dark"/>
+</selector>
diff --git a/core/res/res/color/secondary_text_activated_material_light.xml b/core/res/res/color/secondary_text_activated_material_light.xml
new file mode 100644
index 0000000..36ff408
--- /dev/null
+++ b/core/res/res/color/secondary_text_activated_material_light.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_activated="true"
+          android:color="@color/secondary_text_default_material_dark"/>
+    <item android:color="@color/secondary_text_default_material_light"/>
+</selector>
diff --git a/core/res/res/layout/alert_dialog_material.xml b/core/res/res/layout/alert_dialog_material.xml
index 545d95e..c961828 100644
--- a/core/res/res/layout/alert_dialog_material.xml
+++ b/core/res/res/layout/alert_dialog_material.xml
@@ -56,7 +56,7 @@
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:orientation="vertical"
-        android:minHeight="64dp">
+        android:minHeight="48dp">
         <ScrollView android:id="@+id/scrollView"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
@@ -84,7 +84,7 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_weight="1"
-        android:minHeight="64dp">
+        android:minHeight="48dp">
         <FrameLayout android:id="@+id/custom"
             android:layout_width="match_parent"
             android:layout_height="wrap_content" />
diff --git a/core/res/res/layout/preference_header_item_material.xml b/core/res/res/layout/preference_header_item_material.xml
index 594189f..ffb18ae 100644
--- a/core/res/res/layout/preference_header_item_material.xml
+++ b/core/res/res/layout/preference_header_item_material.xml
@@ -45,7 +45,8 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:singleLine="true"
-            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:textAppearance="?android:attr/textAppearanceListItem"
+            android:textColor="?android:attr/textColorPrimaryActivated"
             android:ellipsize="marquee"
             android:fadingEdge="horizontal" />
 
@@ -54,7 +55,8 @@
             android:layout_height="wrap_content"
             android:layout_below="@android:id/title"
             android:layout_alignStart="@android:id/title"
-            android:textAppearance="?android:attr/textAppearanceSmall"
+            android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+            android:textColor="?android:attr/textColorSecondaryActivated"
             android:ellipsize="end"
             android:maxLines="2" />
 
diff --git a/core/res/res/layout/preference_list_content_material.xml b/core/res/res/layout/preference_list_content_material.xml
index 7856799..1bc527e 100644
--- a/core/res/res/layout/preference_list_content_material.xml
+++ b/core/res/res/layout/preference_list_content_material.xml
@@ -48,7 +48,8 @@
                 android:drawSelectorOnTop="false"
                 android:cacheColorHint="@color/transparent"
                 android:listPreferredItemHeight="48dp"
-                android:scrollbarAlwaysDrawVerticalTrack="true" />
+                android:scrollbarAlwaysDrawVerticalTrack="true"
+                android:divider="@null" />
 
             <FrameLayout android:id="@+id/list_footer"
                     android:layout_width="match_parent"
diff --git a/core/res/res/values-mcc302-mnc610/config.xml b/core/res/res/values-mcc302-mnc610/config.xml
index 638aa92..81cec96 100644
--- a/core/res/res/values-mcc302-mnc610/config.xml
+++ b/core/res/res/values-mcc302-mnc610/config.xml
@@ -25,6 +25,6 @@
 
     <!-- Configure mobile network MTU. Carrier specific value is set here.
     -->
-    <integer name="config_mobile_mtu">1358</integer>
+    <integer name="config_mobile_mtu">1428</integer>
 
 </resources>
diff --git a/core/res/res/values-mcc310-mnc150/config.xml b/core/res/res/values-mcc310-mnc150/config.xml
index 3f9330d..3588f32 100644
--- a/core/res/res/values-mcc310-mnc150/config.xml
+++ b/core/res/res/values-mcc310-mnc150/config.xml
@@ -24,8 +24,10 @@
         <item>310140</item>
         <item>310400</item>
         <item>310470</item>
+        <item>311170</item>
     </string-array>
     <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>310</item>
         <item>311</item>
         <item>312</item>
         <item>313</item>
diff --git a/core/res/res/values-mcc310-mnc410/config.xml b/core/res/res/values-mcc310-mnc410/config.xml
index 1cc8d4f..d17509c 100644
--- a/core/res/res/values-mcc310-mnc410/config.xml
+++ b/core/res/res/values-mcc310-mnc410/config.xml
@@ -30,9 +30,11 @@
         <item>310140</item>
         <item>310400</item>
         <item>310470</item>
+        <item>311170</item>
     </string-array>
-    <!-- BEGIN Motorola, xnk746, Feb-12-2014, IKVPREL2KK-1468 -->
+
     <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>310</item>
         <item>311</item>
         <item>312</item>
         <item>313</item>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 8ea1814..251652e 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -110,6 +110,11 @@
         <!-- Dim inverse text color. This does not differentiate the disabled state. -->
         <attr name="textColorSecondaryInverseNoDisable" format="reference|color" />
 
+        <!-- Bright text color for use over activated backgrounds. -->
+        <attr name="textColorPrimaryActivated" format="reference|color" />
+        <!-- Dim text color for use over activated backgrounds. -->
+        <attr name="textColorSecondaryActivated" format="reference|color" />
+
         <!-- Text color for urls in search suggestions, used by things like global search and the browser. @hide -->
         <attr name="textColorSearchUrl" format="reference|color" />
 
@@ -5365,11 +5370,11 @@
         <attr name="drawable" />
     </declare-styleable>
 
-    <!-- Defines the target path or group used in the AnimatedVectorDrawable. -->
+    <!-- Defines the target used in the AnimatedVectorDrawable. -->
     <declare-styleable name="AnimatedVectorDrawableTarget">
-        <!-- The name of this target path or group -->
+        <!-- The name of the target path, group or vector drawable -->
         <attr name="name" />
-        <!-- The animation for this target path or group -->
+        <!-- The animation for the target path, group or vector drawable -->
         <attr name="animation" />
     </declare-styleable>
 
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index bd9e2f6..4be9370 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1636,6 +1636,7 @@
     <bool name="config_stkNoAlphaUsrCnf">true</bool>
 
     <!-- Don't use roaming icon for considered operators.
+         A match on config_sameNamedOperatorConsideredRoaming supersedes a match on this.
          Can use mcc or mcc+mnc as item. For example, 302 or 21407.
          If operators, 21404 and 21407, make roaming agreements, user of 21404 should not see
          the roaming icon as using 21407 network.
@@ -1650,10 +1651,12 @@
     <!-- For some operators, PDU has garbages. To fix it, need to use valid index -->
     <integer name="config_valid_wappush_index">-1</integer>
 
-    <!-- Show roaming icon though same named operators.
+    <!-- This is NOT just for same named operators unlike the name suggests (will blacklist regardless of name).
+         A match on this supersedes a match on config_operatorConsideredNonRoaming.
          Uses "startsWith" so you can use a leading substring like the mcc or
          use the complete mcc+mnc string.
-         Though same mcc and same operator name, some operator want to roam.
+         For a given mcc/mcc-mnc, some operators may want to roam (even if
+         config_operatorConsideredNonRoaming has the mcc/mcc-mnc).
          user of 40485 should see the roaming icon as using 40483 network
          though same Reliance network.
          To do this, add 40483 item to values-mcc404-mnc85/config.xml -->
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 7a2bbc1..824ed9e 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -380,7 +380,7 @@
     <dimen name="datepicker_month_day_label_text_size">12sp</dimen>
     <dimen name="datepicker_month_list_item_header_height">48dp</dimen>
     <dimen name="datepicker_day_number_select_circle_radius">16dp</dimen>
-    <dimen name="datepicker_view_animator_height">250dp</dimen>
+    <dimen name="datepicker_view_animator_height">244dp</dimen>
 
     <dimen name="datepicker_year_picker_padding_top">8dp</dimen>
     <dimen name="datepicker_year_label_height">64dp</dimen>
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 7a9e1d5..d983440 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -74,6 +74,8 @@
         <item name="textColorPrimaryInverse">@color/primary_text_light</item>
         <item name="textColorSecondaryInverse">@color/secondary_text_light</item>
         <item name="textColorTertiaryInverse">@color/tertiary_text_light</item>
+        <item name="textColorPrimaryActivated">@color/primary_text_dark</item>
+        <item name="textColorSecondaryActivated">@color/secondary_text_dark</item>
         <item name="textColorPrimaryDisableOnly">@color/primary_text_dark_disable_only</item>
         <item name="textColorPrimaryInverseDisableOnly">@color/primary_text_light_disable_only</item>
         <item name="textColorPrimaryNoDisable">@color/primary_text_dark_nodisable</item>
@@ -478,6 +480,8 @@
         <item name="textColorPrimaryInverse">@color/primary_text_dark</item>
         <item name="textColorSecondaryInverse">@color/secondary_text_dark</item>
         <item name="textColorTertiaryInverse">@color/tertiary_text_dark</item>
+        <item name="textColorPrimaryActivated">@color/primary_text_light</item>
+        <item name="textColorSecondaryActivated">@color/secondary_text_light</item>
         <item name="textColorPrimaryDisableOnly">@color/primary_text_light_disable_only</item>
         <item name="textColorPrimaryInverseDisableOnly">@color/primary_text_dark_disable_only</item>
         <item name="textColorPrimaryNoDisable">@color/primary_text_light_nodisable</item>
diff --git a/core/res/res/values/themes_holo.xml b/core/res/res/values/themes_holo.xml
index 9c1d0f3..c30b3d5 100644
--- a/core/res/res/values/themes_holo.xml
+++ b/core/res/res/values/themes_holo.xml
@@ -93,6 +93,8 @@
         <item name="textColorPrimaryInverse">@color/primary_text_holo_light</item>
         <item name="textColorSecondaryInverse">@color/secondary_text_holo_light</item>
         <item name="textColorTertiaryInverse">@color/tertiary_text_holo_light</item>
+        <item name="textColorPrimaryActivated">@color/primary_text_holo_dark</item>
+        <item name="textColorSecondaryActivated">@color/secondary_text_holo_dark</item>
         <item name="textColorPrimaryDisableOnly">@color/primary_text_disable_only_holo_dark</item>
         <item name="textColorPrimaryInverseDisableOnly">@color/primary_text_disable_only_holo_light</item>
         <item name="textColorPrimaryNoDisable">@color/primary_text_nodisable_holo_dark</item>
@@ -429,6 +431,8 @@
         <item name="textColorPrimaryInverse">@color/primary_text_holo_dark</item>
         <item name="textColorSecondaryInverse">@color/secondary_text_holo_dark</item>
         <item name="textColorTertiaryInverse">@color/tertiary_text_holo_dark</item>
+        <item name="textColorPrimaryActivated">@color/primary_text_holo_light</item>
+        <item name="textColorSecondaryActivated">@color/secondary_text_holo_light</item>
         <item name="textColorPrimaryDisableOnly">@color/primary_text_disable_only_holo_light</item>
         <item name="textColorPrimaryInverseDisableOnly">@color/primary_text_disable_only_holo_dark</item>
         <item name="textColorPrimaryNoDisable">@color/primary_text_nodisable_holo_light</item>
diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml
index 6420153..b51974e 100644
--- a/core/res/res/values/themes_material.xml
+++ b/core/res/res/values/themes_material.xml
@@ -55,9 +55,11 @@
 
         <item name="textColorPrimary">@color/primary_text_material_dark</item>
         <item name="textColorPrimaryInverse">@color/primary_text_material_light</item>
+        <item name="textColorPrimaryActivated">@color/primary_text_activated_material_dark</item>
         <item name="textColorPrimaryDisableOnly">@color/primary_text_disable_only_material_dark</item>
         <item name="textColorSecondary">@color/secondary_text_material_dark</item>
         <item name="textColorSecondaryInverse">@color/secondary_text_material_light</item>
+        <item name="textColorSecondaryActivated">@color/secondary_text_activated_material_dark</item>
         <item name="textColorTertiary">@color/secondary_text_material_dark</item>
         <item name="textColorTertiaryInverse">@color/secondary_text_material_light</item>
         <item name="textColorHint">@color/hint_foreground_material_dark</item>
@@ -402,8 +404,10 @@
 
         <item name="textColorPrimary">@color/primary_text_material_light</item>
         <item name="textColorPrimaryInverse">@color/primary_text_material_dark</item>
+        <item name="textColorPrimaryActivated">@color/primary_text_activated_material_light</item>
         <item name="textColorSecondary">@color/secondary_text_material_light</item>
         <item name="textColorSecondaryInverse">@color/secondary_text_material_dark</item>
+        <item name="textColorSecondaryActivated">@color/secondary_text_activated_material_light</item>
         <item name="textColorTertiary">@color/secondary_text_material_light</item>
         <item name="textColorTertiaryInverse">@color/secondary_text_material_dark</item>
         <item name="textColorPrimaryDisableOnly">@color/primary_text_disable_only_material_light</item>
@@ -757,8 +761,10 @@
 
         <item name="textColorPrimary">@color/primary_text_material_light</item>
         <item name="textColorPrimaryInverse">@color/primary_text_material_dark</item>
+        <item name="textColorPrimaryActivated">@color/primary_text_activated_material_light</item>
         <item name="textColorSecondary">@color/secondary_text_material_light</item>
         <item name="textColorSecondaryInverse">@color/secondary_text_material_dark</item>
+        <item name="textColorSecondaryActivated">@color/secondary_text_activated_material_light</item>
         <item name="textColorTertiary">@color/secondary_text_material_light</item>
         <item name="textColorTertiaryInverse">@color/secondary_text_material_dark</item>
         <item name="textColorPrimaryDisableOnly">@color/primary_text_disable_only_material_light</item>
@@ -794,9 +800,11 @@
 
         <item name="textColorPrimary">@color/primary_text_material_dark</item>
         <item name="textColorPrimaryInverse">@color/primary_text_material_light</item>
+        <item name="textColorPrimaryActivated">@color/primary_text_activated_material_dark</item>
         <item name="textColorPrimaryDisableOnly">@color/primary_text_disable_only_material_dark</item>
         <item name="textColorSecondary">@color/secondary_text_material_dark</item>
         <item name="textColorSecondaryInverse">@color/secondary_text_material_light</item>
+        <item name="textColorSecondaryActivated">@color/secondary_text_activated_material_dark</item>
         <item name="textColorTertiary">@color/secondary_text_material_dark</item>
         <item name="textColorTertiaryInverse">@color/secondary_text_material_light</item>
         <item name="textColorHint">@color/hint_foreground_material_dark</item>
diff --git a/docs/html/google/play/billing/billing_overview.jd b/docs/html/google/play/billing/billing_overview.jd
index 12f8c9a..1c20d78 100644
--- a/docs/html/google/play/billing/billing_overview.jd
+++ b/docs/html/google/play/billing/billing_overview.jd
@@ -7,11 +7,11 @@
 <div id="qv">
   <h2>Quickview</h2>
   <ul>
-    <li>Use In-app Billing to sell digital goods, including one-time items and 
+    <li>Use In-app Billing to sell digital goods, including one-time items and
 recurring subscriptions.</li>
-    <li>Supported for any app published on Google Play. You only need a Google 
+    <li>Supported for any app published on Google Play. You only need a Google
 Play Developer Console account and a Google Wallet merchant account.</li>
-    <li>Checkout processing is automatically handled by Google Play, with the 
+    <li>Checkout processing is automatically handled by Google Play, with the
 same look-and-feel as for app purchases.</li>
   </ul>
   <h2>In this document</h2>
@@ -24,18 +24,18 @@
     </li>
     <li><a href="#console">Google Play Developer Console</a></li>
     <li><a href="#checkout">Google Play Purchase Flow</a></li>
-    <li><a href="#samples">Sample App</a></li> 
+    <li><a href="#samples">Sample App</a></li>
     <li><a href="#migration">Migration Considerations</a></li>
   </ol>
    <h2>Related Samples</h2>
   <ol>
     <li><a href="{@docRoot}training/in-app-billing/preparing-iab-app.html#GetSample">Sample Application (V3)</a></li>
-  </ol> 
+  </ol>
 </div>
 </div>
 
-<p>This documentation describes the fundamental In-app Billing components and 
-features that you need to understand in order to add In-app 
+<p>This documentation describes the fundamental In-app Billing components and
+features that you need to understand in order to add In-app
 Billing features into your application.</p>
 
 <p class="note"><b>Note</b>: Ensure that you comply with applicable laws in the countries where you
@@ -49,130 +49,132 @@
 </p>
 
 <h2 id="api">In-app Billing API</h2>
-<p>Your application accesses the In-app Billing service using an API that is 
-exposed by the Google Play app that is installed on the device. The Google Play 
-app then conveys billing requests and responses between your 
-application and the Google Play server. In practice, your application never 
-directly communicates with the Google Play server. Instead, your application 
-sends billing requests to the Google Play application over interprocess 
-communication (IPC) and receives responses from the Google Play app. 
-Your application does not manage any network connections between itself and 
+<p>Your application accesses the In-app Billing service using an API that is
+exposed by the Google Play app that is installed on the device. The Google Play
+app then conveys billing requests and responses between your
+application and the Google Play server. In practice, your application never
+directly communicates with the Google Play server. Instead, your application
+sends billing requests to the Google Play application over interprocess
+communication (IPC) and receives responses from the Google Play app.
+Your application does not manage any network connections between itself and
 the Google Play server.</p>
-<p>In-app Billing can be implemented only in applications that you publish 
-through Google Play. To complete in-app purchase requests, the Google Play app 
+<p>In-app Billing can be implemented only in applications that you publish
+through Google Play. To complete in-app purchase requests, the Google Play app
 must be able to access the Google Play server over the network.</p>
 
-<p>In-app billing Version 3 is the latest version, and maintains very broad 
-compatibility across the range of Android devices. In-app Billing Version 3 is 
-supported on devices running Android 2.2 or higher that have the latest version 
+<p>In-app billing Version 3 is the latest version, and maintains very broad
+compatibility across the range of Android devices. In-app Billing Version 3 is
+supported on devices running Android 2.2 or higher that have the latest version
 of the Google Play store installed (<a href="{@docRoot}about/dashboards/index.html">a vast majority</a> of active devices).</p>
 
 <h4>Version 3 features</h4>
 <ul>
-<li>Requests are sent through a streamlined API that allows you to easily request 
-product details from Google Play, order in-app products, and quickly restore 
+<li>Requests are sent through a streamlined API that allows you to easily request
+product details from Google Play, order in-app products, and quickly restore
 items based on users' product ownership</li>
-<li>Order information is synchronously propagated to the device on purchase 
+<li>Order information is synchronously propagated to the device on purchase
 completion</li>
-<li>All purchases are “managed” (that is, Google Play keeps track of the user's 
-ownership of in-app products). The user cannot own multiple copies of an in-app 
+<li>All purchases are “managed” (that is, Google Play keeps track of the user's
+ownership of in-app products). The user cannot own multiple copies of an in-app
 item; only one copy can be owned at any point in time</li>
-<li>Purchased items can be consumed. When consumed, the item reverts to the 
+<li>Purchased items can be consumed. When consumed, the item reverts to the
 "unowned" state and can be purchased again from Google Play</li>
 <li>Provides support for <a
   href="{@docRoot}google/play/billing/billing_subscriptions.html">subscriptions</a></li>
 </ul>
-<p>For details about other versions of In-app Billing, see the 
+<p>For details about other versions of In-app Billing, see the
 <a href="{@docRoot}google/play/billing/versions.html">Version Notes</a>.</p>
 
 <h2 id="products">In-app Products</h2>
-<p>In-app products are the digital goods that you offer for sale from inside your 
-application to users. Examples of digital goods includes in-game currency, 
-application feature upgrades that enhance the user experience, and new content 
+<p>In-app products are the digital goods that you offer for sale from inside your
+application to users. Examples of digital goods includes in-game currency,
+application feature upgrades that enhance the user experience, and new content
 for your application.</p>
-<p>You can use In-app Billing to sell only digital content. 
-You cannot use In-app Billing to sell physical goods, personal services, or 
-anything that requires physical delivery. Unlike with priced applications, once 
+<p>You can use In-app Billing to sell only digital content.
+You cannot use In-app Billing to sell physical goods, personal services, or
+anything that requires physical delivery. Unlike with priced applications, once
 the user has purchased an in-app product there is no refund window.</p>
-<p>Google Play does not provide any form of content delivery. You are 
-responsible for delivering the digital content that you sell in your 
-applications. In-app products are always explicitly associated with one and 
-only one app. That is, one application cannot purchase an in-app product 
+<p>Google Play does not provide any form of content delivery. You are
+responsible for delivering the digital content that you sell in your
+applications. In-app products are always explicitly associated with one and
+only one app. That is, one application cannot purchase an in-app product
 published for another app, even if they are from the same developer.</p>
 
 <h3 id="prodtypes">Product types</h3>
-<p>In-app Billing supports different product types to give you flexibility in 
-how you monetize your application. In all cases, you define your products using 
+<p>In-app Billing supports different product types to give you flexibility in
+how you monetize your application. In all cases, you define your products using
 the Google Play Developer Console.</p>
-<p>You can specify these types of products for your In-app Billing application  
-— <em>managed in-app products</em> and <em>subscriptions</em>. Google Play 
-handles and tracks ownership for in-app products and subscriptions on your 
+<p>You can specify these types of products for your In-app Billing application
+— <em>managed in-app products</em> and <em>subscriptions</em>. Google Play
+handles and tracks ownership for in-app products and subscriptions on your
 application on a per user account basis. <a href="{@docRoot}google/play/billing/api.html#producttypes">Learn more about the product types supported by In-app Billing Version 3</a>.</p>
 
 <h2 id="console">Google Play Developer Console</h2>
-<p>The Developer Console is where you can publish your 
-In-app Billing application, and manage the various in-app products that are 
+<p>The Developer Console is where you can publish your
+In-app Billing application, and manage the various in-app products that are
 available for purchase from your application.</p>
-<p>You can create a product list of 
-digital goods that are associated with your application, including items for 
-one-time purchase and recurring subscriptions. For each item, you can define 
-information such as the item’s unique product ID (also called its SKU), product 
-type, pricing, description, and how Google Play should handle and track 
+<p>You can create a product list of
+digital goods that are associated with your application, including items for
+one-time purchase and recurring subscriptions. For each item, you can define
+information such as the item’s unique product ID (also called its SKU), product
+type, pricing, description, and how Google Play should handle and track
 purchases for that product.</p>
-<p>You can also create test accounts to authorize 
+<p>You can also create test accounts to authorize
 access for testing applications that are unpublished.</p>
-<p>To learn how to use the Developer Console to configure your in-app 
-products and product list, see 
-<a href="{@docRoot}google/play/billing/billing_admin.html">Administering 
+<p>To learn how to use the Developer Console to configure your in-app
+products and product list, see
+<a href="{@docRoot}google/play/billing/billing_admin.html">Administering
 In-app Billing</a>.</p>
 
 <h2 id="checkout">Google Play Purchase Flow</h2>
-<p>Google Play uses the same checkout backend service as is used for application 
+<p>Google Play uses the same checkout backend service as is used for application
 purchases, so your users experience a consistent and familiar purchase flow.</p>
 <p class="note"><strong>Important:</strong> You must have a Google Wallet
 merchant account to use the In-app Billing service on Google Play.</p>
-<p>To initiate a purchase, your application sends a billing request for a 
-specific in-app product. Google Play then handles all of the checkout details for 
-the transaction, including requesting and validating the form of payment and 
-processing the financial transaction.</p> 
-<p>When the checkout process is complete, 
-Google Play sends your application the purchase details, such as the order 
-number, the order date and time, and the price paid. At no point does your 
-application have to handle any financial transactions; that role is provided by 
+<p>To initiate a purchase, your application sends a billing request for a
+specific in-app product. Google Play then handles all of the checkout details for
+the transaction, including requesting and validating the form of payment and
+processing the financial transaction.</p>
+<p>When the checkout process is complete,
+Google Play sends your application the purchase details, such as the order
+number, the order date and time, and the price paid. At no point does your
+application have to handle any financial transactions; that role is provided by
 Google Play.</p>
 
 <h2 id="samples">Sample Application</h2>
-<p>To help you integrate In-app Billing into your application, the Android SDK 
-provides a sample application that demonstrates how to sell in-app products and subscriptions 
+<p>To help you integrate In-app Billing into your application, the Android SDK
+provides a sample application that demonstrates how to sell in-app products and subscriptions
 from inside an app.</p>
 
-<p>The <a href="{@docRoot}training/in-app-billing/preparing-iab-app.html#GetSample">TrivialDrive sample for the Version 3 API</a> sample shows how to use the In-app Billing Version 3 API 
-to implement in-app product and subscription purchases for a driving game. The 
-application demonstrates how to send In-app Billing requests, and handle 
-synchronous responses from Google Play. The application also shows how to record 
-item consumption with the API. The Version 3 sample includes convenience classes 
-for processing In-app Billing operations as well as perform automatic signature 
+<p>The <a href="{@docRoot}training/in-app-billing/preparing-iab-app.html#GetSample">TrivialDrive sample for the Version 3 API</a> sample shows how to use the In-app Billing Version 3 API
+to implement in-app product and subscription purchases for a driving game. The
+application demonstrates how to send In-app Billing requests, and handle
+synchronous responses from Google Play. The application also shows how to record
+item consumption with the API. The Version 3 sample includes convenience classes
+for processing In-app Billing operations as well as perform automatic signature
 verification.</p>
 
-<p class="caution"><strong>Recommendation</strong>: Make sure to obfuscate the 
+<p class="caution"><strong>Recommendation</strong>: Make sure to obfuscate the
 code in your application before you publish it. For more information, see
-<a href="{@docRoot}google/play/billing/billing_best_practices.html">Security 
+<a href="{@docRoot}google/play/billing/billing_best_practices.html">Security
 and Design</a>.</p>
 
 <h2 id="migration">Migration Considerations</h2>
-<p>If you have an existing In-app Billing implementation that uses Version 2 or
-earlier, it is strongly recommended that you migrate to <a href="{@docRoot}google/play/billing/api.html">In-app Billing Version 3</a> at your earliest convenience.</p>
+<p>The In-app Billing Version 2 API is deprecated and will be discontinued in January 2015.
+If you have an existing In-app Billing implementation that uses API Version 2 or
+earlier, you must migrate to <a href="{@docRoot}google/play/billing/api.html">In-app Billing Version
+3</a>.</p>
 
 <p>If you have published apps selling in-app products, note that:</p>
 <ul>
-<li>Managed items and subscriptions that you have previously defined in the Developer Console will 
+<li>Managed items and subscriptions that you have previously defined in the Developer Console will
 work with Version 3 as before.</li>
-<li>Unmanaged items that you have defined for existing applications will be 
-treated as managed products if you make a purchase request for these items using 
-the Version 3 API. You do not need to create a new product entry in Developer 
-Console for these items, and you can use the same product IDs to purchase these 
-items. They will still continue to be treated as unmanaged items if you make a 
-purchase request for them using the Version 2 or earlier API. 
+<li>Unmanaged items that you have defined for existing applications will be
+treated as managed products if you make a purchase request for these items using
+the Version 3 API. You do not need to create a new product entry in Developer
+Console for these items, and you can use the same product IDs to purchase these
+items. They will still continue to be treated as unmanaged items if you make a
+purchase request for them using the Version 2 or earlier API.
 </ul>
 
 
diff --git a/docs/html/sdk/installing/studio-build.jd b/docs/html/sdk/installing/studio-build.jd
index 29ba12d..bff3bc0 100644
--- a/docs/html/sdk/installing/studio-build.jd
+++ b/docs/html/sdk/installing/studio-build.jd
@@ -454,8 +454,8 @@
 for debugging purposes.</p>
 
 <p>After you build the project, the output APK for the app module is located in
-<code>app/build/apk/</code>, and the output AAR for the lib module is located in
-<code>lib/build/libs/</code>.</p>
+<code>app/build/outputs/apk/</code>, and the output AAR for the lib module is located in
+<code>lib/build/outputs/libs/</code>.</p>
 
 <p>To see a list of all available build tasks for your project, type this command:</p>
 
diff --git a/graphics/java/android/graphics/drawable/DrawableContainer.java b/graphics/java/android/graphics/drawable/DrawableContainer.java
index 0b052f4..4a719fe 100644
--- a/graphics/java/android/graphics/drawable/DrawableContainer.java
+++ b/graphics/java/android/graphics/drawable/DrawableContainer.java
@@ -177,11 +177,10 @@
 
     @Override
     public void setTintList(ColorStateList tint) {
-        mDrawableContainerState.mHasTint = tint != null
-                && mDrawableContainerState.mTintMode != null;
+        mDrawableContainerState.mHasTintList = true;
 
-        if (mDrawableContainerState.mTint != tint) {
-            mDrawableContainerState.mTint = tint;
+        if (mDrawableContainerState.mTintList != tint) {
+            mDrawableContainerState.mTintList = tint;
 
             if (mCurrDrawable != null) {
                 mCurrDrawable.mutate().setTintList(tint);
@@ -191,8 +190,7 @@
 
     @Override
     public void setTintMode(Mode tintMode) {
-        mDrawableContainerState.mHasTint = mDrawableContainerState.mTint != null
-                && tintMode != null;
+        mDrawableContainerState.mHasTintMode = true;
 
         if (mDrawableContainerState.mTintMode != tintMode) {
             mDrawableContainerState.mTintMode = tintMode;
@@ -449,10 +447,15 @@
                     d.setAlpha(mAlpha);
                 }
                 if (mDrawableContainerState.mHasColorFilter) {
+                    // Color filter always overrides tint.
                     d.setColorFilter(mDrawableContainerState.mColorFilter);
-                } else if (mDrawableContainerState.mHasTint) {
-                    d.setTintList(mDrawableContainerState.mTint);
-                    d.setTintMode(mDrawableContainerState.mTintMode);
+                } else {
+                    if (mDrawableContainerState.mHasTintList) {
+                        d.setTintList(mDrawableContainerState.mTintList);
+                    }
+                    if (mDrawableContainerState.mHasTintMode) {
+                        d.setTintMode(mDrawableContainerState.mTintMode);
+                    }
                 }
                 d.setVisible(isVisible(), true);
                 d.setDither(mDrawableContainerState.mDither);
@@ -623,9 +626,10 @@
         ColorFilter mColorFilter;
         boolean mHasColorFilter;
 
-        ColorStateList mTint;
+        ColorStateList mTintList;
         Mode mTintMode;
-        boolean mHasTint;
+        boolean mHasTintList;
+        boolean mHasTintMode;
 
         DrawableContainerState(DrawableContainerState orig, DrawableContainer owner,
                 Resources res) {
@@ -649,9 +653,10 @@
                 mAutoMirrored = orig.mAutoMirrored;
                 mColorFilter = orig.mColorFilter;
                 mHasColorFilter = orig.mHasColorFilter;
-                mTint = orig.mTint;
+                mTintList = orig.mTintList;
                 mTintMode = orig.mTintMode;
-                mHasTint = orig.mHasTint;
+                mHasTintList = orig.mHasTintList;
+                mHasTintMode = orig.mHasTintMode;
 
                 // Cloning the following values may require creating futures.
                 mConstantPadding = orig.getConstantPadding();
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index 8014837..4c83e55 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -57,6 +57,8 @@
  * <dl>
  * <dd>Used to defined a vector drawable
  * <dl>
+ * <dt><code>android:name</code></dt>
+ * <dd>Defines the name of this vector drawable.</dd>
  * <dt><code>android:width</code></dt>
  * <dd>Used to defined the intrinsic width of the drawable.
  * This support all the dimension units, normally specified with dp.</dd>
@@ -76,6 +78,8 @@
  * <dt><code>android:autoMirrored</code></dt>
  * <dd>Indicates if the drawable needs to be mirrored when its layout direction is
  * RTL (right-to-left).</dd>
+ * <dt><code>android:alpha</code></dt>
+ * <dd>The opacity of this drawable.</dd>
  * </dl></dd>
  * </dl>
  *
@@ -85,6 +89,8 @@
  * The transformations are defined in the same coordinates as the viewport.
  * And the transformations are applied in the order of scale, rotate then translate.
  * <dl>
+ * <dt><code>android:name</code></dt>
+ * <dd>Defines the name of the group.</dd>
  * <dt><code>android:rotation</code></dt>
  * <dd>The degrees of rotation of the group.</dd>
  * <dt><code>android:pivotX</code></dt>
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index 8cef137..61a767c 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -1185,7 +1185,11 @@
 {
     int32_t id = getAttributeNameID(idx);
     if (id >= 0 && (size_t)id < mTree.mNumResIds) {
-        return dtohl(mTree.mResIds[id]);
+        uint32_t resId = dtohl(mTree.mResIds[id]);
+        if (mTree.mDynamicRefTable == NULL ||
+                mTree.mDynamicRefTable->lookupResourceId(&resId) == NO_ERROR) {
+            return resId;
+        }
     }
     return 0;
 }
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp
index f4eb459..aaff9a2 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/media/jni/android_media_ImageReader.cpp
@@ -294,7 +294,7 @@
     uint8_t* jpegBuffer = buffer->data;
 
     if (usingRGBAOverride) {
-        width *= 4;
+        width = (buffer->width + buffer->stride * (buffer->height - 1)) * 4;
     }
 
     // First check for JPEG transport header at the end of the buffer
diff --git a/packages/CaptivePortalLogin/AndroidManifest.xml b/packages/CaptivePortalLogin/AndroidManifest.xml
index c5fb167..2ec15be 100644
--- a/packages/CaptivePortalLogin/AndroidManifest.xml
+++ b/packages/CaptivePortalLogin/AndroidManifest.xml
@@ -20,6 +20,7 @@
     package="com.android.captiveportallogin" >
 
     <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 
     <application android:label="@string/app_name" >
         <activity
diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
index ae52a1e..b3a6e88 100644
--- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
+++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
@@ -20,7 +20,10 @@
 import android.content.Intent;
 import android.graphics.Bitmap;
 import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
 import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
 import android.os.Bundle;
 import android.provider.Settings;
 import android.provider.Settings.Global;
@@ -55,6 +58,7 @@
 
     private URL mURL;
     private int mNetId;
+    private NetworkCallback mNetworkCallback;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -73,7 +77,27 @@
         getActionBar().setDisplayShowHomeEnabled(false);
 
         mNetId = Integer.parseInt(getIntent().getStringExtra(Intent.EXTRA_TEXT));
-        ConnectivityManager.setProcessDefaultNetwork(new Network(mNetId));
+        final Network network = new Network(mNetId);
+        ConnectivityManager.setProcessDefaultNetwork(network);
+
+        // Exit app if Network disappears.
+        final NetworkCapabilities networkCapabilities =
+                ConnectivityManager.from(this).getNetworkCapabilities(network);
+        if (networkCapabilities == null) {
+            finish();
+            return;
+        }
+        mNetworkCallback = new NetworkCallback() {
+            @Override
+            public void onLost(Network lostNetwork) {
+                if (network.equals(lostNetwork)) done(false);
+            }
+        };
+        final NetworkRequest.Builder builder = new NetworkRequest.Builder();
+        for (int transportType : networkCapabilities.getTransportTypes()) {
+            builder.addTransportType(transportType);
+        }
+        ConnectivityManager.from(this).registerNetworkCallback(builder.build(), mNetworkCallback);
 
         WebView myWebView = (WebView) findViewById(R.id.webview);
         WebSettings webSettings = myWebView.getSettings();
@@ -84,6 +108,7 @@
     }
 
     private void done(boolean use_network) {
+        ConnectivityManager.from(this).unregisterNetworkCallback(mNetworkCallback);
         Intent intent = new Intent(ACTION_CAPTIVE_PORTAL_LOGGED_IN);
         intent.putExtra(Intent.EXTRA_TEXT, String.valueOf(mNetId));
         intent.putExtra(LOGGED_IN_RESULT, use_network ? "1" : "0");
diff --git a/packages/Keyguard/src/com/android/keyguard/CarrierText.java b/packages/Keyguard/src/com/android/keyguard/CarrierText.java
index 05f2962..ad07a7a 100644
--- a/packages/Keyguard/src/com/android/keyguard/CarrierText.java
+++ b/packages/Keyguard/src/com/android/keyguard/CarrierText.java
@@ -233,7 +233,11 @@
         final boolean plmnValid = !TextUtils.isEmpty(plmn);
         final boolean spnValid = !TextUtils.isEmpty(spn);
         if (plmnValid && spnValid) {
-            return new StringBuilder().append(plmn).append(mSeparator).append(spn).toString();
+            if (plmn.equals(spn)) {
+                return plmn;
+            } else {
+                return new StringBuilder().append(plmn).append(mSeparator).append(spn).toString();
+            }
         } else if (plmnValid) {
             return plmn;
         } else if (spnValid) {
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
index 34bbc2e..954046c 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
@@ -95,10 +95,11 @@
         log("dozing " + dozing);
     }
 
-    public static void traceFling(boolean expand, boolean aboveThreshold, boolean thresholdNeeded) {
+    public static void traceFling(boolean expand, boolean aboveThreshold, boolean thresholdNeeded,
+            boolean screenOnFromTouch) {
         if (!ENABLED) return;
         log("fling expand=" + expand + " aboveThreshold=" + aboveThreshold + " thresholdNeeded="
-                + thresholdNeeded);
+                + thresholdNeeded + " screenOnFromTouch=" + screenOnFromTouch);
     }
 
     public static void traceEmergencyCall() {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
index 5caf1ac..8416ad7 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
@@ -112,15 +112,11 @@
         mTaskStackBounds = new Rect();
     }
 
-    public void onStart() {}
-
-    public void onBootCompleted() {
+    public void onStart() {
         // Initialize some static datastructures
         TaskStackViewLayoutAlgorithm.initializeCurve();
         // Load the header bar layout
         reloadHeaderBarLayout();
-        mBootCompleted = true;
-
         // Try and pre-emptively bind the search widget on startup to ensure that we
         // have the right thumbnail bounds to animate to.
         if (Constants.DebugFlags.App.EnableSearchLayout) {
@@ -138,6 +134,10 @@
         }
     }
 
+    public void onBootCompleted() {
+        mBootCompleted = true;
+    }
+
     /** Shows the recents */
     public void onShowRecents(boolean triggeredFromAltTab, View statusBarView) {
         mStatusBarView = statusBarView;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index b9efb22..26420e1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -1551,7 +1551,8 @@
     @Override
     protected void onEdgeClicked(boolean right) {
         if ((right && getRightIcon().getVisibility() != View.VISIBLE)
-                || (!right && getLeftIcon().getVisibility() != View.VISIBLE)) {
+                || (!right && getLeftIcon().getVisibility() != View.VISIBLE)
+                || isDozing()) {
             return;
         }
         mHintAnimationRunning = true;
@@ -1747,6 +1748,7 @@
         updateKeyguardStatusBarVisibility();
     }
 
+    @Override
     public boolean isDozing() {
         return mDozing;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index cacc2df7..c612e4c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -337,7 +337,8 @@
                     boolean expand = flingExpands(vel, vectorVel);
                     onTrackingStopped(expand);
                     DozeLog.traceFling(expand, mTouchAboveFalsingThreshold,
-                            mStatusBar.isFalsingThresholdNeeded());
+                            mStatusBar.isFalsingThresholdNeeded(),
+                            mStatusBar.isScreenOnComingFromTouch());
                     fling(vel, expand);
                     mUpdateFlingOnLayout = expand && mPanelClosedOnDown && !mHasLayoutedSinceDown;
                     if (mUpdateFlingOnLayout) {
@@ -914,7 +915,9 @@
     private boolean onMiddleClicked() {
         switch (mStatusBar.getBarState()) {
             case StatusBarState.KEYGUARD:
-                startUnlockHintAnimation();
+                if (!isDozing()) {
+                    startUnlockHintAnimation();
+                }
                 return true;
             case StatusBarState.SHADE_LOCKED:
                 mStatusBar.goToKeyguard();
@@ -932,6 +935,8 @@
 
     protected abstract void onEdgeClicked(boolean right);
 
+    protected abstract boolean isDozing();
+
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         pw.println(String.format("[PanelView(%s): expandedHeight=%f maxPanelHeight=%d closing=%s"
                 + " tracking=%s justPeeked=%s peekAnim=%s%s timeAnim=%s%s touchDisabled=%s"
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index 79d769a..3625997 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -646,19 +646,10 @@
                     mLastSignalLevel = iconLevel = mSignalStrength.getLevel();
                 }
 
-                if (isCdma()) {
-                    if (isCdmaEri()) {
-                        iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[mInetCondition];
-                    } else {
-                        iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[mInetCondition];
-                    }
+                if (isRoaming()) {
+                    iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[mInetCondition];
                 } else {
-                    // Though mPhone is a Manager, this call is not an IPC
-                    if (mPhone.isNetworkRoaming()) {
-                        iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[mInetCondition];
-                    } else {
-                        iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[mInetCondition];
-                    }
+                    iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[mInetCondition];
                 }
                 mPhoneSignalIconId = iconList[iconLevel];
                 mQSPhoneSignalIconId =
@@ -811,14 +802,9 @@
             }
         }
 
-        if (isCdma()) {
-            if (isCdmaEri()) {
-                mDataTypeIconId = TelephonyIcons.ROAMING_ICON;
-                mQSDataTypeIconId = TelephonyIcons.QS_DATA_R[mInetCondition];
-            }
-        } else if (mPhone.isNetworkRoaming()) {
-                mDataTypeIconId = TelephonyIcons.ROAMING_ICON;
-                mQSDataTypeIconId = TelephonyIcons.QS_DATA_R[mInetCondition];
+        if (isRoaming()) {
+            mDataTypeIconId = TelephonyIcons.ROAMING_ICON;
+            mQSDataTypeIconId = TelephonyIcons.QS_DATA_R[mInetCondition];
         }
     }
 
@@ -836,6 +822,14 @@
         return false;
     }
 
+    private boolean isRoaming() {
+        if (isCdma()) {
+            return isCdmaEri();
+        } else {
+            return mServiceState != null && mServiceState.getRoaming();
+        }
+    }
+
     private final void updateDataIcon() {
         int iconId;
         boolean visible = true;
@@ -1233,12 +1227,7 @@
 
             mDataTypeIconId = 0;
             mQSDataTypeIconId = 0;
-            if (isCdma()) {
-                if (isCdmaEri()) {
-                    mDataTypeIconId = TelephonyIcons.ROAMING_ICON;
-                    mQSDataTypeIconId = TelephonyIcons.QS_DATA_R[mInetCondition];
-                }
-            } else if (mPhone.isNetworkRoaming()) {
+            if (isRoaming()) {
                 mDataTypeIconId = TelephonyIcons.ROAMING_ICON;
                 mQSDataTypeIconId = TelephonyIcons.QS_DATA_R[mInetCondition];
             }
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index 42ee666..5f3b877 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -2929,6 +2929,10 @@
                             }
                         }
 
+                        // The action mode's theme may differ from the app, so
+                        // always show the status guard above it if we have one.
+                        showStatusGuard = mStatusGuard != null;
+
                         // We only need to consume the insets if the action
                         // mode is overlaid on the app content (e.g. it's
                         // sitting in a FrameLayout, see
@@ -2936,11 +2940,7 @@
                         final boolean nonOverlay = (getLocalFeatures()
                                 & (1 << FEATURE_ACTION_MODE_OVERLAY)) == 0;
                         insets = insets.consumeSystemWindowInsets(
-                                false, nonOverlay /* top */, false, false);
-
-                        // The action mode's theme may differ from the app, so
-                        // always show the status guard above it.
-                        showStatusGuard = true;
+                                false, nonOverlay && showStatusGuard /* top */, false, false);
                     } else {
                         // reset top margin
                         if (mlp.topMargin != 0) {
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index be3fc47..cc17422 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -67,6 +67,7 @@
 import android.util.Pools.SimplePool;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.view.AccessibilityManagerInternal;
 import android.view.Display;
 import android.view.IWindow;
 import android.view.InputDevice;
@@ -91,6 +92,7 @@
 import com.android.internal.R;
 import com.android.internal.content.PackageMonitor;
 import com.android.internal.statusbar.IStatusBarService;
+import com.android.internal.widget.LockPatternUtils;
 import com.android.server.LocalServices;
 
 import org.xmlpull.v1.XmlPullParserException;
@@ -202,6 +204,8 @@
 
     private final UserManager mUserManager;
 
+    private final LockPatternUtils mLockPatternUtils;
+
     private int mCurrentUserId = UserHandle.USER_OWNER;
 
     //TODO: Remove this hack
@@ -225,9 +229,11 @@
         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
         mSecurityPolicy = new SecurityPolicy();
         mMainHandler = new MainHandler(mContext.getMainLooper());
+        mLockPatternUtils = new LockPatternUtils(context);
         registerBroadcastReceivers();
         new AccessibilityContentObserver(mMainHandler).register(
                 context.getContentResolver());
+        LocalServices.addService(AccessibilityManagerInternal.class, new LocalService());
     }
 
     private UserState getUserStateLocked(int userId) {
@@ -1294,6 +1300,7 @@
         updateTouchExplorationLocked(userState);
         updateEnhancedWebAccessibilityLocked(userState);
         updateDisplayColorAdjustmentSettingsLocked(userState);
+        updateEncryptionState(userState);
         scheduleUpdateInputFilter(userState);
         scheduleUpdateClientsIfNeededLocked(userState);
     }
@@ -1570,6 +1577,21 @@
         DisplayAdjustmentUtils.applyAdjustments(mContext, userState.mUserId);
     }
 
+    private void updateEncryptionState(UserState userState) {
+        if (userState.mUserId != UserHandle.USER_OWNER) {
+            return;
+        }
+        if (hasRunningServicesLocked(userState) && LockPatternUtils.isDeviceEncrypted()) {
+            // If there are running accessibility services we do not have encryption as
+            // the user needs the accessibility layer to be running to authenticate.
+            mLockPatternUtils.clearEncryptionPassword();
+        }
+    }
+
+    private boolean hasRunningServicesLocked(UserState userState) {
+        return !userState.mBoundServices.isEmpty() || !userState.mBindingServices.isEmpty();
+    }
+
     private MagnificationSpec getCompatibleMagnificationSpecLocked(int windowId) {
         IBinder windowToken = mGlobalWindowTokens.get(windowId);
         if (windowToken == null) {
@@ -1982,7 +2004,15 @@
             } else {
                 userState.mBindingServices.add(mComponentName);
                 mService = userState.mUiAutomationServiceClient.asBinder();
-                onServiceConnected(mComponentName, mService);
+                mMainHandler.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        // Simulate asynchronous connection since in onServiceConnected
+                        // we may modify the state data in case of an error but bind is
+                        // called while iterating over the data and bad things can happen.
+                        onServiceConnected(mComponentName, mService);
+                    }
+                });
                 userState.mUiAutomationService = this;
             }
             return false;
@@ -3883,4 +3913,14 @@
             }
         }
     }
+
+    private final class LocalService extends AccessibilityManagerInternal {
+        @Override
+        public boolean isNonDefaultEncryptionPasswordAllowed() {
+            synchronized (mLock) {
+                UserState userState = getCurrentUserStateLocked();
+                return !hasRunningServicesLocked(userState);
+            }
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 0b1a627..85ab249 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -516,11 +516,13 @@
                 return;
             }
 
-            if (list.isEmpty() || isDefaultNetwork(nai)) {
+            list.add(nai);
+
+            // Send a broadcast if this is the first network of its type or if it's the default.
+            if (list.size() == 1 || isDefaultNetwork(nai)) {
                 maybeLogBroadcast(nai, true, type);
                 sendLegacyNetworkBroadcast(nai, true, type);
             }
-            list.add(nai);
         }
 
         /** Removes the given network from the specified legacy type list. */
diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java
index 7f24d07..b0535b3 100644
--- a/services/core/java/com/android/server/MountService.java
+++ b/services/core/java/com/android/server/MountService.java
@@ -63,6 +63,7 @@
 import android.util.Slog;
 import android.util.Xml;
 
+import android.view.AccessibilityManagerInternal;
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.app.IMediaContainerService;
@@ -557,6 +558,8 @@
 
     private final Handler mHandler;
 
+    private final AccessibilityManagerInternal mAccessibilityManagerInternal;
+
     void waitForAsecScan() {
         waitForLatch(mAsecsScanned);
     }
@@ -1454,6 +1457,9 @@
         hthread.start();
         mHandler = new MountServiceHandler(hthread.getLooper());
 
+        mAccessibilityManagerInternal = LocalServices.getService(
+                AccessibilityManagerInternal.class);
+
         // Watch for user changes
         final IntentFilter userFilter = new IntentFilter();
         userFilter.addAction(Intent.ACTION_USER_ADDED);
@@ -2254,8 +2260,15 @@
 
         final NativeDaemonEvent event;
         try {
+            // The accessibility layer may veto having a non-default encryption
+            // password because if there are enabled accessibility services the
+            // user cannot authenticate as the latter need access to the data.
+            if (!TextUtils.isEmpty(password)
+                    && !mAccessibilityManagerInternal.isNonDefaultEncryptionPasswordAllowed()) {
+                return getEncryptionState();
+            }
             event = mConnector.execute("cryptfs", "changepw", CRYPTO_TYPES[type],
-                                       new SensitiveArg(toHex(password)));
+                        new SensitiveArg(toHex(password)));
             return Integer.parseInt(event.getMessage());
         } catch (NativeDaemonConnectorException e) {
             // Encryption failed
@@ -2302,7 +2315,7 @@
      * @return The type, one of the CRYPT_TYPE_XXX consts from StorageManager.
      */
     @Override
-    public int getPasswordType() throws RemoteException {
+    public int getPasswordType() {
 
         waitForReady();
 
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 7fa000f..e482273 100755
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -9356,6 +9356,7 @@
                 checkTime(startTime, "getContentProviderImpl: after getProviderByClass");
                 final boolean firstClass = cpr == null;
                 if (firstClass) {
+                    final long ident = Binder.clearCallingIdentity();
                     try {
                         checkTime(startTime, "getContentProviderImpl: before getApplicationInfo");
                         ApplicationInfo ai =
@@ -9373,6 +9374,8 @@
                         cpr = new ContentProviderRecord(this, cpi, ai, comp, singleton);
                     } catch (RemoteException ex) {
                         // pm is in same process, this will never happen.
+                    } finally {
+                        Binder.restoreCallingIdentity(ident);
                     }
                 }
 
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index 9292d45..adc96f7 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -311,7 +311,9 @@
                     if (Log.isLoggable(TAG, Log.VERBOSE)) {
                         Log.v(TAG, "Reconnection detected: clearing all backoffs");
                     }
-                    mSyncStorageEngine.clearAllBackoffs(mSyncQueue);
+                    synchronized (mSyncQueue) {
+                        mSyncStorageEngine.clearAllBackoffsLocked(mSyncQueue);
+                    }
                 }
                 sendCheckAlarmsMessage();
             }
diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java
index 9499370..0d5f240 100644
--- a/services/core/java/com/android/server/content/SyncStorageEngine.java
+++ b/services/core/java/com/android/server/content/SyncStorageEngine.java
@@ -834,17 +834,16 @@
         return changed;
     }
 
-    public void clearAllBackoffs(SyncQueue syncQueue) {
+    public void clearAllBackoffsLocked(SyncQueue syncQueue) {
         boolean changed = false;
         synchronized (mAuthorities) {
-            synchronized (syncQueue) {
                 // Clear backoff for all sync adapters.
                 for (AccountInfo accountInfo : mAccounts.values()) {
                     for (AuthorityInfo authorityInfo : accountInfo.authorities.values()) {
                         if (authorityInfo.backoffTime != NOT_IN_BACKOFF_MODE
                                 || authorityInfo.backoffDelay != NOT_IN_BACKOFF_MODE) {
                             if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                                Log.v(TAG, "clearAllBackoffs:"
+                                Log.v(TAG, "clearAllBackoffsLocked:"
                                         + " authority:" + authorityInfo.target
                                         + " account:" + accountInfo.accountAndUser.account.name
                                         + " user:" + accountInfo.accountAndUser.userId
@@ -868,7 +867,6 @@
                             authorityInfo.backoffDelay = NOT_IN_BACKOFF_MODE;
                         }
                     }
-                }
                 syncQueue.clearBackoffs();
             }
         }
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index d9730aa..a0ec1d5 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -23,6 +23,7 @@
 import android.content.pm.ParceledListSlice;
 import android.media.AudioManager;
 import android.media.AudioManagerInternal;
+import android.media.AudioSystem;
 import android.media.MediaDescription;
 import android.media.MediaMetadata;
 import android.media.Rating;
@@ -237,6 +238,7 @@
      */
     public void adjustVolume(int direction, int flags, String packageName, int uid,
             boolean useSuggested) {
+        int previousFlagPlaySound = flags & AudioManager.FLAG_PLAY_SOUND;
         if (isPlaybackActive(false) || hasFlag(MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY)) {
             flags &= ~AudioManager.FLAG_PLAY_SOUND;
         }
@@ -248,8 +250,15 @@
         if (mVolumeType == PlaybackInfo.PLAYBACK_TYPE_LOCAL) {
             int stream = AudioAttributes.toLegacyStreamType(mAudioAttrs);
             if (useSuggested) {
-                mAudioManagerInternal.adjustSuggestedStreamVolumeForUid(stream, direction, flags,
-                        packageName, uid);
+                if (AudioSystem.isStreamActive(stream, 0)) {
+                    mAudioManagerInternal.adjustSuggestedStreamVolumeForUid(stream, direction,
+                            flags, packageName, uid);
+                } else {
+                    flags |= previousFlagPlaySound;
+                    mAudioManagerInternal.adjustSuggestedStreamVolumeForUid(
+                            AudioManager.USE_DEFAULT_STREAM_TYPE, direction, flags, packageName,
+                            uid);
+                }
             } else {
                 mAudioManagerInternal.adjustStreamVolumeForUid(stream, direction, flags,
                         packageName, uid);
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 999649b..41574ca 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2712,9 +2712,10 @@
 
         if (atoken != null) {
             if (atoken.startingWindow == win) {
-                if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Nulling startingWindow " + win);
-                atoken.startingWindow = null;
-            } else if (atoken.allAppWindows.size() == 0 && atoken.startingData != null) {
+                if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Notify removed startingWindow " + win);
+                scheduleRemoveStartingWindowLocked(atoken);
+            } else
+            if (atoken.allAppWindows.size() == 0 && atoken.startingData != null) {
                 // If this is the last window and we had requested a starting
                 // transition window, well there is no point now.
                 if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Nulling last startingWindow");
@@ -2722,7 +2723,7 @@
             } else if (atoken.allAppWindows.size() == 1 && atoken.startingView != null) {
                 // If this is the last window except for a starting transition
                 // window, we need to get rid of the starting transition.
-                scheduleRemoveStartingWindow(atoken);
+                scheduleRemoveStartingWindowLocked(atoken);
             }
         }
 
@@ -4329,7 +4330,7 @@
         synchronized (mWindowMap) {
             AppWindowToken wtoken = mTokenMap.get(token).appWindowToken;
             if (wtoken.startingWindow != null) {
-                scheduleRemoveStartingWindow(wtoken);
+                scheduleRemoveStartingWindowLocked(wtoken);
             }
         }
     }
@@ -4791,14 +4792,19 @@
             if (!delayed && wtoken != null) {
                 wtoken.updateReportedVisibilityLocked();
             }
+
+            // Will only remove if startingToken non null.
+            scheduleRemoveStartingWindowLocked(startingToken);
         }
         Binder.restoreCallingIdentity(origId);
 
-        // Will only remove if startingToken non null.
-        scheduleRemoveStartingWindow(startingToken);
     }
 
-    void scheduleRemoveStartingWindow(AppWindowToken wtoken) {
+    void scheduleRemoveStartingWindowLocked(AppWindowToken wtoken) {
+        if (mH.hasMessages(H.REMOVE_STARTING, wtoken)) {
+            // Already scheduled.
+            return;
+        }
         if (wtoken != null && wtoken.startingWindow != null) {
             if (DEBUG_STARTING_WINDOW) Slog.v(TAG, Debug.getCallers(1) +
                     ": Schedule remove starting " + wtoken + (wtoken != null ?
@@ -9093,6 +9099,11 @@
                 // gotten drawn.
                 wtoken.allDrawn = true;
                 wtoken.deferClearAllDrawn = false;
+                // Ensure that apps that are mid-starting are also scheduled to have their
+                // starting windows removed after the animation is complete
+                if (wtoken.startingWindow != null && !wtoken.startingWindow.mExiting) {
+                    scheduleRemoveStartingWindowLocked(wtoken);
+                }
 
                 if (animLp != null) {
                     int layer = -1;
@@ -10236,7 +10247,7 @@
                     winAnimator.mSurfaceShown = false;
                     winAnimator.mSurfaceControl = null;
                     winAnimator.mWin.mHasSurface = false;
-                    scheduleRemoveStartingWindow(winAnimator.mWin.mAppToken);
+                    scheduleRemoveStartingWindowLocked(winAnimator.mWin.mAppToken);
                 }
 
                 try {
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 5b007d4..0c727f3 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -515,6 +515,7 @@
 
     static class SurfaceTrace extends SurfaceControl {
         private final static String SURFACE_TAG = "SurfaceTrace";
+        private final static boolean logSurfaceTrace = DEBUG_SURFACE_TRACE;
         final static ArrayList<SurfaceTrace> sSurfaces = new ArrayList<SurfaceTrace>();
 
         private float mSurfaceTraceAlpha = 0;
@@ -534,7 +535,7 @@
             super(s, name, w, h, format, flags);
             mName = name != null ? name : "Not named";
             mSize.set(w, h);
-            Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by "
+            if (logSurfaceTrace) Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by "
                     + Debug.getCallers(3));
             synchronized (sSurfaces) {
                 sSurfaces.add(0, this);
@@ -544,8 +545,8 @@
         @Override
         public void setAlpha(float alpha) {
             if (mSurfaceTraceAlpha != alpha) {
-                Slog.v(SURFACE_TAG, "setAlpha(" + alpha + "): OLD:" + this + ". Called by "
-                        + Debug.getCallers(3));
+                if (logSurfaceTrace) Slog.v(SURFACE_TAG, "setAlpha(" + alpha + "): OLD:" + this +
+                        ". Called by " + Debug.getCallers(3));
                 mSurfaceTraceAlpha = alpha;
             }
             super.setAlpha(alpha);
@@ -554,8 +555,8 @@
         @Override
         public void setLayer(int zorder) {
             if (zorder != mLayer) {
-                Slog.v(SURFACE_TAG, "setLayer(" + zorder + "): OLD:" + this + ". Called by "
-                        + Debug.getCallers(3));
+                if (logSurfaceTrace) Slog.v(SURFACE_TAG, "setLayer(" + zorder + "): OLD:" + this
+                        + ". Called by " + Debug.getCallers(3));
                 mLayer = zorder;
             }
             super.setLayer(zorder);
@@ -576,8 +577,8 @@
         @Override
         public void setPosition(float x, float y) {
             if (x != mPosition.x || y != mPosition.y) {
-                Slog.v(SURFACE_TAG, "setPosition(" + x + "," + y + "): OLD:" + this
-                        + ". Called by " + Debug.getCallers(3));
+                if (logSurfaceTrace) Slog.v(SURFACE_TAG, "setPosition(" + x + "," + y + "): OLD:"
+                        + this + ". Called by " + Debug.getCallers(3));
                 mPosition.set(x, y);
             }
             super.setPosition(x, y);
@@ -586,8 +587,8 @@
         @Override
         public void setSize(int w, int h) {
             if (w != mSize.x || h != mSize.y) {
-                Slog.v(SURFACE_TAG, "setSize(" + w + "," + h + "): OLD:" + this + ". Called by "
-                        + Debug.getCallers(3));
+                if (logSurfaceTrace) Slog.v(SURFACE_TAG, "setSize(" + w + "," + h + "): OLD:"
+                        + this + ". Called by " + Debug.getCallers(3));
                 mSize.set(w, h);
             }
             super.setSize(w, h);
@@ -597,8 +598,9 @@
         public void setWindowCrop(Rect crop) {
             if (crop != null) {
                 if (!crop.equals(mWindowCrop)) {
-                    Slog.v(SURFACE_TAG, "setWindowCrop(" + crop.toShortString() + "): OLD:" + this
-                            + ". Called by " + Debug.getCallers(3));
+                    if (logSurfaceTrace) Slog.v(SURFACE_TAG, "setWindowCrop("
+                            + crop.toShortString() + "): OLD:" + this + ". Called by "
+                            + Debug.getCallers(3));
                     mWindowCrop.set(crop);
                 }
             }
@@ -608,8 +610,8 @@
         @Override
         public void setLayerStack(int layerStack) {
             if (layerStack != mLayerStack) {
-                Slog.v(SURFACE_TAG, "setLayerStack(" + layerStack + "): OLD:" + this
-                        + ". Called by " + Debug.getCallers(3));
+                if (logSurfaceTrace) Slog.v(SURFACE_TAG, "setLayerStack(" + layerStack + "): OLD:"
+                        + this + ". Called by " + Debug.getCallers(3));
                 mLayerStack = layerStack;
             }
             super.setLayerStack(layerStack);
@@ -618,8 +620,8 @@
         @Override
         public void setOpaque(boolean isOpaque) {
             if (isOpaque != mIsOpaque) {
-                Slog.v(SURFACE_TAG, "setOpaque(" + isOpaque + "): OLD:" + this
-                        + ". Called by " + Debug.getCallers(3));
+                if (logSurfaceTrace) Slog.v(SURFACE_TAG, "setOpaque(" + isOpaque + "): OLD:"
+                        + this + ". Called by " + Debug.getCallers(3));
                 mIsOpaque = isOpaque;
             }
             super.setOpaque(isOpaque);
@@ -628,8 +630,9 @@
         @Override
         public void setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) {
             if (dsdx != mDsdx || dtdx != mDtdx || dsdy != mDsdy || dtdy != mDtdy) {
-                Slog.v(SURFACE_TAG, "setMatrix(" + dsdx + "," + dtdx + "," + dsdy + "," + dtdy +
-                        "): OLD:" + this + ". Called by " + Debug.getCallers(3));
+                if (logSurfaceTrace) Slog.v(SURFACE_TAG, "setMatrix(" + dsdx + "," + dtdx + ","
+                        + dsdy + "," + dtdy + "): OLD:" + this + ". Called by "
+                        + Debug.getCallers(3));
                 mDsdx = dsdx;
                 mDtdx = dtdx;
                 mDsdy = dsdy;
@@ -641,7 +644,8 @@
         @Override
         public void hide() {
             if (mShown) {
-                Slog.v(SURFACE_TAG, "hide: OLD:" + this + ". Called by " + Debug.getCallers(3));
+                if (logSurfaceTrace) Slog.v(SURFACE_TAG, "hide: OLD:" + this + ". Called by "
+                        + Debug.getCallers(3));
                 mShown = false;
             }
             super.hide();
@@ -650,7 +654,8 @@
         @Override
         public void show() {
             if (!mShown) {
-                Slog.v(SURFACE_TAG, "show: OLD:" + this + ". Called by " + Debug.getCallers(3));
+                if (logSurfaceTrace) Slog.v(SURFACE_TAG, "show: OLD:" + this + ". Called by "
+                        + Debug.getCallers(3));
                 mShown = true;
             }
             super.show();
@@ -659,7 +664,8 @@
         @Override
         public void destroy() {
             super.destroy();
-            Slog.v(SURFACE_TAG, "destroy: " + this + ". Called by " + Debug.getCallers(3));
+            if (logSurfaceTrace) Slog.v(SURFACE_TAG, "destroy: " + this + ". Called by "
+                    + Debug.getCallers(3));
             synchronized (sSurfaces) {
                 sSurfaces.remove(this);
             }
@@ -668,7 +674,7 @@
         @Override
         public void release() {
             super.release();
-            Slog.v(SURFACE_TAG, "release: " + this + ". Called by "
+            if (logSurfaceTrace) Slog.v(SURFACE_TAG, "release: " + this + ". Called by "
                     + Debug.getCallers(3));
             synchronized (sSurfaces) {
                 sSurfaces.remove(this);
diff --git a/tests/SharedLibrary/lib/res/layout/main.xml b/tests/SharedLibrary/lib/res/layout/main.xml
new file mode 100644
index 0000000..df0204d9
--- /dev/null
+++ b/tests/SharedLibrary/lib/res/layout/main.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/sample_layout"/>
+
+    <com.google.android.test.shared_library.AddressView xmlns:address="http://schemas.android.com/apk/res-auto"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:background="#03a9f4"
+        address:name="Librarian L"
+        address:streetNumber="21"
+        address:streetName="Android Lane"
+        address:city="AndroidVille"
+        address:state="OS"
+        address:zip="12345"
+        address:country="Mobile"/>
+
+</LinearLayout>
diff --git a/tests/SharedLibrary/lib/res/values/strings.xml b/tests/SharedLibrary/lib/res/values/strings.xml
index 6827f93..9beccd9 100644
--- a/tests/SharedLibrary/lib/res/values/strings.xml
+++ b/tests/SharedLibrary/lib/res/values/strings.xml
@@ -28,4 +28,5 @@
     </string-array>
 
     <string name="racoon">Racoon</string>
+    <string name="sample_layout">This is an example of a layout this library provides.</string>
 </resources>
diff --git a/tests/SharedLibrary/lib/src/com/google/android/test/shared_library/ActivityMain.java b/tests/SharedLibrary/lib/src/com/google/android/test/shared_library/ActivityMain.java
index 895aced..4b4893c 100644
--- a/tests/SharedLibrary/lib/src/com/google/android/test/shared_library/ActivityMain.java
+++ b/tests/SharedLibrary/lib/src/com/google/android/test/shared_library/ActivityMain.java
@@ -18,15 +18,11 @@
 
 import android.app.Activity;
 import android.os.Bundle;
-import android.widget.TextView;
 
 public class ActivityMain extends Activity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-
-        TextView content = new TextView(this);
-        content.setText("Dummy main entry for this apk; not really needed...");
-        setContentView(content);
+        setContentView(R.layout.main);
     }
 }