Merge "Update Javadocs: all new features supported for asymmetric crypto." into mnc-dev
diff --git a/api/current.txt b/api/current.txt
index ec56ce0..43c1ade9 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -6123,10 +6123,10 @@
     method public java.lang.String getPackageName();
     method public long getTimeStamp();
     field public static final int CONFIGURATION_CHANGE = 5; // 0x5
-    field public static final int INTERACTION = 6; // 0x6
     field public static final int MOVE_TO_BACKGROUND = 2; // 0x2
     field public static final int MOVE_TO_FOREGROUND = 1; // 0x1
     field public static final int NONE = 0; // 0x0
+    field public static final int USER_INTERACTION = 7; // 0x7
   }
 
   public final class UsageStats implements android.os.Parcelable {
@@ -33906,7 +33906,7 @@
   public final class ArrayMap implements java.util.Map {
     ctor public ArrayMap();
     ctor public ArrayMap(int);
-    ctor public ArrayMap(android.util.ArrayMap);
+    ctor public ArrayMap(android.util.ArrayMap<K, V>);
     method public void clear();
     method public boolean containsAll(java.util.Collection<?>);
     method public boolean containsKey(java.lang.Object);
@@ -33931,6 +33931,31 @@
     method public java.util.Collection<V> values();
   }
 
+  public final class ArraySet implements java.util.Collection java.util.Set {
+    ctor public ArraySet();
+    ctor public ArraySet(int);
+    ctor public ArraySet(android.util.ArraySet<E>);
+    method public boolean add(E);
+    method public void addAll(android.util.ArraySet<? extends E>);
+    method public boolean addAll(java.util.Collection<? extends E>);
+    method public void clear();
+    method public boolean contains(java.lang.Object);
+    method public boolean containsAll(java.util.Collection<?>);
+    method public void ensureCapacity(int);
+    method public int indexOf(java.lang.Object);
+    method public boolean isEmpty();
+    method public java.util.Iterator<E> iterator();
+    method public boolean remove(java.lang.Object);
+    method public boolean removeAll(android.util.ArraySet<? extends E>);
+    method public boolean removeAll(java.util.Collection<?>);
+    method public E removeAt(int);
+    method public boolean retainAll(java.util.Collection<?>);
+    method public int size();
+    method public java.lang.Object[] toArray();
+    method public T[] toArray(T[]);
+    method public E valueAt(int);
+  }
+
   public class AtomicFile {
     ctor public AtomicFile(java.io.File);
     method public void delete();
diff --git a/api/removed.txt b/api/removed.txt
index 0046a70..f6ad27b 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -1,12 +1,3 @@
-package android {
-
-  public static final class Manifest.permission {
-    field public static final java.lang.String SUBSCRIBED_FEEDS_READ = "android.permission.SUBSCRIBED_FEEDS_READ";
-    field public static final java.lang.String SUBSCRIBED_FEEDS_WRITE = "android.permission.SUBSCRIBED_FEEDS_WRITE";
-  }
-
-}
-
 package android.content.pm {
 
   public class PackageInfo implements android.os.Parcelable {
diff --git a/api/system-current.txt b/api/system-current.txt
index 5ec8a62..2345ef6 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -6313,10 +6313,10 @@
     method public java.lang.String getPackageName();
     method public long getTimeStamp();
     field public static final int CONFIGURATION_CHANGE = 5; // 0x5
-    field public static final int INTERACTION = 6; // 0x6
     field public static final int MOVE_TO_BACKGROUND = 2; // 0x2
     field public static final int MOVE_TO_FOREGROUND = 1; // 0x1
     field public static final int NONE = 0; // 0x0
+    field public static final int USER_INTERACTION = 7; // 0x7
   }
 
   public final class UsageStats implements android.os.Parcelable {
@@ -36183,7 +36183,7 @@
   public final class ArrayMap implements java.util.Map {
     ctor public ArrayMap();
     ctor public ArrayMap(int);
-    ctor public ArrayMap(android.util.ArrayMap);
+    ctor public ArrayMap(android.util.ArrayMap<K, V>);
     method public void clear();
     method public boolean containsAll(java.util.Collection<?>);
     method public boolean containsKey(java.lang.Object);
@@ -36208,6 +36208,31 @@
     method public java.util.Collection<V> values();
   }
 
+  public final class ArraySet implements java.util.Collection java.util.Set {
+    ctor public ArraySet();
+    ctor public ArraySet(int);
+    ctor public ArraySet(android.util.ArraySet<E>);
+    method public boolean add(E);
+    method public void addAll(android.util.ArraySet<? extends E>);
+    method public boolean addAll(java.util.Collection<? extends E>);
+    method public void clear();
+    method public boolean contains(java.lang.Object);
+    method public boolean containsAll(java.util.Collection<?>);
+    method public void ensureCapacity(int);
+    method public int indexOf(java.lang.Object);
+    method public boolean isEmpty();
+    method public java.util.Iterator<E> iterator();
+    method public boolean remove(java.lang.Object);
+    method public boolean removeAll(android.util.ArraySet<? extends E>);
+    method public boolean removeAll(java.util.Collection<?>);
+    method public E removeAt(int);
+    method public boolean retainAll(java.util.Collection<?>);
+    method public int size();
+    method public java.lang.Object[] toArray();
+    method public T[] toArray(T[]);
+    method public E valueAt(int);
+  }
+
   public class AtomicFile {
     ctor public AtomicFile(java.io.File);
     method public void delete();
diff --git a/api/system-removed.txt b/api/system-removed.txt
index 0046a70..f6ad27b 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -1,12 +1,3 @@
-package android {
-
-  public static final class Manifest.permission {
-    field public static final java.lang.String SUBSCRIBED_FEEDS_READ = "android.permission.SUBSCRIBED_FEEDS_READ";
-    field public static final java.lang.String SUBSCRIBED_FEEDS_WRITE = "android.permission.SUBSCRIBED_FEEDS_WRITE";
-  }
-
-}
-
 package android.content.pm {
 
   public class PackageInfo implements android.os.Parcelable {
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index 9604789..c2bf28a 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -55,6 +55,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.net.URL;
+import java.util.List;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Enumeration;
@@ -166,6 +167,7 @@
             if (runtimeIsa.equals(secondaryIsa)) {
                 final ApplicationInfo modified = new ApplicationInfo(info);
                 modified.nativeLibraryDir = modified.secondaryNativeLibraryDir;
+                modified.primaryCpuAbi = modified.secondaryCpuAbi;
                 return modified;
             }
         }
@@ -272,8 +274,9 @@
                     }
                 }
 
-                final ArrayList<String> zipPaths = new ArrayList<>();
-                final ArrayList<String> libPaths = new ArrayList<>();
+                final List<String> zipPaths = new ArrayList<>();
+                final List<String> apkPaths = new ArrayList<>();
+                final List<String> libPaths = new ArrayList<>();
 
                 if (mRegisterPackage) {
                     try {
@@ -329,6 +332,8 @@
                     }
                 }
 
+                apkPaths.addAll(zipPaths);
+
                 if (mSharedLibraries != null) {
                     for (String lib : mSharedLibraries) {
                         if (!zipPaths.contains(lib)) {
@@ -346,6 +351,14 @@
                 }
 
                 final String zip = TextUtils.join(File.pathSeparator, zipPaths);
+
+                // Add path to libraries in apk for current abi
+                if (mApplicationInfo.primaryCpuAbi != null) {
+                    for (String apk : apkPaths) {
+                      libPaths.add(apk + "!/lib/" + mApplicationInfo.primaryCpuAbi);
+                    }
+                }
+
                 final String lib = TextUtils.join(File.pathSeparator, libPaths);
 
                 /*
diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java
index 58279d7..369b692 100644
--- a/core/java/android/app/usage/UsageEvents.java
+++ b/core/java/android/app/usage/UsageEvents.java
@@ -68,9 +68,15 @@
         public static final int CONFIGURATION_CHANGE = 5;
 
         /**
-         * An event type denoting that a package was interacted with in some way.
+         * An event type denoting that a package was interacted with in some way by the system.
+         * @hide
          */
-        public static final int INTERACTION = 6;
+        public static final int SYSTEM_INTERACTION = 6;
+
+        /**
+         * An event type denoting that a package was interacted with in some way by the user.
+         */
+        public static final int USER_INTERACTION = 7;
 
         /**
          * {@hide}
diff --git a/core/java/android/app/usage/UsageStats.java b/core/java/android/app/usage/UsageStats.java
index 81c7422..0fce4e2 100644
--- a/core/java/android/app/usage/UsageStats.java
+++ b/core/java/android/app/usage/UsageStats.java
@@ -41,11 +41,19 @@
     public long mEndTimeStamp;
 
     /**
+     * Last time used by the user with an explicit action (notification, activity launch).
      * {@hide}
      */
     public long mLastTimeUsed;
 
     /**
+     * The last time the package was used via implicit, non-user initiated actions (service
+     * was bound, etc).
+     * {@hide}
+     */
+    public long mLastTimeSystemUsed;
+
+    /**
      * Last time the package was used and the beginning of the idle countdown.
      * This uses a different timebase that is about how much the device has been in use in general.
      * {@hide}
@@ -82,6 +90,7 @@
         mLaunchCount = stats.mLaunchCount;
         mLastEvent = stats.mLastEvent;
         mBeginIdleTime = stats.mBeginIdleTime;
+        mLastTimeSystemUsed = stats.mLastTimeSystemUsed;
     }
 
     public String getPackageName() {
@@ -119,6 +128,16 @@
 
     /**
      * @hide
+     * Get the last time this package was used by the system (not the user). This can be different
+     * from {@link #getLastTimeUsed()} when the system binds to one of this package's services.
+     * See {@link System#currentTimeMillis()}.
+     */
+    public long getLastTimeSystemUsed() {
+        return mLastTimeSystemUsed;
+    }
+
+    /**
+     * @hide
      * Get the last time this package was active, measured in milliseconds. This timestamp
      * uses a timebase that represents how much the device was used and not wallclock time.
      */
@@ -151,6 +170,7 @@
             mEndTimeStamp = right.mEndTimeStamp;
             mLastTimeUsed = right.mLastTimeUsed;
             mBeginIdleTime = right.mBeginIdleTime;
+            mLastTimeSystemUsed = right.mLastTimeSystemUsed;
         }
         mBeginTimeStamp = Math.min(mBeginTimeStamp, right.mBeginTimeStamp);
         mTotalTimeInForeground += right.mTotalTimeInForeground;
@@ -172,6 +192,7 @@
         dest.writeInt(mLaunchCount);
         dest.writeInt(mLastEvent);
         dest.writeLong(mBeginIdleTime);
+        dest.writeLong(mLastTimeSystemUsed);
     }
 
     public static final Creator<UsageStats> CREATOR = new Creator<UsageStats>() {
@@ -186,6 +207,7 @@
             stats.mLaunchCount = in.readInt();
             stats.mLastEvent = in.readInt();
             stats.mBeginIdleTime = in.readLong();
+            stats.mLastTimeSystemUsed = in.readLong();
             return stats;
         }
 
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
index ed167f0..8512b23 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
@@ -52,6 +52,7 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -79,7 +80,7 @@
     private volatile StateCallbackKK mSessionStateCallback;
     private final Handler mDeviceHandler;
 
-    private volatile boolean mClosing = false;
+    private final AtomicBoolean mClosing = new AtomicBoolean();
     private boolean mInError = false;
     private boolean mIdle = true;
 
@@ -906,6 +907,10 @@
     @Override
     public void close() {
         synchronized (mInterfaceLock) {
+            if (mClosing.getAndSet(true)) {
+                return;
+            }
+
             try {
                 if (mRemoteDevice != null) {
                     mRemoteDevice.disconnect();
@@ -1917,7 +1922,7 @@
 
     /** Whether the camera device has started to close (may not yet have finished) */
     private boolean isClosed() {
-        return mClosing;
+        return mClosing.get();
     }
 
     private CameraCharacteristics getCharacteristics() {
diff --git a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
index a3a998e..cc95c0e 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
@@ -87,6 +87,9 @@
 
     public static final int MAX_DIMEN_FOR_ROUNDING = 1080; // maximum allowed width for rounding
 
+    // Keep up to date with values in system/core/include/system/window.h
+    public static final int NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW = 1;
+
     private CaptureResultExtras getExtrasFromRequest(RequestHolder holder) {
         if (holder == null) {
             return new CaptureResultExtras(ILLEGAL_VALUE, ILLEGAL_VALUE, ILLEGAL_VALUE,
@@ -690,6 +693,13 @@
         LegacyExceptionUtils.throwOnError(nativeSetNextTimestamp(surface, timestamp));
     }
 
+    static void setScalingMode(Surface surface, int mode)
+            throws BufferQueueAbandonedException {
+        checkNotNull(surface);
+        LegacyExceptionUtils.throwOnError(nativeSetScalingMode(surface, mode));
+    }
+
+
     private static native int nativeDetectSurfaceType(Surface surface);
 
     private static native int nativeDetectSurfaceDimens(Surface surface,
@@ -717,5 +727,7 @@
 
     private static native int nativeDetectSurfaceUsageFlags(Surface surface);
 
+    private static native int nativeSetScalingMode(Surface surface, int scalingMode);
+
     static native int nativeGetJpegFooterSize();
 }
diff --git a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
index 33a802b..8bdd42a 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
@@ -415,8 +415,9 @@
             Range<Integer>[] ranges = new Range[rangesSize];
             int i = 0;
             for (int[] r : fpsRanges) {
-                ranges[i++] = Range.create(r[Camera.Parameters.PREVIEW_FPS_MIN_INDEX],
-                        r[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
+                ranges[i++] = Range.create(
+                        (int) Math.floor(r[Camera.Parameters.PREVIEW_FPS_MIN_INDEX] / 1000.0),
+                        (int) Math.ceil(r[Camera.Parameters.PREVIEW_FPS_MAX_INDEX] / 1000.0));
             }
             m.set(CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, ranges);
         }
diff --git a/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java b/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java
index d5d7f0d..6a44ac5 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java
@@ -162,17 +162,19 @@
         if (aeFpsRange != null) {
             int[] legacyFps = convertAeFpsRangeToLegacy(aeFpsRange);
 
-            // TODO - Should we enforce that all HAL1 devices must include (30, 30) FPS range?
-            boolean supported = false;
+            int[] rangeToApply = null;
             for(int[] range : params.getSupportedPreviewFpsRange()) {
-                if (legacyFps[0] == range[0] && legacyFps[1] == range[1]) {
-                    supported = true;
+                // Round range up/down to integer FPS value
+                int intRangeLow = (int) Math.floor(range[0] / 1000.0) * 1000;
+                int intRangeHigh = (int) Math.ceil(range[1] / 1000.0) * 1000;
+                if (legacyFps[0] == intRangeLow && legacyFps[1] == intRangeHigh) {
+                    rangeToApply = range;
                     break;
                 }
             }
-            if (supported) {
-                params.setPreviewFpsRange(legacyFps[Camera.Parameters.PREVIEW_FPS_MIN_INDEX],
-                        legacyFps[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
+            if (rangeToApply != null) {
+                params.setPreviewFpsRange(rangeToApply[Camera.Parameters.PREVIEW_FPS_MIN_INDEX],
+                        rangeToApply[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
             } else {
                 Log.w(TAG, "Unsupported FPS range set [" + legacyFps[0] + "," + legacyFps[1] + "]");
             }
@@ -626,8 +628,8 @@
 
     private static int[] convertAeFpsRangeToLegacy(Range<Integer> fpsRange) {
         int[] legacyFps = new int[2];
-        legacyFps[Parameters.PREVIEW_FPS_MIN_INDEX] = fpsRange.getLower();
-        legacyFps[Parameters.PREVIEW_FPS_MAX_INDEX] = fpsRange.getUpper();
+        legacyFps[Parameters.PREVIEW_FPS_MIN_INDEX] = fpsRange.getLower() * 1000;
+        legacyFps[Parameters.PREVIEW_FPS_MAX_INDEX] = fpsRange.getUpper() * 1000;
         return legacyFps;
     }
 
diff --git a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
index 5ea1ab8..348b14a 100644
--- a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
+++ b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
@@ -384,6 +384,8 @@
                             callbackOutputSizes.add(outSize);
                             break;
                         default:
+                            LegacyCameraDevice.setScalingMode(s, LegacyCameraDevice.
+                                    NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
                             mPreviewOutputs.add(s);
                             previewOutputSizes.add(outSize);
                             break;
@@ -412,6 +414,9 @@
         mParams.setPreviewFpsRange(bestRange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX],
                 bestRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
 
+        Size smallestSupportedJpegSize = calculatePictureSize(mCallbackOutputs,
+                callbackOutputSizes, mParams);
+
         if (previewOutputSizes.size() > 0) {
 
             Size largestOutput = SizeAreaComparator.findLargestByArea(previewOutputSizes);
@@ -419,6 +424,9 @@
             // Find largest jpeg dimension - assume to have the same aspect ratio as sensor.
             Size largestJpegDimen = ParameterUtils.getLargestSupportedJpegSizeByArea(mParams);
 
+            Size chosenJpegDimen = (smallestSupportedJpegSize != null) ? smallestSupportedJpegSize
+                    : largestJpegDimen;
+
             List<Size> supportedPreviewSizes = ParameterUtils.convertSizeList(
                     mParams.getSupportedPreviewSizes());
 
@@ -430,7 +438,7 @@
             for (Size s : supportedPreviewSizes) {
                 long currArea = s.getWidth() * s.getHeight();
                 long bestArea = bestPreviewDimen.getWidth() * bestPreviewDimen.getHeight();
-                if (checkAspectRatiosMatch(largestJpegDimen, s) && (currArea < bestArea &&
+                if (checkAspectRatiosMatch(chosenJpegDimen, s) && (currArea < bestArea &&
                         currArea >= largestOutputArea)) {
                     bestPreviewDimen = s;
                 }
@@ -451,8 +459,6 @@
             }
         }
 
-        Size smallestSupportedJpegSize = calculatePictureSize(mCallbackOutputs,
-                callbackOutputSizes, mParams);
         if (smallestSupportedJpegSize != null) {
             /*
              * Set takePicture size to the smallest supported JPEG size large enough
diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java
index 1c9c713..135f369 100644
--- a/core/java/android/os/ParcelFileDescriptor.java
+++ b/core/java/android/os/ParcelFileDescriptor.java
@@ -621,6 +621,9 @@
             final int fd = getFd();
             Parcel.clearFileDescriptor(mFd);
             writeCommStatusAndClose(Status.DETACHED, null);
+            mClosed = true;
+            mGuard.close();
+            releaseResources();
             return fd;
         }
     }
diff --git a/core/java/android/os/storage/DiskInfo.java b/core/java/android/os/storage/DiskInfo.java
index 04e54aa..5bc45d5 100644
--- a/core/java/android/os/storage/DiskInfo.java
+++ b/core/java/android/os/storage/DiskInfo.java
@@ -80,6 +80,12 @@
         if (label.toLowerCase().contains("generic")) {
             return false;
         }
+        if (label.toLowerCase().startsWith("usb")) {
+            return false;
+        }
+        if (label.toLowerCase().startsWith("multiple")) {
+            return false;
+        }
         return true;
     }
 
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index d9c412b..aebe7f1 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -8931,157 +8931,4 @@
             public static final String EXTRA_DATA_SET = "android.provider.extra.DATA_SET";
         }
     }
-
-    /**
-     * @hide
-     */
-    protected interface MetadataSyncColumns {
-
-        /**
-         * The raw contact backup id.
-         * A reference to the {@link ContactsContract.RawContacts#BACKUP_ID} that save the
-         * persistent unique id for each raw contact within its source system.
-         *
-         * @hide
-         */
-        public static final String RAW_CONTACT_BACKUP_ID = "raw_contact_backup_id";
-
-        /**
-         * The account type to which the raw_contact of this item is associated. See
-         * {@link RawContacts#ACCOUNT_TYPE}
-         *
-         * @hide
-         */
-        public static final String ACCOUNT_TYPE = "account_type";
-
-        /**
-         * The account name to which the raw_contact of this item is associated. See
-         * {@link RawContacts#ACCOUNT_NAME}
-         *
-         * @hide
-         */
-        public static final String ACCOUNT_NAME = "account_name";
-
-        /**
-         * The data set within the account that the raw_contact of this row belongs to. This allows
-         * multiple sync adapters for the same account type to distinguish between
-         * each others' data.
-         * {@link RawContacts#DATA_SET}
-         *
-         * @hide
-         */
-        public static final String DATA_SET = "data_set";
-
-        /**
-         * A text column contains the Json string got from People API. The Json string contains
-         * all the metadata related to the raw contact, i.e., all the data fields and
-         * aggregation exceptions.
-         *
-         * Here is an example of the Json string got from the actual schema.
-         * <pre>
-         *     {
-         *       "unique_contact_id": {
-         *         "account_type": "CUSTOM_ACCOUNT",
-         *         "custom_account_type": "facebook",
-         *         "account_name": "android-test",
-         *         "contact_id": "1111111",
-         *         "data_set": "FOCUS"
-         *       },
-         *       "contact_prefs": {
-         *         "send_to_voicemail": true,
-         *         "starred": false,
-         *         "pinned": 2
-         *       },
-         *       "aggregation_data": [
-         *         {
-         *           "type": "TOGETHER",
-         *           "contact_ids": [
-         *             {
-         *               "account_type": "GOOGLE_ACCOUNT",
-         *               "account_name": "android-test2",
-         *               "contact_id": "2222222",
-         *               "data_set": "GOOGLE_PLUS"
-         *             },
-         *             {
-         *               "account_type": "GOOGLE_ACCOUNT",
-         *               "account_name": "android-test3",
-         *               "contact_id": "3333333",
-         *               "data_set": "CUSTOM",
-         *               "custom_data_set": "custom type"
-         *             }
-         *           ]
-         *         }
-         *       ],
-         *       "field_data": [
-         *         {
-         *           "field_data_id": "1001",
-         *           "field_data_prefs": {
-         *             "is_primary": true,
-         *             "is_super_primary": true
-         *           },
-         *           "usage_stats": [
-         *             {
-         *               "usage_type": "CALL",
-         *               "last_time_used": 10000001,
-         *               "usage_count": 10
-         *             }
-         *           ]
-         *         }
-         *       ]
-         *     }
-         * </pre>
-         *
-         * @hide
-         */
-        public static final String DATA = "data";
-
-        /**
-         * The "deleted" flag: "0" by default, "1" if the row has been marked
-         * for deletion. When {@link android.content.ContentResolver#delete} is
-         * called on a raw contact, updating MetadataSync table to set the flag of the raw contact
-         * as "1", then metadata sync adapter deletes the raw contact metadata on the server.
-         * <P>Type: INTEGER</P>
-         *
-         * @hide
-         */
-        public static final String DELETED = "deleted";
-    }
-
-    /**
-     * Constants for the metadata sync table. This table is used to cache the metadata_sync data
-     * from server before it is merged into other CP2 tables.
-     *
-     * @hide
-     */
-    public static final class MetadataSync implements BaseColumns, MetadataSyncColumns {
-
-        /** The authority for the contacts metadata */
-        public static final String METADATA_AUTHORITY = "com.android.contacts.metadata";
-
-        /** A content:// style uri to the authority for the contacts metadata */
-        public static final Uri METADATA_AUTHORITY_URI = Uri.parse(
-                "content://" + METADATA_AUTHORITY);
-
-        /**
-         * This utility class cannot be instantiated
-         */
-        private MetadataSync() {
-        }
-
-        /**
-         * The content:// style URI for this table.
-         */
-        public static final Uri CONTENT_URI = Uri.withAppendedPath(METADATA_AUTHORITY_URI,
-                "metadata_sync");
-
-        /**
-         * The MIME type of {@link #CONTENT_URI} providing a directory of contact metadata
-         */
-        public static final String CONTENT_TYPE = "vnd.android.cursor.dir/contact_metadata";
-
-        /**
-         * The MIME type of a {@link #CONTENT_URI} subdirectory of a single contact metadata.
-         */
-        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact_metadata";
-    }
 }
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 167d8e5..f2d3e71 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -7087,6 +7087,36 @@
                 BLUETOOTH_SAP_PRIORITY_PREFIX = "bluetooth_sap_priority_";
 
         /**
+         * Device Idle (Doze) specific settings.
+         * This is encoded as a key=value list, separated by commas. Ex:
+         *
+         * "inactive_timeout=60000,sensing_timeout=400000"
+         *
+         * The following keys are supported:
+         *
+         * <pre>
+         * inactive_to                      (long)
+         * sensing_to                       (long)
+         * motion_inactive_to               (long)
+         * idle_after_inactive_to           (long)
+         * idle_pending_to                  (long)
+         * max_idle_pending_to              (long)
+         * idle_pending_factor              (float)
+         * idle_to                          (long)
+         * max_idle_to                      (long)
+         * idle_factor                      (float)
+         * min_time_to_alarm                (long)
+         * max_temp_app_whitelist_duration  (long)
+         * </pre>
+         *
+         * <p>
+         * Type: string
+         * @hide
+         * @see com.android.server.DeviceIdleController.Constants
+         */
+        public static final String DEVICE_IDLE_CONSTANTS = "device_idle_constants";
+
+        /**
          * Get the key that retrieves a bluetooth headset's priority.
          * @hide
          */
diff --git a/core/java/android/util/ArrayMap.java b/core/java/android/util/ArrayMap.java
index 6ed3885..4ee9807 100644
--- a/core/java/android/util/ArrayMap.java
+++ b/core/java/android/util/ArrayMap.java
@@ -266,7 +266,7 @@
     /**
      * Create a new ArrayMap with the mappings from the given ArrayMap.
      */
-    public ArrayMap(ArrayMap map) {
+    public ArrayMap(ArrayMap<K, V> map) {
         this();
         if (map != null) {
             putAll(map);
@@ -843,7 +843,8 @@
      * in the array map.
      *
      * <p><b>Note:</b> this is a very inefficient way to access the array contents, it
-     * requires generating a number of temporary objects.</p>
+     * requires generating a number of temporary objects and allocates additional state
+     * information associated with the container that will remain for the life of the container.</p>
      *
      * <p><b>Note:</b></p> the semantics of this
      * Set are subtly different than that of a {@link java.util.HashMap}: most important,
@@ -861,7 +862,8 @@
      * in the array map.
      *
      * <p><b>Note:</b> this is a fairly inefficient way to access the array contents, it
-     * requires generating a number of temporary objects.</p>
+     * requires generating a number of temporary objects and allocates additional state
+     * information associated with the container that will remain for the life of the container.</p>
      */
     @Override
     public Set<K> keySet() {
@@ -873,7 +875,8 @@
      * in the array map.
      *
      * <p><b>Note:</b> this is a fairly inefficient way to access the array contents, it
-     * requires generating a number of temporary objects.</p>
+     * requires generating a number of temporary objects and allocates additional state
+     * information associated with the container that will remain for the life of the container.</p>
      */
     @Override
     public Collection<V> values() {
diff --git a/core/java/android/util/ArraySet.java b/core/java/android/util/ArraySet.java
index 7da3941..b7a3c42 100644
--- a/core/java/android/util/ArraySet.java
+++ b/core/java/android/util/ArraySet.java
@@ -42,8 +42,6 @@
  * you have no control over this shrinking -- if you set a capacity and then remove an
  * item, it may reduce the capacity to better match the current size.  In the future an
  * explicit call to set the capacity should turn off this aggressive shrinking behavior.</p>
- *
- * @hide
  */
 public final class ArraySet<E> implements Collection<E>, Set<E> {
     private static final boolean DEBUG = false;
@@ -660,11 +658,24 @@
         return mCollections;
     }
 
+    /**
+     * Return an {@link java.util.Iterator} over all values in the set.
+     *
+     * <p><b>Note:</b> this is a fairly inefficient way to access the array contents, it
+     * requires generating a number of temporary objects and allocates additional state
+     * information associated with the container that will remain for the life of the container.</p>
+     */
     @Override
     public Iterator<E> iterator() {
         return getCollection().getKeySet().iterator();
     }
 
+    /**
+     * Determine if the array set contains all of the values in the given collection.
+     * @param collection The collection whose contents are to be checked against.
+     * @return Returns true if this array set contains a value for every entry
+     * in <var>collection</var>, else returns false.
+     */
     @Override
     public boolean containsAll(Collection<?> collection) {
         Iterator<?> it = collection.iterator();
@@ -676,6 +687,10 @@
         return true;
     }
 
+    /**
+     * Perform an {@link #add(Object)} of all values in <var>collection</var>
+     * @param collection The collection whose contents are to be retrieved.
+     */
     @Override
     public boolean addAll(Collection<? extends E> collection) {
         ensureCapacity(mSize + collection.size());
@@ -686,6 +701,11 @@
         return added;
     }
 
+    /**
+     * Remove all values in the array set that exist in the given collection.
+     * @param collection The collection whose contents are to be used to remove values.
+     * @return Returns true if any values were removed from the array set, else false.
+     */
     @Override
     public boolean removeAll(Collection<?> collection) {
         boolean removed = false;
@@ -695,6 +715,12 @@
         return removed;
     }
 
+    /**
+     * Remove all values in the array set that do <b>not</b> exist in the given collection.
+     * @param collection The collection whose contents are to be used to determine which
+     * values to keep.
+     * @return Returns true if any values were removed from the array set, else false.
+     */
     @Override
     public boolean retainAll(Collection<?> collection) {
         boolean removed = false;
diff --git a/core/java/android/util/KeyValueListParser.java b/core/java/android/util/KeyValueListParser.java
new file mode 100644
index 0000000..4abdde0
--- /dev/null
+++ b/core/java/android/util/KeyValueListParser.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2015 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.util;
+
+import android.text.TextUtils;
+
+/**
+ * Parses a list of key=value pairs, separated by some delimiter, and puts the results in
+ * an internal Map. Values can be then queried by key, or if not found, a default value
+ * can be used.
+ * @hide
+ */
+public class KeyValueListParser {
+    private final ArrayMap<String, String> mValues = new ArrayMap<>();
+    private final TextUtils.StringSplitter mSplitter;
+
+    /**
+     * Constructs a new KeyValueListParser. This can be reused for different strings
+     * by calling {@link #setString(String)}.
+     * @param delim The delimiter that separates key=value pairs.
+     */
+    public KeyValueListParser(char delim) {
+        mSplitter = new TextUtils.SimpleStringSplitter(delim);
+    }
+
+    /**
+     * Resets the parser with a new string to parse. The string is expected to be in the following
+     * format:
+     * <pre>key1=value,key2=value,key3=value</pre>
+     *
+     * where the delimiter is a comma.
+     *
+     * @param str the string to parse.
+     * @throws IllegalArgumentException if the string is malformed.
+     */
+    public void setString(String str) throws IllegalArgumentException {
+        mValues.clear();
+        if (str != null) {
+            mSplitter.setString(str);
+            for (String pair : mSplitter) {
+                int sep = pair.indexOf('=');
+                if (sep < 0) {
+                    mValues.clear();
+                    throw new IllegalArgumentException(
+                            "'" + pair + "' in '" + str + "' is not a valid key-value pair");
+                }
+                mValues.put(pair.substring(0, sep).trim(), pair.substring(sep + 1).trim());
+            }
+        }
+    }
+
+    /**
+     * Get the value for key as a long.
+     * @param key The key to lookup.
+     * @param def The value to return if the key was not found, or the value was not a long.
+     * @return the long value associated with the key.
+     */
+    public long getLong(String key, long def) {
+        String value = mValues.get(key);
+        if (value != null) {
+            try {
+                return Long.parseLong(value);
+            } catch (NumberFormatException e) {
+                // fallthrough
+            }
+        }
+        return def;
+    }
+
+    /**
+     * Get the value for key as a float.
+     * @param key The key to lookup.
+     * @param def The value to return if the key was not found, or the value was not a float.
+     * @return the float value associated with the key.
+     */
+    public float getFloat(String key, float def) {
+        String value = mValues.get(key);
+        if (value != null) {
+            try {
+                return Float.parseFloat(value);
+            } catch (NumberFormatException e) {
+                // fallthrough
+            }
+        }
+        return def;
+    }
+
+    /**
+     * Get the value for key as a string.
+     * @param key The key to lookup.
+     * @param def The value to return if the key was not found.
+     * @return the string value associated with the key.
+     */
+    public String getString(String key, String def) {
+        String value = mValues.get(key);
+        if (value != null) {
+            return value;
+        }
+        return def;
+    }
+}
diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java
index d2b6533..a865307 100644
--- a/core/java/android/view/Choreographer.java
+++ b/core/java/android/view/Choreographer.java
@@ -22,6 +22,7 @@
 import android.os.Message;
 import android.os.SystemClock;
 import android.os.SystemProperties;
+import android.os.Trace;
 import android.util.Log;
 import android.util.TimeUtils;
 
@@ -160,6 +161,14 @@
     FrameInfo mFrameInfo = new FrameInfo();
 
     /**
+     * Must be kept in sync with CALLBACK_* ints below, used to index into this array.
+     * @hide
+     */
+    private static final String[] CALLBACK_TRACE_TITLES = {
+            "input", "animation", "traversal", "commit"
+    };
+
+    /**
      * Callback type: Input callback.  Runs first.
      * @hide
      */
@@ -584,16 +593,22 @@
             mLastFrameTimeNanos = frameTimeNanos;
         }
 
-        mFrameInfo.markInputHandlingStart();
-        doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos);
+        try {
+            Trace.traceBegin(Trace.TRACE_TAG_VIEW, "Choreographer#doFrame");
 
-        mFrameInfo.markAnimationsStart();
-        doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos);
+            mFrameInfo.markInputHandlingStart();
+            doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos);
 
-        mFrameInfo.markPerformTraversalsStart();
-        doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos);
+            mFrameInfo.markAnimationsStart();
+            doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos);
 
-        doCallbacks(Choreographer.CALLBACK_COMMIT, frameTimeNanos);
+            mFrameInfo.markPerformTraversalsStart();
+            doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos);
+
+            doCallbacks(Choreographer.CALLBACK_COMMIT, frameTimeNanos);
+        } finally {
+            Trace.traceEnd(Trace.TRACE_TAG_VIEW);
+        }
 
         if (DEBUG_FRAMES) {
             final long endNanos = System.nanoTime();
@@ -627,6 +642,7 @@
             // safe by ensuring the commit time is always at least one frame behind.
             if (callbackType == Choreographer.CALLBACK_COMMIT) {
                 final long jitterNanos = now - frameTimeNanos;
+                Trace.traceCounter(Trace.TRACE_TAG_VIEW, "jitterNanos", (int) jitterNanos);
                 if (jitterNanos >= 2 * mFrameIntervalNanos) {
                     final long lastFrameOffset = jitterNanos % mFrameIntervalNanos
                             + mFrameIntervalNanos;
@@ -644,6 +660,7 @@
             }
         }
         try {
+            Trace.traceBegin(Trace.TRACE_TAG_VIEW, CALLBACK_TRACE_TITLES[callbackType]);
             for (CallbackRecord c = callbacks; c != null; c = c.next) {
                 if (DEBUG_FRAMES) {
                     Log.d(TAG, "RunCallback: type=" + callbackType
@@ -661,6 +678,7 @@
                     callbacks = next;
                 } while (callbacks != null);
             }
+            Trace.traceEnd(Trace.TRACE_TAG_VIEW);
         }
     }
 
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index e1e0154..e2f42db 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -1105,12 +1105,7 @@
                 Debug.startMethodTracing("ViewAncestor");
             }
 
-            Trace.traceBegin(Trace.TRACE_TAG_VIEW, "performTraversals");
-            try {
-                performTraversals();
-            } finally {
-                Trace.traceEnd(Trace.TRACE_TAG_VIEW);
-            }
+            performTraversals();
 
             if (mProfile) {
                 Debug.stopMethodTracing();
diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java
index b7d529e..b4ef58a 100644
--- a/core/java/android/webkit/WebViewFactory.java
+++ b/core/java/android/webkit/WebViewFactory.java
@@ -333,8 +333,8 @@
                         newVmSize = Math.max(newVmSize, f.length());
                         continue;
                     }
-                    if (path.contains("!")) {
-                        String[] split = TextUtils.split(path, "!");
+                    if (path.contains("!/")) {
+                        String[] split = TextUtils.split(path, "!/");
                         if (split.length == 2) {
                             try {
                                 ZipFile z = new ZipFile(split[0]);
@@ -384,7 +384,7 @@
                 ZipEntry e = z.getEntry(entry);
                 if (e != null && e.getMethod() == ZipEntry.STORED) {
                     // Return a path formatted for dlopen() load from APK.
-                    return apkPath + "!" + entry;
+                    return apkPath + "!/" + entry;
                 }
             }
         } catch (IOException e) {
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 087db78..07d1fc8 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -4634,7 +4634,7 @@
         @Override
         public void noteWifiBatchedScanStartedLocked(int csph, long elapsedRealtimeMs) {
             int bin = 0;
-            while (csph > 8 && bin < NUM_WIFI_BATCHED_SCAN_BINS) {
+            while (csph > 8 && bin < NUM_WIFI_BATCHED_SCAN_BINS-1) {
                 csph = csph >> 3;
                 bin++;
             }
diff --git a/core/jni/android/graphics/Shader.cpp b/core/jni/android/graphics/Shader.cpp
index d0f7591..ad3a5e2 100644
--- a/core/jni/android/graphics/Shader.cpp
+++ b/core/jni/android/graphics/Shader.cpp
@@ -84,7 +84,11 @@
                                       jint tileModeX, jint tileModeY)
 {
     SkBitmap bitmap;
-    GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);
+    if (jbitmap) {
+        // Only pass a valid SkBitmap object to the constructor if the Bitmap exists. Otherwise,
+        // we'll pass an empty SkBitmap to avoid crashing/excepting for compatibility.
+        GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);
+    }
     SkShader* s = SkShader::CreateBitmapShader(bitmap,
                                         (SkShader::TileMode)tileModeX,
                                         (SkShader::TileMode)tileModeY);
diff --git a/core/jni/android/graphics/SurfaceTexture.cpp b/core/jni/android/graphics/SurfaceTexture.cpp
index 08d61d5..b9e48a0 100644
--- a/core/jni/android/graphics/SurfaceTexture.cpp
+++ b/core/jni/android/graphics/SurfaceTexture.cpp
@@ -49,6 +49,12 @@
 };
 static fields_t fields;
 
+// Get an ID that's unique within this process.
+static int32_t createProcessUniqueId() {
+    static volatile int32_t globalCounter = 0;
+    return android_atomic_inc(&globalCounter);
+}
+
 // ----------------------------------------------------------------------------
 
 static void SurfaceTexture_setSurfaceTexture(JNIEnv* env, jobject thiz,
@@ -253,6 +259,11 @@
                 "Unable to create native SurfaceTexture");
         return;
     }
+    surfaceTexture->setName(String8::format("SurfaceTexture-%d-%d-%d",
+            (isDetached ? 0 : texName),
+            getpid(),
+            createProcessUniqueId()));
+
     SurfaceTexture_setSurfaceTexture(env, thiz, surfaceTexture);
     SurfaceTexture_setProducer(env, thiz, producer);
 
diff --git a/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp b/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
index afdfd8f..5bef653 100644
--- a/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
+++ b/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
@@ -689,6 +689,23 @@
     return NO_ERROR;
 }
 
+static jint LegacyCameraDevice_nativeSetScalingMode(JNIEnv* env, jobject thiz, jobject surface,
+        jint mode) {
+    ALOGV("nativeSetScalingMode");
+    sp<ANativeWindow> anw;
+    if ((anw = getNativeWindow(env, surface)) == NULL) {
+        ALOGE("%s: Could not retrieve native window from surface.", __FUNCTION__);
+        return BAD_VALUE;
+    }
+    status_t err = NO_ERROR;
+    if ((err = native_window_set_scaling_mode(anw.get(), static_cast<int>(mode))) != NO_ERROR) {
+        ALOGE("%s: Unable to set surface scaling mode, error %s (%d)", __FUNCTION__,
+                strerror(-err), err);
+        return err;
+    }
+    return NO_ERROR;
+}
+
 static jint LegacyCameraDevice_nativeGetJpegFooterSize(JNIEnv* env, jobject thiz) {
     ALOGV("nativeGetJpegFooterSize");
     return static_cast<jint>(sizeof(struct camera3_jpeg_blob));
@@ -733,6 +750,9 @@
     { "nativeDetectSurfaceUsageFlags",
     "(Landroid/view/Surface;)I",
     (void *)LegacyCameraDevice_nativeDetectSurfaceUsageFlags },
+    { "nativeSetScalingMode",
+    "(Landroid/view/Surface;I)I",
+    (void *)LegacyCameraDevice_nativeSetScalingMode },
 };
 
 // Get all the required offsets in java class and register native functions
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 5526a3c..e58ac1d 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1182,12 +1182,16 @@
     <permission android:name="android.permission.BIND_TELECOM_CONNECTION_SERVICE"
         android:protectionLevel="system|signature" />
 
-
     <!-- @SystemApi Allows an application to control the in-call experience.
          @hide -->
     <permission android:name="android.permission.CONTROL_INCALL_EXPERIENCE"
         android:protectionLevel="system|signature" />
 
+    <!-- Allows an application to receive STK related commands.
+         @hide -->
+    <permission android:name="android.permission.RECEIVE_STK_COMMANDS"
+        android:protectionLevel="system|signature" />
+
     <!-- ================================== -->
     <!-- Permissions for sdcard interaction -->
     <!-- ================================== -->
@@ -1580,24 +1584,6 @@
     <permission android:name="android.permission.WRITE_APN_SETTINGS"
         android:protectionLevel="signature|system" />
 
-    <!-- Allows an application to allow access the subscribed feeds ContentProvider.
-         @hide
-         @removed
-     -->
-    <permission android:name="android.permission.SUBSCRIBED_FEEDS_READ"
-        android:label="@string/permlab_subscribedFeedsRead"
-        android:description="@string/permdesc_subscribedFeedsRead"
-        android:protectionLevel="normal" />
-
-    <!--
-        @hide
-        @removed
-    -->
-    <permission android:name="android.permission.SUBSCRIBED_FEEDS_WRITE"
-        android:label="@string/permlab_subscribedFeedsWrite"
-        android:description="@string/permdesc_subscribedFeedsWrite"
-        android:protectionLevel="dangerous" />
-
     <!-- Allows applications to change network connectivity state -->
     <permission android:name="android.permission.CHANGE_NETWORK_STATE"
         android:description="@string/permdesc_changeNetworkState"
diff --git a/core/res/res/layout/media_route_controller_dialog.xml b/core/res/res/layout/media_route_controller_dialog.xml
index 78287e0..0bf70da 100644
--- a/core/res/res/layout/media_route_controller_dialog.xml
+++ b/core/res/res/layout/media_route_controller_dialog.xml
@@ -14,47 +14,50 @@
      limitations under the License.
 -->
 
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              android:layout_width="match_parent"
-              android:layout_height="wrap_content"
-              android:orientation="vertical"
-              android:divider="?android:attr/dividerHorizontal"
-              android:showDividers="middle">
-    <!-- Optional volume slider section. -->
-    <LinearLayout android:id="@+id/media_route_volume_layout"
-                  android:layout_width="match_parent"
-                  android:layout_height="64dp"
-                  android:gravity="center_vertical"
-                  android:padding="8dp"
-                  android:visibility="gone">
-        <ImageView android:layout_width="48dp"
-                   android:layout_height="48dp"
-                   android:src="@drawable/ic_audio_vol"
-                   android:gravity="center"
-                   android:scaleType="center" />
-        <SeekBar android:id="@+id/media_route_volume_slider"
-                 android:layout_width="0dp"
-                 android:layout_height="wrap_content"
-                 android:layout_weight="1"
-                 android:layout_marginLeft="8dp"
-                 android:layout_marginRight="8dp" />
-    </LinearLayout>
-
-    <!-- Optional content view section. -->
-    <FrameLayout android:id="@+id/media_route_control_frame"
-                 android:layout_width="match_parent"
-                 android:layout_height="wrap_content"
-                 android:visibility="gone" />
-
-    <!-- Disconnect button. -->
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
     <LinearLayout android:layout_width="match_parent"
                   android:layout_height="wrap_content"
-                  style="?attr/buttonBarStyle">
-        <Button android:id="@+id/media_route_disconnect_button"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                style="?attr/buttonBarButtonStyle"
-                android:gravity="center"
-                android:text="@string/media_route_controller_disconnect" />
+                  android:orientation="vertical"
+                  android:divider="?android:attr/dividerHorizontal"
+                  android:showDividers="middle">
+        <!-- Optional volume slider section. -->
+        <LinearLayout android:id="@+id/media_route_volume_layout"
+                      android:layout_width="match_parent"
+                      android:layout_height="64dp"
+                      android:gravity="center_vertical"
+                      android:padding="8dp"
+                      android:visibility="gone">
+            <ImageView android:layout_width="48dp"
+                       android:layout_height="48dp"
+                       android:src="@drawable/ic_audio_vol"
+                       android:gravity="center"
+                       android:scaleType="center" />
+            <SeekBar android:id="@+id/media_route_volume_slider"
+                     android:layout_width="0dp"
+                     android:layout_height="wrap_content"
+                     android:layout_weight="1"
+                     android:layout_marginLeft="8dp"
+                     android:layout_marginRight="8dp" />
+        </LinearLayout>
+
+        <!-- Optional content view section. -->
+        <FrameLayout android:id="@+id/media_route_control_frame"
+                     android:layout_width="match_parent"
+                     android:layout_height="wrap_content"
+                     android:visibility="gone" />
+
+        <!-- Disconnect button. -->
+        <LinearLayout android:layout_width="match_parent"
+                      android:layout_height="wrap_content"
+                      style="?attr/buttonBarStyle">
+            <Button android:id="@+id/media_route_disconnect_button"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    style="?attr/buttonBarButtonStyle"
+                    android:gravity="center"
+                    android:text="@string/media_route_controller_disconnect" />
+        </LinearLayout>
     </LinearLayout>
-</LinearLayout>
+</ScrollView>
\ No newline at end of file
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 9ad4be2..f6af19c 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1281,12 +1281,6 @@
     <string name="permdesc_readSyncStats">Allows an app to read the sync stats for an account, including the history of sync events and how much data is synced. </string>
 
     <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
-    <string name="permlab_subscribedFeedsWrite">write subscribed feeds</string>
-    <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
-    <string name="permdesc_subscribedFeedsWrite">Allows the app to modify
-        your currently synced feeds. Malicious apps may change your synced feeds.</string>
-
-    <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
     <string name="permlab_readDictionary">read terms you added to the dictionary</string>
     <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
     <string name="permdesc_readDictionary">Allows the app to read all words,
diff --git a/data/fonts/Android.mk b/data/fonts/Android.mk
index 6d8d81f..3181017 100644
--- a/data/fonts/Android.mk
+++ b/data/fonts/Android.mk
@@ -17,8 +17,8 @@
 
 LOCAL_PATH := $(call my-dir)
 
-# Use full Noto Sans Japanese font on extended footprint
-ifeq ($(EXTENDED_FONT_FOOTPRINT),true)
+# Use full Noto Sans Japanese font on non-smaller footprints
+ifneq ($(SMALLER_FONT_FOOTPRINT),true)
 FONT_NOTOSANS_JP_FULL := true
 endif
 
@@ -38,7 +38,7 @@
 endef
 
 ##########################################
-# The following fonts are distributed as symlink only.
+# The following fonts are just symlinks, for backward compatibility.
 ##########################################
 $(eval $(call create-font-symlink,DroidSans.ttf,Roboto-Regular.ttf))
 $(eval $(call create-font-symlink,DroidSans-Bold.ttf,Roboto-Bold.ttf))
@@ -54,7 +54,7 @@
 ################################
 # Do not include Motoya on space-constrained devices
 ifneq ($(SMALLER_FONT_FOOTPRINT),true)
-# Do not include Motoya if we are including full NotoSans
+# Do not include Motoya if we are including Noto Sans Japanese
 ifneq ($(FONT_NOTOSANS_JP_FULL),true)
 
 include $(CLEAR_VARS)
@@ -82,26 +82,19 @@
 extra_font_files :=
 
 ################################
-# Include DroidSansFallback only on non-EXTENDED_FONT_FOOTPRINT builds
-ifneq ($(EXTENDED_FONT_FOOTPRINT),true)
-
-# Include a subset of DroidSansFallback on SMALLER_FONT_FOOTPRINT build
+# Include the DroidSansFallback subset on SMALLER_FONT_FOOTPRINT build
 ifeq ($(SMALLER_FONT_FOOTPRINT),true)
-droidsans_fallback_src := DroidSansFallback.ttf
-else  # !SMALLER_FONT_FOOTPRINT
-droidsans_fallback_src := DroidSansFallbackFull.ttf
-endif  # SMALLER_FONT_FOOTPRINT
 
 include $(CLEAR_VARS)
 LOCAL_MODULE := DroidSansFallback.ttf
-LOCAL_SRC_FILES := $(droidsans_fallback_src)
+LOCAL_SRC_FILES := $(LOCAL_MODULE)
 LOCAL_MODULE_CLASS := ETC
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_PATH := $(TARGET_OUT)/fonts
 include $(BUILD_PREBUILT)
 droidsans_fallback_src :=
 
-endif  # !EXTENDED_FONT_FOOTPRINT
+endif  # SMALLER_FONT_FOOTPRINT
 
 ################################
 # Build the rest of font files as prebuilt.
diff --git a/docs/html/guide/faq/commontasks.jd b/docs/html/guide/faq/commontasks.jd
deleted file mode 100644
index 2943aef..0000000
--- a/docs/html/guide/faq/commontasks.jd
+++ /dev/null
@@ -1,826 +0,0 @@
-page.title=Common Tasks and How to Do Them in Android
-excludeFromSuggestions=true
-@jd:body
-
-<ul>
-    <li><a href="#neweclipseandroidproject">Creating an Android Application using
-    the Eclipse plugin</a></li>
-    <li><a href="#newandroidprojectnoeclipse">Creating an Android Application without
-    the Eclipse plugin</a></li>
-    <li><a href="#addexternallibrary">Adding an External Library (.jar) using Eclipse</a></li>
-    <li><a href="#implementcallbacks">Implementing Activity callbacks</a> (Android
-        calls your activity at various key moments in its life cycle. You must know
-        how to handle each of these to draw your screen, initialize class members,
-        and acquire data.)</li>
-    <li><a href="#opennewscreen">Opening a new screen</a></li>
-    <li><a href="#listening">Listening for button clicks </a></li>
-    <li><a href="#configurewindowproperties">Configuring general window properties </a></li>
-    <li><a href="#localhostalias">Referring to localhost from the emulated environment</a></li>
-    <li><a href="#appstate">Storing and retrieving state</a></li>
-    <li><a href="{@docRoot}guide/topics/data/data-storage.html#preferences">Storing and retrieving preferences</a></li>
-    <li><a href="#storingandretrieving">Storing and retrieving larger or more complex
-            persistent data</a> (files and data) </li>
-    <li><a href="#playback">Playing audio, video, still, or other media files</a></li>
-    <li><a href="#broadcastreceivers">Listening for and broadcasting global messages
-        and setting alarms</a></li>
-    <li><a href="#alerts">Displaying alerts </a></li>
-    <li><a href="#progressbar">Displaying a progress bar</a> </li>
-    <li><a href="#addmenuitems">Adding items to the screen menu</a> </li>
-    <li><a href="#webpage">Display a web page</a> </li>
-    <li><a href="#binding">Binding to data</a></li>
-    <li><a href="#handle">Getting a Handle to a Screen Element</a></li>
-    <li><a href="#captureimages">Capture images from the phone camera </a></li>
-    <li><a href="#threading">Handling expensive operations in the UI thread</a></li>
-    <li><a href="#selectingtext">Selecting, highlighting, or styling portions of
-            text</a></li>
-    <li><a href="#querymap">Utilizing attributes in a Map query</a></li>
-    <li><a href="#filelist">List of files for an Android application</a></li>
-    <li><a href="#logging">Print messages to a log file</a></li>
-</ul>
-<p>The ApiDemos sample application includes many, many examples of common
-tasks and UI features. See the code inside
-<code>&lt;sdk&gt;samples/ApiDemos</code> and the other sample applications
-under the <code>samples/</code> folder in the SDK.</p>
-
-
-<h2 id="neweclipseandroidproject">Creating an Android Application using the Eclipse Plugin</h2>
-
-<p>Using the Android Eclipse plugin is the fastest and easiest way
-to start creating a new Android application. The plugin automatically generates
-the correct project structure for your application, and keeps the resources
-compiled for you automatically.</p>
-
-<p>It is still a good idea to know what is going on though. Take a look at <a
-href="{@docRoot}guide/topics/fundamentals.html">Application Fundamentals</a> 
-to understand the basics of how an Android application works.</p> 
-
-<p>You should also take a look at the ApiDemos application and the other sample
-applications included in the SDK, in the <code>&lt;sdk&gt;/samples/</code>
-folder in the SDK.</p>
-
-<p>Finally, a great way to started with Android development in Eclipse is to
-follow both the <a href="{@docRoot}resources/tutorials/hello-world.html">Hello,
-World</a> and <a
-href="{@docRoot}training/notepad/index.html">Notepad</a> code
-tutorials. In particular, the start of the Hello Android tutorial is an
-excellent introduction to creating a new Android application in Eclipse.</p>
-
-<h2 id="newandroidprojectnoeclipse">Creating an Android Application without the Eclipse Plugin</h2>
-
-<p>This topic describes the manual steps in creating an Android application.
-Before reading this, you should read <a
-href="{@docRoot}guide/topics/fundamentals.html">Application Fundamentals</a> 
-to understand the basics of how an Android application works. You might also 
-want to look at the sample code included with the Android SDK, in the 
-<code>&lt;sdk&gt;/samples/</code> directory. </p>
-
-<p>Here is a list of the basic steps in building an application.</p>
-<ol>
-    <li><strong>Create your required resource files</strong> &nbsp;&nbsp;This includes
-        the AndroidManifest.xml global description file, string files that your application
-        needs, and layout files describing your user interface. A full list of optional
-        and required files and syntax details for each is given in <a href="#filelist">File
-        List for an Android Application</a>. </li>
-    <li><strong>Design your user interface</strong> &nbsp;&nbsp;See <a
-    href="{@docRoot}guide/topics/ui/index.html">User Interface</a> for
-    details on elements of the Android screen. </li>
-    <li><strong>Implement your Activity </strong>(this page)<strong>&nbsp;&nbsp; </strong> You
-        will create one class/file for each screen in your application. Screens will
-        inherit from an {@link android.app android.app} class, typically {@link android.app.Activity
-        android.app.Activity} for basic screens, {@link android.app.ListActivity
-        android.app.ListActivity} for list screens, or {@link android.app.Dialog
-        android.app.Dialog} for dialog boxes. You will implement the required callbacks
-        that let you draw your screen, query data, and commit changes, and also perform
-        any required tasks such as opening additional screens or reading data from
-        the device. Common tasks, such as opening a new screen or reading data from
-        the device, are described below.
-        The list of files you'll need for your application are described in <a href="#filelist">List
-        of Files for an Android Application</a>. </li>
-    <li><strong><a href="{@docRoot}guide/developing/building/building-cmdline.html">Build and install your
-                package</a>.</strong> The Android SDK has some nice tools for generating
-                projects and debugging code. </li>
-</ol>
-
-<h2 id="addexternallibrary">Adding an External Library (.jar) using Eclipse</h2>
-<p>
-You can use a third party JAR in your application by adding it to your Eclipse project as follows:
-</p>
-<ol>
-<li>
-In the <strong>Package Explorer</strong> panel, right-click on your project and select <strong>Properties</strong>.
-<li>
-Select <strong>Java Build Path</strong>, then the tab <strong>Libraries</strong>.
-<li>
-Press the <strong>Add External JARs...</strong> button and select the JAR file.
-</ol>
-<p>
-Alternatively, if you want to include third party JARs with your package, create a new directory for them within your project and select <strong>Add Library...</strong> instead.</p>
-<p>
-It is not necessary to put external JARs in the assets folder.
-</p>
-
-<a name="implementcallbacks" id="implementcallbacks"></a>
-<h2>Implementing Activity Callbacks</h2>
-<p>Android calls a number of callbacks to let you draw your screen, store data before
-    pausing, and refresh data after closing. You must implement at least some of
-    these methods. Read the <a
-href="{@docRoot}guide/topics/fundamentals/activities.html#Lifecycle">Activities</a>
-    document to learn when and in what order these methods 
-    are called. Here are some of the standard types of screen classes that Android provides:</p>
-<ul>
-    <li>{@link android.app.Activity android.app.Activity} - This is a standard screen,
-        with no specialization.</li>
-    <li>{@link android.app.ListActivity android.app.ListActivity} - This is a screen
-        that is used to display a list of something. It hosts a ListView object,
-        and exposes methods to let you identify the selected item, receive callbacks
-        when the selected item changes, and perform other list-related actions. </li>
-    <li>{@link android.app.Dialog android.app.Dialog} - This is a small, popup dialog-style
-        window that isn't intended to remain in the history stack. (It is not resizeable
-        or moveable by the user.)</li>
-</ul>
-
-<a name="opennewscreen" id="opennewscreen"></a><h2>Opening a New Screen</h2>
-<p>Your Activity will often need to open another Activity screen as it progresses.
-    This new screen can be part of the same application or part of another application,
-    the new screen can be floating or full screen, it can return a result, and you
-    can decide whether to close this screen and remove it from the history stack
-    when you are done with it, or to keep the screen open in history. These next
-    sections describe all these options. </p>
-<h3>Floating or full?<a name="floatingorfull" id="floatingorfull"></a></h3>
-<p>When you open a new screen you can decide whether to make it transparent or floating,
-    or full-screen. The choice of new screen affects the event sequence of events
-    in the old screen (if the new screen obscures the old screen, a different
-    series of events is called in the old screen). See the <a
-    href="{@docRoot}guide/topics/fundamentals/activities.html#Lifecycle">Activities</a> document for
-details. </p> 
-<p>Transparent or floating windows are implemented in three
-    standard ways: </p>
-<ul>
-    <li>Create an {@link android.app.Dialog app.Dialog} class </li>
-    <li>Create an {@link android.app.AlertDialog app.AlertDialog} class </li>
-    <li>Set the {@link android.R.style#Theme_Dialog} <em>theme</em> attribute to <code>&#64;android:style/Theme.Dialog</code>
-        in your AndroidManifest.xml file. For example:    
-    <pre>&lt;activity class=&quot;AddRssItem&quot; android:label=&quot;Add an item&quot; android:theme=&quot;&#064;android:style/Theme.Dialog&quot;/&gt;</pre></li>
-</ul>
-
-<p>Calling startActivity() or startActivityForResult() will open a new screen in whatever
-    way it defines itself (if it uses a floating theme it will be floating,
-    otherwise it will be full screen). </p>
-<h3>Opening a Screen </h3>
-<p>When you want to open a new screen, you can either explicitly specify the activity
-    class to open, or you can let the operating system decide which screen to open,
-    based upon the data and various parameters you pass in. A screen is opened by
-    calling {@link android.app.Activity#startActivity(android.content.Intent) startActivity}
-    and passing in an {@link android.content.Intent Intent} object, which specifies
-    the criteria for the handling screen. To specify a specific screen, call Intent.setClass
-    or setClassName with the exact activity class to open. Otherwise, set a variety
-    of values and data, and let Android decide which screen is appropriate to open.
-    Android will find one or zero Activities that match the specified requirements;
-    it will never open multiple activities for a single request. More information
-    on Intents and how Android resolves them to a specific class is given in the
-    {@link android.content.Intent Intent} topic. </p>
-<a name="intentexamples" id="intentexamples"></a><h3>Some Intent examples </h3>
-<p>The following snippet loads the com.android.samples.Animation1 class, and
-    passes it some arbitrary data.:</p>
-<pre>Intent myIntent = new Intent();
-myIntent.setClassName(&quot;com.android.samples&quot;, &quot;com.android.samples.Animation1&quot;);
-myIntent.putExtra(&quot;com.android.samples.SpecialValue&quot;, &quot;Hello, Joe!&quot;); // key/value pair, where key needs current package prefix.
-startActivity(myIntent);    </pre>
-<p>The next snippet requests that a Web page be opened by specifying the VIEW action,
-    and a URI data string starting with &quot;http://&quot; schema:</p>
-<pre>Intent myIntent = new Intent(Intent.VIEW_ACTION, Uri.parse(&quot;http://www.google.com&quot;));</pre>
-<p>Here is the intent filter from the AndroidManifest.xml file for com.android.browser:</p>
-<pre>&lt;intent-filter&gt;
-    &lt;action android:name=&quot;android.intent.action.VIEW&quot; /&gt;
-    &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; /&gt;
-    &lt;scheme android:name=&quot;http&quot; /&gt;
-    &lt;scheme android:name=&quot;https&quot; /&gt;
-    &lt;scheme android:name=&quot;file&quot; /&gt;
-&lt;/intent-filter&gt; </pre>
-<p>Android defines a number of standard values, for instance the action constants
-    defined by {@link android.content.Intent}. You can define custom values, but
-    both the caller and handler must use them. See the &lt;intent-filter&gt;
-    tag description in <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml
-    File</a> for more information on the manifest syntax for the handling
-    application. </p>
-<a name="returningaresult" id="returningaresult"></a><h3>Returning a Result from a Screen</h3>
-<p>A window can return a result after it closes. This result will be passed back
-    into the calling Activity's {@link android.app.Activity#onActivityResult(int,int,android.content.Intent)
-    onActivityResult()} method, which can supply an Intent containing arbitrary data, along with
-    the request code passed to startActivityForResult(). Note that you must call the {@link
-    android.app.Activity#startActivityForResult(android.content.Intent,int) startActivityForResult()}
-    method that accepts a request code parameter to get this callback. The following
-    code demonstrates opening a new screen and retrieving a result. </p>
-<pre>// Open the new screen.
-public void onClick(View v){
-    // Start the activity whose result we want to retrieve.  The
-    // result will come back with request code GET_CODE.
-    Intent intent = new Intent(this, com.example.app.ChooseYourBoxer.class);
-    startActivityForResult(intent, CHOOSE_FIGHTER);
-}
-
-// Listen for results.
-protected void onActivityResult(int requestCode, int resultCode, Intent data){
-    // See which child activity is calling us back.
-    switch (requestCode) {
-        case CHOOSE_FIGHTER:
-            // This is the standard resultCode that is sent back if the
-            // activity crashed or didn't doesn't supply an explicit result.
-            if (resultCode == RESULT_CANCELED){
-                myMessageboxFunction("Fight cancelled");
-            } 
-            else {
-                myFightFunction(data);
-            }
-        default:
-            break;
-    }
-}
-
-// Class SentResult
-// Temporary screen to let the user choose something.
-    private OnClickListener mLincolnListener = new OnClickListener(){
-        public void onClick(View v) {
-            Bundle stats = new Bundle();
-            stats.putString("height","6\'4\""); 
-            stats.putString("weight", "190 lbs");
-            stats.putString("reach", "74\"");
-            setResult(RESULT_OK, "Lincoln", stats);
-            finish();
-        }
-    };
-
-    private OnClickListener mWashingtonListener = new OnClickListener() {
-        public void onClick(View v){
-            Bundle stats = new Bundle();
-            stats.putString("height","6\'2\""); 
-            stats.putString("weight", "190 lbs");
-            stats.putString("reach", "73\"");
-            setResult(RESULT_OK, "Washington", stats);
-            finish();
-        }
-    };
-	</pre>
-<h3>Lifetime of the new screen </h3>
-<p>An activity can remove itself from the history stack by calling {@link android.app.Activity#finish()
-    Activity.finish()} on itself, or the activity that opened the screen can call
-    {@link android.app.Activity#finishActivity(int) Activity.finishActivity()}
-    on any screens that it opens to close them. </p>
-<a name="listening" id="listening"></a><h2>Listening for Button Clicks</h2>
-<p>Button click and other UI event capturing are covered in <a
-href="{@docRoot}guide/topics/ui/ui-events.html">Input Events</a>.</p>
-<a name="configurewindowproperties" id="configurewindowproperties"></a><h2>Configuring General Window Properties</h2>
-<p>You can set a number of general window properties, such as whether to display
-    a title, whether the window is floating, and whether it displays an icon, by
-    calling methods on the {@link android.view.Window Window} member
-    of the underlying View object for the window. Examples include calling {@link
-    android.app.Activity#getWindow() getWindow().requestFeature()} (or the convenience
-    method {@link android.app.Activity#requestWindowFeature(int) requestWindowFeature(<em>some_feature</em>)})
-    to hide the title. Here is an example of hiding the title bar:</p>
-<pre>//Hide the title bar
-requestWindowFeature(Window.FEATURE_NO_TITLE);
-</pre>
-<p>A better way to achieve the same end is to specify a theme in your Android
-Manifest file:</p>
-<pre>&lt;application android:icon="@drawable/icon" android:theme="@android:style/Theme.NoTitleBar"&gt;
-</pre>
-<p>This is preferable because it tells the system not to show a title bar while
-your application is starting up. With the explicit method call, your application
-will have a title bar visible to the user until <code>onCreate</code> runs.</p>
-<p>(Note that this can be applied to either the <code>&lt;application&gt;</code>
-tag or to individual <code>&lt;activity&gt;</code> tags.)</p>
-<p class="caution"><strong>Caution:</strong> This theme will also hide the Action Bar on Android
-3.0 and higher. If you want to keep the Action Bar, but hide the title bar, see how you can <a
-href="{@docRoot}guide/topics/ui/themes.html#SelectATheme">select a theme based on platform
-version</a>.</p>
-<a name="localhostalias" id="localhostalias"></a><h2>Referring to localhost from the emulated
-environment</h2>
-<p>
-If you need to refer to your host computer's <em>localhost</em>, such as when you 
-want the emulator client to contact a server running on the same host, use the alias 
-<code>10.0.2.2</code> to refer to the host computer's loopback interface. 
-From the emulator's perspective, localhost (<code>127.0.0.1</code>) refers to its own 
-loopback interface.
-</p>
-<a name="appstate" id="appstate"></a><h2>Storing and Retrieving State</h2>
-<p>If your application is dumped from memory because of space concerns, it will lose
-    all user interface state information such as checkbox state and text box values
-    as well as class member values. Android calls {@link android.app.Activity#onSaveInstanceState(android.os.Bundle)
-    Activity.onSaveInstanceState} before it pauses the application. This method hands in a {@link
-    android.os.Bundle Bundle} that can be used to store name/value pairs that will
-    persist and be handed back to the application even if it is dropped from memory.
-    Android will pass this Bundle back to you when it calls {@link android.app.Activity#onCreate(android.os.Bundle)
-    onCreate()}. This Bundle only exists while the application is still in the history
-    stack (whether or not it has been removed from memory) and will be lost when
-    the application is finalized. See the topics for {@link android.app.Activity#onSaveInstanceState} and
-    {@link android.app.Activity#onCreate} for
-    examples of storing and retrieving state.</p>
-<p>Read more about the lifecycle of an activity in <a
-href="{@docRoot}guide/topics/fundamentals/activities.html">Activities</a> document.</p>
-<h3>Storing and Retrieving Larger or More Complex Persistent Data<a name="storingandretrieving" id="storingandretrieving"></a></h3>
-<p>Your application can store files or complex collection objects, and reserve them
-    for private use by itself or other activities in the application, or it can expose
-    its data to all other applications on the device. See <a href="{@docRoot}guide/topics/data/data-storage.html">Storing,
-    Retrieving, and Exposing Data</a> to learn how to store and retrieve private data,
-    how to store and retrieve common data from the device, and how to expose your
-    private data to other applications.</p>
-<a name="playback" id="playback"></a><h2>Playing Media Files</h2>
-<p>Please see the document <a href="{@docRoot}guide/topics/media/index.html">Audio and Video</a> for more details.</p>
-<a name="broadcastreceivers" id="broadcastreceivers"></a><h2>Listening For and Broadcasting Global Messages, and Setting Alarms</h2>
-<p>You can create a listening class that can be notified or even instantiated whenever
-    a specific type of system message is sent. 
-</p>
-<p>The listening classes, called broadcast receivers, extend {@link android.content.BroadcastReceiver
-    BroadcastReceiver}. If you want Android to instantiate the object whenever an appropriate
-    intent notification is sent, define the receiver with a <code>&lt;receiver&gt;</code> element
-    in the AndroidManifext.xml file. If the caller is expected to instantiate the
-    object in preparation to receive a message, this is not required. The receiver
-    will get a call to their {@link android.content.BroadcastReceiver#onReceive(android.content.Context,android.content.Intent)
-    BroadcastReceiver.onReceive()} method. A receiver can define an <code>&lt;intent-filter&gt;</code> tag
-    that describes the types of messages it will receive. Just as Android's IntentResolver
-    will look for appropriate Activity matches for a startActivity() call, it will
-    look for any matching Receivers (but it will send the message to all matching
-    receivers, not to the &quot;best&quot; match). </p>
-<p>To send a notification, the caller creates an {@link android.content.Intent Intent}
-    object and calls {@link android.app.Activity#sendBroadcast(android.content.Intent)
-    Context.sendBroadcast()} with that Intent. Multiple recipients can receive
-    the same message. You can broadcast an Intent message to an intent receiver in
-    any application, not only your own. If the receiving class is not registered
-    using <code>&lt;receiver&gt;</code> in its manifest, you can dynamically instantiate
-    and register a receiver by calling {@link android.content.Context#registerReceiver(android.content.BroadcastReceiver,android.content.IntentFilter)
-    Context.registerReceiver()}. </p>
-<p>Receivers can include intent filters to specify what kinds of intents they are
-    listening for. Alternatively, if you expect a single known caller to contact
-    a single known receiver, the receiver does not specify an intent filter, and
-    the caller specifies the receiver's class name in the Intent by calling {@link
-    android.content.Intent#setClassName(java.lang.String, java.lang.String) Intent.setClassName()}
-    with the recipient's class name. The recipient receives a {@link android.content.Context
-    Context} object that refers to its own package, not to the package of the sender.</p>
-<p><em><strong>Note:</strong></em>&nbsp;&nbsp;&nbsp;If a receiver or broadcaster
-    enforces permissions, your application might need to request permission
-    to send or receive messages from that object. You can request permission by using
-    the &lt;uses-permission&gt; tag in the manifest. </p>
-<p>Here is a code snippet of a sender and receiver. This example does not demonstrate
-    registering receivers dynamically. For a full code example, see the AlarmService
-    class in the ApiDemos project.</p>
-<h3>Sending the message</h3>
-<pre>// We are sending this to a specific recipient, so we will
-// only specify the recipient class name. 
-Intent intent = new Intent(this, AlarmReceiver.class);
-intent.putExtra(&quot;message&quot;,&quot;Wake up.&quot;);
-sendBroadcast(intent);
-</pre>
-<h3>Receiving the message</h3>
-<p><strong>Receiver AndroidManifest.xml </strong>(because there is no intent filter
-    child, this class will only receive a broadcast when the receiver class is specified
-    by name, as is done in this example):</p>
-<pre>
-&lt;receiver class=".AlarmReceiver" /&gt;</pre>
-<p><strong>Receiver Java code: </strong></p>
-<pre>
-public class AlarmReceiver extends BroadcastReceiver{
-    // Display an alert that we've received a message.    
-    &#064;Override 
-    public void onReceive(Context context, Intent intent){
-	    // Send a text notification to the screen.
-        NotificationManager nm = (NotificationManager)
-        context.getSystemService(Context.NOTIFICATION_SERVICE);
-        nm.notifyWithText(R.id.alarm,
-                          &quot;Alarm!!!&quot;,
-                          NotificationManager.LENGTH_SHORT,
-                          null);
-   }
-}   </pre>
-<h3>Other system messages</h3>
-<p>You can listen for other system messages sent by Android as well, such as USB
-    connection/removal messages, SMS arrival messages, and timezone changes. See
-    {@link android.content.Intent} for a list of broadcast messages to listen for.
-    Messages are marked &quot;Broadcast Action&quot; in the documentation. </p>
-<h3>Listening for phone events<a name="phoneevents" id="phoneevents"></a></h3>
-<p>The {@link android.telephony android.telephony} package overview page describes how to
-    register to listen for phone events. </p>
-<a name="alarms" id="alarms"></a><h3>Setting Alarms </h3>
-<p>Android provides an {@link android.app.AlarmManager AlarmManager} service that
-    will let you specify an Intent to send at a designated time. This intent is typically
-    used to start an application at a preset time. (Note: If you want to send
-    a notification to a sleeping or running application, use {@link android.os.Handler
-    Handler} instead.)</p>
-<a name="alerts" id="alerts"></a><h2>Displaying Alerts</h2>
-<p>There are two major kinds of alerts that you may display to the user:
-(1) Normal alerts are displayed in response to a user action, such as
-trying to perform an action that is not allowed.  (2) Out-of-band alerts,
-called notifications, are
-displayed as a result of something happening in the background, such as the
-user receiving new e-mail.</p>
-
-<a name="dialogsandalerts" id="dialogsandalerts"></a><h3>Normal Alerts</h3>
-
-<p>Android provides a number of ways for you to show popup notifications to your
-    user as they interact with your application. </p>
-<table width="100%" border="1">
-    <tr>
-        <th scope="col">Class</th>
-        <th scope="col">Description</th>
-    </tr>
-    <tr>
-        <td>{@link android.app.Dialog app.Dialog}</td>
-        <td>A generic floating dialog box with a layout that you design. </td>
-    </tr>
-    <tr>
-        <td><p>{@link android.app.AlertDialog app.AlertDialog}</p></td>
-        <td>A popup alert dialog with two buttons (typically OK and Cancel) that
-            take callback handlers. See the section after this table for more details. </td>
-    </tr>
-    <tr>
-        <td>{@link android.app.ProgressDialog ProgressDialog} </td>
-        <td>A dialog box used to indicate progress of an operation with a known progress
-            value or an indeterminate length (setProgress(bool)). See <strong>Views</strong> &gt; <strong>Progress Bar</strong> in
-            ApiDemos for examples. </td>
-    </tr>
-    <tr>
-        <td>Activity</td>
-        <td>By setting the theme of an activity to
-            {@link android.R.style#Theme_Dialog 
-            android:theme=&quot;&#064;android:style/Theme.Dialog&quot;}, 
-            your activity will take on
-            the appearance of a normal dialog, floating on top of whatever was
-            underneath it.  You usually set the theme through the
-            {@link android.R.attr#theme android:theme} attribute in your AndroidManifest.xml.
-            The advantage of this
-            over Dialog and AlertDialog is that Application has a much better managed
-            life cycle than dialogs: if a dialog goes to the background and is killed,
-            you cannot recapture state, whereas Application exposes a {@link android.os.Bundle
-            Bundle} of saved values in <code>onCreate()</code> to help you maintain state.</td>
-    </tr>
-</table>
-<h3>AlertDialog</h3>
-<p>This is a basic warning dialog box that lets you configure a message, button text,
-    and callback. You can create one by calling using the {@link 
-    android.app.AlertDialog.Builder} class, as shown here. </p>
-<pre>private Handler mHandler = new Handler() {
-    public void handleMessage(Message msg) {
-        switch (msg.what) {
-            case ACCEPT_CALL:
-            answer(msg.obj);
-            break;
-    
-            case BOUNCE_TO_VOICEMAIL:
-            voicemail(msg.obj);
-            break;
-    
-        }
-    }
-};
-
-
-private void IncomingMotherInlawCall(Connection c) {
-    String Text;
-    
-    // &quot;Answer&quot; callback.
-    Message acceptMsg = Message.obtain();
-    acceptMsg.target = mHandler;
-    acceptMsg.what = ACCEPT_CALL;
-    acceptMsg.obj = c.getCall();
-    
-    // &quot;Cancel&quot; callback.
-    final Message rejectMsg = Message.obtain();
-    rejectMsg.target = mHandler;
-    rejectMsg.what = BOUNCE_TO_VOICEMAIL;
-    rejectMsg.obj = c.getCall();
-
-    new AlertDialog.Builder(this)
-      .setMessage("Phyllis is calling")
-      .setPositiveButton("Answer", acceptMsg)
-      .setOnCanceListener(new OnCancelListener() {
-        public void onCancel(DialogInterface dialog) {
-          rejectMsg.sendToTarget();
-        }});
-      .show();
-}    </pre>
-
-<h3>Notifications</h3>
-
-<p>Out-of-band alerts should always be displayed using the
-{@link android.app.NotificationManager}, which allows you to tell the user
-about something they may be interested in without disrupting what they are
-currently doing.  A notification can be anything from a brief pop-up box
-informing the user of the new information, through displaying a persistent
-icon in the status bar, to vibrating, playing sounds, or flashing lights to
-get the user's attention.  In all cases, the user must explicitly shift their
-focus to the notification before they can interact with it.</p>
-
-<p>The following code demonstrates using NotificationManager to display a basic text
-    popup when a new SMS message arrives in a listening service, and provides the
-    current message count. You can see several more examples in the ApiDemos application,
-    under app/ (named <em>notification</em>*.java).</p>
-<pre>static void setNewMessageIndicator(Context context, int messageCount){
-   // Get the static global NotificationManager object.
-   NotificationManager nm = NotificationManager.getDefault();</p>
-
-   // If we're being called because a new message has been received, 
-   // then display an icon and a count. Otherwise, delete the persistent
-   // message.
-   if (messageCount &gt; 0) {
-      nm.notifyWithText(myApp.NOTIFICATION_GUID,      // ID for this notification.
-                messageCount + &quot; new message&quot; + messageCount &gt; 1 ? &quot;s&quot;:&quot;&quot;, // Text to display.
-                NotificationManager.LENGTH_SHORT); // Show it for a short time only.
-   }
-}</pre>
-<p>To display a notification in the status bar and have it launch an intent when
-    the user selects it (such as the new text message notification does), call {@link
-    android.app.NotificationManager#notify(int, android.app.Notification) NotificationManager.notify()},
-    and pass in vibration patterns, status bar icons, or Intents to associate with
-    the notification. </p>
-<a name="progressbar" id="progressbar"></a><h2>Displaying a Progress Bar</h2>
-<p>An activity can display a progress bar to notify the user that something is happening.
-    To display a progress bar in a screen, call {@link android.app.Activity#requestWindowFeature(int)
-    Activity.requestWindowFeature(Window.FEATURE_PROGRESS)}. To set the value
-    of the progress bar, call {@link android.view.Window#setFeatureInt(int,int)
-    Activity.getWindow().setFeatureInt(Window.FEATURE_PROGRESS, <em>level</em>)}.
-    Progress bar values are from 0 to 9,999, or set the value to 10,000 to make the
-    progress bar invisible. </p>
-<p>You can also use the {@link android.app.ProgressDialog ProgressDialog} class,
-    which enables a  dialog box with an embedded progress bar to send a &quot;I'm working
-    on it&quot; notification to the user. </p>
-<a name="addmenuitems" id="addmenuitems"></a><h2>Adding Items to the Screen Menu</h2>
-<p>See <a href="{@docRoot}guide/topics/ui/menus.html">Menus</a>.</p>
-
-<a name="webpage" id="webpage"></a><h2>Display a Web Page</h2>
-<p>Use the {@link android.webkit.WebView webkit.WebView} object. </p>
-<a name="binding" id="binding"></a><h2>Binding to Data</h2>
-<p>You can bind a ListView to a set of underlying data by using a shim class called
-    {@link android.widget.ListAdapter ListAdapter} (or a subclass). ListAdapter subclasses
-    bind to a variety of data sources, and expose a common set of methods such as
-    getItem() and getView(), and uses them to pick View items to display in its list.
-    You can extend ListAdapter and override getView() to create your own custom list
-    items. There are essentially only two steps you need to perform to bind to data: </p>
-<ol>
-    <li>Create a ListAdapter object and specify its data source</li>
-    <li>Give the ListAdapter to your ListView object.</li>
-</ol>
-<p>That's it!</p>
-<p>Here's an example of binding a ListActivity screen to the results from a cursor
-    query. (Note that the setListAdapter() method shown is a convenience method that
-    gets the page's ListView object and calls setAdapter() on it.)</p>
-<pre>// Run a query and get a Cursor pointing to the results.
-Cursor c = People.query(this.getContentResolver(), null);
-startManagingCursor(c);
-
-// Create the ListAdapter. A SimpleCursorAdapter lets you specify two interesting things:
-// an XML template for your list item, and
-// The column to map to a specific item, by ID, in your template.
-ListAdapter adapter = new SimpleCursorAdapter(this,  
-                android.R.layout.simple_list_item_1,  // Use a template that displays a text view
-                c,                                    // Give the cursor to the list adapter
-                new String[] {People.NAME} ,          // Map the NAME column in the people database to...
-                new String[] {"text1"});              // The "text1" view defined in the XML template
-setListAdapter(adapter);</pre>
-<p>See view/List4 in the ApiDemos project for an example of extending ListAdapter
-    for a new data type. </p>
-
-<a name="handle"></a>
-
-<h2>Getting a Handle to a Screen Element</h2>
-<p>You can get a handle to a screen element by calling {@link
-android.app.Activity#findViewById(int) Activity.findViewById}. You can then use
-the handle to set or retrieve any values exposed by the object. </p>
-<a name="captureimages" id="captureimages"></a><h2>Capture Images from the Phone Camera</h2>
-<p>You can hook into the device's camera onto your own Canvas object by using the
-    {@link android.hardware.Camera Camera} class. See that class's documentation,
-    and the ApiDemos project's Camera Preview application (Graphics/Camera Preview)
-    for example code. </p>
-
-
-<a name="threading" id="threading"></a><h2>Handling Expensive Operations in the UI Thread</h2>
-<p>Avoid performing long-running operations (such as network I/O) directly in the UI thread &mdash; 
-the main thread of an application where the UI is run &mdash; or your application may be blocked 
-and become unresponsive. Here is a brief summary of the recommended approach for handling expensive operations:</p>
-<ol>
-<li>Create a Handler object in your UI thread</li>
-<li>Spawn off worker threads to perform any required expensive operations</li>
-<li>Post results from a worker thread back to the UI thread's handler either through a Runnable or a {@link android.os.Message}</li>
-<li>Update the views on the UI thread as needed</li>
-</ol>
-
-<p>The following outline illustrates a typical implementation:</p>
-
-<pre>
-public class MyActivity extends Activity {
-
-    [ . . . ]
-    // Need handler for callbacks to the UI thread
-    final Handler mHandler = new Handler();
-
-    // Create runnable for posting
-    final Runnable mUpdateResults = new Runnable() {
-        public void run() {
-            updateResultsInUi();
-        }
-    };
-
-    &#64;Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        [ . . . ]
-    }
-
-    protected void startLongRunningOperation() {
-
-        // Fire off a thread to do some work that we shouldn't do directly in the UI thread
-        Thread t = new Thread() {
-            public void run() {
-                mResults = doSomethingExpensive();
-                mHandler.post(mUpdateResults);
-            }
-        };
-        t.start();
-    }
-
-    private void updateResultsInUi() {
-
-        // Back in the UI thread -- update our UI elements based on the data in mResults
-        [ . . . ]
-    }
-}
-</pre>
-
-<p>For further discussions on this topic, see 
-<a href="{@docRoot}guide/practices/design/responsiveness.html">Designing for Responsiveness</a> 
-and the {@link android.os.Handler} documentation.</p>
-
-<a name="selectingtext" id="selectingtext"></a><h2>Selecting, Highlighting, or Styling Portions of Text</h2>
-<p>You can highlight or style the formatting of strings or substrings of text in
-    a TextView object. There are two ways to do this:</p>
-<ul>
-    <li>If you use a <a href="{@docRoot}guide/topics/resources/string-resource.html">string resource</a>,
-        you can add some simple styling, such as bold or italic using HTML notation.
-        The currently supported tags are: <code>B</code> (bold),
-        <code>I</code> (italic), <code>U</code> (underline),
-        <code>TT</code> (monospace), <code>BIG</code>, <code>SMALL</code>,
-        <code>SUP</code> (superscript), <code>SUB</code> (subscript),
-        and <code>STRIKE</code> (strikethrough).
-        So, for example, in res/values/strings.xml you could declare this:<br />
-        <code>&lt;resources&gt;<br />
-        &nbsp;&nbsp;&nbsp;&nbsp;&lt;string&nbsp;name=&quot;styled_welcome_message&quot;&gt;We
-        are &lt;b&gt;&lt;i&gt;so&lt;/i&gt;&lt;/b&gt; glad to see you.&lt;/string&gt;<br />
-        &lt;/resources&gt;</code></li>
-    <li>To style text on the fly, or to add highlighting or more complex styling,
-        you must use the Spannable object as described next. </li>
-</ul>
-<p>To style text on the fly, you must make sure the TextView is using {@link android.text.Spannable}
-    storage for the text (this will always be true if the TextView is an EditText),
-    retrieve its text with {@link android.widget.TextView#getText}, and call {@link
-    android.text.Spannable#setSpan}, passing in a new style class from the {@link
-    android.text.style} package and the selection range. </p>
-<p>The following code snippet demonstrates creating a string with a highlighted section,
-    italic section, and bold section, and adding it to an EditText object. </p>
-<pre>// Get our EditText object.
-EditText vw = (EditText)findViewById(R.id.text);
-
-// Set the EditText's text.
-vw.setText("Italic, highlighted, bold.");
-
-// If this were just a TextView, we could do:
-// vw.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE);
-// to force it to use Spannable storage so styles can be attached.
-// Or we could specify that in the XML.
-
-// Get the EditText's internal text storage
-Spannable str = vw.getText();
-
-// Create our span sections, and assign a format to each.
-str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-str.setSpan(new BackgroundColorSpan(0xFFFFFF00), 8, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 21, str.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-</pre>
-
-<a name="querymap" id="querymap"></a><h2>Utilizing attributes in a Map query</h2>
-<p>
-When using a search intent to ask the Maps activity to search for something, the Maps activity responds to the following attributes in the optional context bundle:
-</p>
-<pre>
-               float "centerLatitude" default 0.0f
-               float "centerLongitude" default 0.0f
-               float "latitudeSpan" default 0.0f
-               float "longitudeSpan" default 0.0f
-               int "zoomLevel" default 10
-</pre>
-<p>
-This context information is used to center the search result in a particular area, and is equivalent to adjusting the Map activity to the described location and zoom level before issuing the query.
-</p>
-<p>
-If the latitudeSpan, longitudeSpan, and zoomLevel attributes are not consistent, then it is undefined which one takes precedence.
-</p>
-
-<a name="filelist" id="filelist"></a><h2>List of Files for an Android Application</h2>
-<p>The following list describes the structure and files of an Android application.
-    Many of these files can be built for you (or stubbed out) by the android tool
-    shipped in the tools/ menu of the SDK. </p>
-<table width="100%" border="0">
-    <tr>
-        <td width="28%" valign="top">MyApp/<br /></td>
-        <td width="72%" valign="top">&nbsp;</td>
-    </tr>
-    <tr>
-        <td valign="top">&nbsp;&nbsp;&nbsp;&nbsp;AndroidManifest.xml</td>
-        <td valign="top">(<em>required</em>) Advertises the screens that this application provides,
-            where they can be launched (from the main program menu or elsewhere),
-            any content providers it implements and what kind of data they handle,
-            where the implementation classes are, and other application-wide
-            information. Syntax details for this file are described in <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml File</a>.</td>
-    </tr>
-    <tr>
-        <td valign="top">&nbsp;&nbsp;&nbsp;&nbsp;src/<br />
-        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/<em>myPackagePath</em>/.../<em>MyClass</em>.java</td>
-        <td valign="top">(<em>required</em>) This folder holds all the source code files for your
-            application, inside the appropriate package subfolders. </td>
-    </tr>
-    <tr>
-        <td valign="top">&nbsp;&nbsp;&nbsp;&nbsp;res/</td>
-        <td valign="top">(<em>required</em>) This folder holds all the <em>resources</em> for
-            your application. Resources are external data files or description files
-            that are compiled into your code at build time. Files in different folders
-            are compiled differently, so you must put the proper resource into the
-            proper folder. (See <a href="{@docRoot}guide/topics/resources/resources-i18n.html">Resources</a> for details.)</td>
-    </tr>
-    <tr>
-        <td valign="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;anim/<br />
-            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>animation1</em>.xml<br />
-        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>...</em></td>
-        <td valign="top">(<em>optional</em>) Holds any animation XML description files that the
-            application uses. The format of these files is described in <a href="{@docRoot}guide/topics/resources/resources-i18n.html">Resources</a>. </td>
-    </tr>
-    <tr>
-        <td valign="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawable/<br />
-            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>some_picture</em>.png<br />
-            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>some_stretchable</em>.9.png<br />
-            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>some_background</em>.xml<br />
-        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...</td>
-        <td valign="top">(<em>optional</em>) Zero or more files that will be compiled to {@link
-            android.graphics.drawable android.graphics.drawable} resources. Files
-            can be image files (png, gif, or other) or XML files describing other
-            graphics such as bitmaps, stretchable bitmaps, or gradients. Supported
-            bitmap file formats are PNG (preferred), JPG, and GIF (discouraged),
-            as well as the custom 9-patch stretchable bitmap format. These formats
-            are described in <a href="{@docRoot}guide/topics/resources/resources-i18n.html">Resources</a>. </td>
-    </tr>
-    <tr>
-        <td valign="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layout/<br />
-            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>screen_1_layout</em>.xml<br />
-        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...<br /></td>
-        <td valign="top">(<em>optional</em>) Holds all the XML files describing screens or parts
-            of screens. Although you could create a screen in Java, defining them
-            in XML files is typically easier. A layout file is similar in concept
-            to an HTML file that describes the screen layout and components. See <a href="{@docRoot}guide/topics/ui/index.html">User Interface</a> for more information about designing screens, and <a href="{@docRoot}guide/topics/resources/available-resources.html#layoutresources">Available Resource Types</a> for the syntax of these files.</td>
-    </tr>
-    <tr>
-        <td valign="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;values/<br />
-            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrays<br />
-  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;          &nbsp;classes.xml<br />
-            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;colors.xml<br />
-            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dimens.xml<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;            strings.xml<br />
-        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;styles.xml<br />
-        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;values.xml<br /></td>
-        <td valign="top"><p>(<em>optional</em>) XML files describing additional resources
-                such as strings, colors, and styles. The naming, quantity, and number
-                of these files are not enforced--any XML file is compiled, but these
-                are the standard names given to these files. However, the syntax
-                of these files is prescribed by Android, and described in <a href="{@docRoot}guide/topics/resources/resources-i18n.html">Resources</a>. </p>
-        </td>
-    </tr>
-    <tr>
-        <td valign="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xml/</td>
-        <td valign="top">(<em>optional</em>) XML files that can be read at run time on the device. </td>
-    </tr>
-    <tr>
-        <td valign="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raw/</td>
-        <td valign="top">(<em>optional</em>) Any files to be copied directly to the device. </td>
-    </tr>
-</table>
-
-
-<a name="logging" ></a>
-<h2>Print Messages to a Log File</h2>
-
-<p>To write log messages from your application:</p>
-<ol><li>Import <code>android.util.Log</code>.</li>
-    <li>Use <code>Log.v()</code>, <code>Log.d()</code>, <code>Log.i()</code>,
-    <code>Log.w()</code>, or <code>Log.e()</code> to log messages.
-    (See the {@link android.util.Log} class.)<br/> E.g., 
-    <code>Log.e(this.toString(), "error: " + err.toString())</code></li>
-    <li>Launch <a href="{@docRoot}guide/developing/tools/ddms.html">DDMS</a> from a terminal
-    by executing <code>ddms</code> in your Android SDK <code>/tools</code> path.</li>
-    <li>Run your application in the Android emulator.</li>
-    <li>From the DDMS application, select the emulator 
-    (e.g., "emulator-5554") and click <b>Device > Run logcat...</b>
-    to view all the log data.</li>
-</ol>
-<p class="note"><strong>Note:</strong> If you are running Eclipse and 
-encounter a warning about the VM debug port when opening DDMS, you can ignore it
-if you're only interested in logs. However, if you want to further inspect and
-control your processes from DDMS, then you should close Eclipse before launching DDMS so that 
-it may use the VM debugging port.</p>
-
-
diff --git a/docs/html/guide/faq/framework.jd b/docs/html/guide/faq/framework.jd
deleted file mode 100644
index c851e72..0000000
--- a/docs/html/guide/faq/framework.jd
+++ /dev/null
@@ -1,185 +0,0 @@
-page.title=Android Application Framework FAQ
-excludeFromSuggestions=true
-@jd:body
-
-<ul>
-  <li><a href="#1">Do all the Activities and Services of an
-  application run in a single process?</a></li>
-  <li><a href="#2">Do all Activities run in the main thread of
-  an application process?</a></li>
-  <li><a href="#3">How do I pass complicated data structures
-  from one Activity/Service to another?</a></li>
-  <li><a href="#4">How can I check if an Activity is already
-  running before starting it?</a></li>
-  <li><a href="#5">If an Activity starts a remote service, is
-  there any way for the Service to pass a message back to the Activity?</a></li>
-  <li><a href="#6">How to avoid getting the Application not
-  responding dialog?</a></li>
-  <li><a href="#7">How does an application know if a package is
-  added or removed?</a></li>
-</ul>
-
-
-<a name="1" id="1"></a>
-
-<h2>Do all the Activities and Services of an application run in a
-single process?</h2>
-
-<p>All Activities and Services in an application run in a single process by
-default. If needed, you can declare an <code>android:process</code> attribute
-in your manifest file, to explicitly place a component (Activity/Service) in
-another process.</p>
-
-
-
-<a name="2" id="2"></a>
-
-<h2>Do all Activities run in the main thread of an application
-process?</h2>
-
-<p>By default, all of the application code in a single process runs
-in the main UI thread. This is the same thread
-that also handles UI events. The only exception is the code that handles
-IPC calls coming in from other processes. The system maintains a
-separate pool of transaction threads in each process to dispatch all
-incoming IPC calls. The developer should create separate threads for any
-long-running code, to avoid blocking the main UI thread.</p>
-
-
-
-<a name="3" id="3"></a>
-
-<h2>How do I pass data between Activities/Services within a single
-application?</h2>
-
-<p>It depends on the type of data that you want to share:</p>
-
-<h3>Primitive Data Types</h3>
-
-<p>To share primitive data between Activities/Services in an
-application, use Intent.putExtras(). For passing primitive data that
-needs to persist use the 
-<a href="{@docRoot}guide/topics/data/data-storage.html#preferences">
-Preferences</a> storage mechanism.</p>
-
-<h3>Non-Persistent Objects</h3>
-
-<p>For sharing complex non-persistent user-defined objects for short
-duration, the following approaches are recommended:
-</p>
-  <h4>Singleton class</h4>
-  <p>You can take advantage of the fact that your application
-components run in the same process through the use of a singleton.
-This is a class that is designed to have only one instance.  It
-has a static method with a name such as <code>getInstance()</code>
-that returns the instance; the first time this method is called,
-it creates the global instance.  Because all callers get the same
-instance, they can use this as a point of interaction.  For
-example activity A may retrieve the instance and call setValue(3);
-later activity B may retrieve the instance and call getValue() to
-retrieve the last set value.</p>
-
-  <h4>A public static field/method</h4>
-  <p>An alternate way to make data accessible across Activities/Services is to use <em>public static</em>
-fields and/or methods. You can access these static fields from any other
-class in your application. To share an object, the activity which creates your object sets a
-static field to point to this object and any other activity that wants to use
-this object just accesses this static field.</p>
-
-  <h4>A HashMap of WeakReferences to Objects</h4>
-  <p>You can also use a HashMap of WeakReferences to Objects with Long
-keys. When an activity wants to pass an object to another activity, it
-simply puts the object in the map and sends the key (which is a unique
-Long based on a counter or time stamp) to the recipient activity via
-intent extras. The recipient activity retrieves the object using this
-key.</p>
-
-<h3>Persistent Objects</h3>
-
-<p>Even while an application appears to continue running, the system
-may choose to kill its process and restart it later. If you have data
-that you need to persist from one activity invocation to the next, you
-need to represent that data as state that gets saved by an activity when
-it is informed that it might go away.</p>
-
-<p>For sharing complex persistent user-defined objects, the
-following approaches are recommended:
-<ul>
-  <li>Application Preferences</li>
-  <li>Files</li>
-  <li>contentProviders</li>
-  <li>SQLite DB</li>
-</ul>
-</p>
-
-<p>If the shared data needs to be retained across points where the application
-process can be killed, then place that data in persistent storage like
-Application Preferences, SQLite DB, Files or ContentProviders. Please refer to
-the <a href="{@docRoot}guide/topics/data/data-storage.html">Data Storage</a>
-for further details on how to use these components.</p>
-
-
-
-
-<a name="4" id="4"></a>
-
-<h2>How can I check if an Activity is already running before starting
-it?</h2>
-
-<p>The general mechanism to start a new activity if its not running&mdash;
-or to bring the activity stack to the front if is already running in the
-background&mdash; is the to use the NEW_TASK_LAUNCH flag in the startActivity()
-call.</p>
-
-
-
-<a name="5" id="5"></a>
-
-<h2>If an Activity starts a remote service, is there any way for the
-Service to pass a message back to the Activity?</h2>
-
-<p>See the {@link android.app.Service} documentation's for examples of
-how clients can interact with a service.  You can take advantage of the
-fact that your components run in the same process to greatly simplify
-service interaction from the generic remote case, as shown by the "Local
-Service Sample".  In some cases techniques like singletons may also make sense.
-
-
-<a name="6" id="6"></a>
-
-<h2>How to avoid getting the Application not responding dialog?</h2>
-
-<p>Please read the <a href="{@docRoot}guide/practices/design/responsiveness.html">Designing for Responsiveness</a> 
-document.</p>
-
-
-
-
-<a name="7" id="7"></a>
-
-<h2>How does an application know if a package is added or removed?
-</h2>
-
-<p>Whenever a package is added, an intent with PACKAGE_ADDED action
-is broadcast by the system. Similarly when a package is removed, an
-intent with PACKAGE_REMOVED action is broadcast. To receive these
-intents, you should write something like this:
-<pre>
-       &lt;receiver android:name ="com.android.samples.app.PackageReceiver"&gt;
-            &lt;intent-filter&gt;
-             &lt;action android:name="android.intent.action.PACKAGE_ADDED"/&gt;
-              &lt;action android:name="android.intent.action.PACKAGE_REMOVED"/&gt;            
-            
-              &lt;data android:scheme="package" /&gt;
-            &lt;/intent-filter&gt;
-        &lt;/receiver&gt;
-  </pre>
-  <br>
-Here PackageReceiver is a BroadcastReceiver class.Its onReceive()
-method is invoked, every time an application package is installed or
-removed.
-
-</p>
-
-
-
diff --git a/docs/html/guide/faq/index.jd b/docs/html/guide/faq/index.jd
deleted file mode 100644
index 0c5fb0e..0000000
--- a/docs/html/guide/faq/index.jd
+++ /dev/null
@@ -1,12 +0,0 @@
-page.title=Android FAQs
-excludeFromSuggestions=true
-@jd:body
-
-<dl>
-    <dt><a href="framework.html">Application Framework FAQ</a></dt>
-    <dd>Common questions about the Android Application Framework.</dd>
-    <dt><a href="licensingandoss.html">Open Source Licensing FAQ</a></dt>
-    <dd>Common topics around licensing and Android Open Source</dd>
-    <dt><a href="security.html">Android Security FAQ</a></dt>
-    <dd>Answers to common questions about Android security.</dd>
-</dl>
diff --git a/docs/html/guide/faq/licensingandoss.jd b/docs/html/guide/faq/licensingandoss.jd
deleted file mode 100644
index d1dd9a7..0000000
--- a/docs/html/guide/faq/licensingandoss.jd
+++ /dev/null
@@ -1,18 +0,0 @@
-page.title=Android Open Source Licensing FAQ
-excludeFromSuggestions=true
-@jd:body
-
-<ul>
-    <li><a href="#mirror">Where can I find the open source components of Android?</a></li>
-    <li><a href="#timeline">When will we see more code released under open source licenses?</a></li>
-    <li><a href="#apache2">Why are you releasing the code under the Apache License instead of GPLv2?</a></li>
-</ul>
-
-<a name="mirror" id="mirror"></a><h2>Where can I find the open source components of Android?</h2>
-<p>The source code for the full Android stack is available from the <a href="http://source.android.com">Android Open Source Project </a> site. 
-
-<p>Other mirrored GPL and LGPL'd components are available at <a href="http://code.google.com/p/android/downloads/list"><code>http://code.google.com/p/android/downloads/list</code></a>.</p>
-<p>Notices for other licenses can be found within the SDK.</p>
-
-<a name="apache2" id="apache2"></a><h2>Why are you releasing the code under the Apache License instead of GPLv2?</h2>
-<p>One of the best explanations for the reasoning behind releasing code under Apache2 can be found in a <a href="http://arstechnica.com/news.ars/post/20071106-why-google-chose-the-apache-software-license-over-gplv2.html">ArsTechnica article</a> by Ryan Paul.</p>
diff --git a/docs/html/guide/faq/security.jd b/docs/html/guide/faq/security.jd
deleted file mode 100644
index 8ccf21f..0000000
--- a/docs/html/guide/faq/security.jd
+++ /dev/null
@@ -1,157 +0,0 @@
-page.title=Android Security FAQ
-excludeFromSuggestions=true
-@jd:body
-
-<ul>
-    <li><a href="#secure">Is Android Secure?</a></li>
-    <li><a href="#issue">I think I found a security flaw. How do I report
-    it?</a></li>
-    <li><a href="#informed">How can I stay informed about Android security?</a></li>
-    <li><a href="#use">How do I securely use my Android phone?</a></li>
-    <li><a href="#malware">I think I found malicious software being distributed
-    for Android. How can I help?</a></li>
-    <li><a href="#fixes">How will Android-powered devices receive security fixes?</a>
-    </li>
-    <li><a href="#directfix">Can I get a fix directly from the Android Platform
-    Project?</a></li>
-</ul>
-
-
-<a name="secure" id="secure"></a><h2>Is Android secure?</h2>
-
-<p>The security and privacy of our users' data is of primary importance to the
-Android Open Source Project. We are dedicated to building and maintaining one
-of the most secure mobile platforms available while still fulfilling our goal
-of opening the mobile device space to innovation and competition.</p>
-
-<p> A comprehensive overview  of the <a
-href="http://source.android.com/tech/security/index.html">Android
-security model and Android security processes</a> is provided in the Android
-Open Source Project Website.</p>
-
-<p>Application developers play an important part in the security of Android.
-The Android Platform provides developers with a rich <a
-href="http://code.google.com/android/devel/security.html">security model</a>
-that to request the capabilities, or access, needed by their
-application and to define new capabilities that other applications can request.
-The Android user can choose to grant or deny an application's request for
-certain capabilities on the handset.</p>
-
-<p>We have made great efforts to secure the Android platform, but it is
-inevitable that security bugs will be found in any system of this complexity.
-Therefore, the Android team works hard to find new bugs internally and responds
-quickly and professionally to vulnerability reports from external researchers.
-</p>
-
-
-<a name="issue" id="issue"></a><h2>I think I found a security flaw. How do I
-report it?</h2>
-
-<p>You can reach the Android security team at security@android.com. If you like, you
-can protect your message using our <a
-href="http://code.google.com/android/security_at_android_dot_com.txt">PGP
-key</a>.</p>
-
-<p>We appreciate researchers practicing responsible disclosure by emailing us
-with a detailed summary of the issue and keeping the issue confidential while
-users are at risk. In return, we will make sure to keep the researcher informed
-of our progress in issuing a fix. </p>
-
-<p>Vulnerabilities specific to Android OEMs should be reported to the relevant
-vendor. An incomplete list of Android vendor security contacts can be found below.
-To be added to this list, please contact security@android.com.</p>
-
-<ul>
-  <li><a href="http://www.htc.com/www/terms/product-security/">HTC</a></li>
-  <li><a href="http://www.motorolasolutions.com/US-EN/About/Security%20Vulnerability">Motorola</a></li>
-  <li><a href="http://developer.samsung.com/notice/How-to-Use-the-Forum">Samsung</a> - m.security@samsung.com</li>
-</ul>
-
-<a name="informed" id="informed"></a><h2>How can I stay informed about Android security?</h2>
-
-<p>For general discussion of Android platform security, or how to use
-security features in your Android application, please subscribe to <a
-href="http://groups.google.com/group/android-security-discuss">android-security-discuss</a>.
-</p>
-
-
-<a name="use" id="use"></a><h2>How do I securely use my Android phone?</h2>
-
-<p>Android was designed so that you can safely use your phone without making
-any changes to the device or installing any special software.  Android applications
-run in an Application Sandbox that limits access to sensitive information or data
-with the users permission.</p>
-
-<p>To fully benefit from the security protections in Android, it is important that
-users only download and install software from known sources.</p>
-
-<p>As an open platform, Android allows users to visit any website and load
-software from any developer onto a device. As with a home PC, the user must be
-aware of who is providing the software they are downloading and must decide
-whether they want to grant the application the capabilities it requests.
-This decision can be informed by the user's judgment of the software
-developer's trustworthiness, and where the software came from.</p>
-
-
-<a name="malware" id="malware"></a><h2>I think I found malicious software being
-distributed for Android. How can I help?</h2>
-
-<p>Like any other platform, it will be possible for unethical developers
-to create malicious software, known as <a
-href="http://en.wikipedia.org/wiki/Malware">malware</a>, for Android. If you
-think somebody is trying to spread malware, please let us know at
-security@android.com. Please include as
-much detail about the application as possible, with the location it is
-being distributed from and why you suspect it of being malicious software.</p>
-
-<p>The term <i>malicious software</i> is subjective, and we cannot make an
-exhaustive definition.  Some examples of what the Android Security Team believes
-to be malicious software is any application that:
-<ul>
-    <li>uses a bug or security vulnerability to gain permissions that have not
-    been granted by the user</li>
-    <li>shows the user unsolicited messages (especially messages urging the
-    user to buy something);</li>
-    <li>resists (or attempts to resist) the user's effort to uninstall it;</li>
-    <li>attempts to automatically spread itself to other devices;</li>
-    <li>hides its files and/or processes;</li>
-    <li>discloses the user's private information to a third party, without the
-    user's knowledge and consent;</li>
-    <li>destroys the user's data (or the device itself) without the user's
-    knowledge and consent;</li>
-    <li>impersonates the user (such as by sending email or buying things from a
-    web store) without the user's knowledge and consent; or</li>
-    <li>otherwise degrades the user's experience with the device.</li>
-</ul>
-</p>
-
-
-<a name="fixes" id="fixes"></a><h2>How do Android-powered devices receive security
-fixes?</h2>
-
-<p>The manufacturer of each device is responsible for distributing software
-upgrades for it, including security fixes. Many devices will update themselves
-automatically with software downloaded "over the air", while some devices
-require the user to upgrade them manually.</p>
-
-<p>Google provides software updates for a number of Android devices, including
-the <a href="http://www.google.com/nexus">Nexus</a>
-series of devices, using an "over the air" (OTA) update. These updates may include
-security fixes as well as new features.</p>
-
-<a name="directfix" id="directfix"></a><h2>Can I get a fix directly from the
-Android Platform Project?</h2>
-
-<p>Android is a mobile platform that is released as open source and
-available for free use by anybody. This means that there are many
-Android-based products available to consumers, and most of them are created
-without the knowledge or participation of the Android Open Source Project. Like
-the maintainers of other open source projects, we cannot build and release
-patches for the entire ecosystem of products using Android. Instead, we will
-work diligently to find and fix flaws as quickly as possible and to distribute
-those fixes to the manufacturers of the products through the open source project.</p>
-
-<p>If you are making an Android-powered device and would like to know how you can
-properly support your customers by keeping abreast of software updates, please
-contact us at <a
-href="mailto:info@openhandsetalliance.com">info@openhandsetalliance.com</a>.</p>
diff --git a/docs/html/guide/faq/troubleshooting.jd b/docs/html/guide/faq/troubleshooting.jd
deleted file mode 100644
index 8bb7eeb..0000000
--- a/docs/html/guide/faq/troubleshooting.jd
+++ /dev/null
@@ -1,336 +0,0 @@
-page.title=Troubleshooting
-excludeFromSuggestions=true
-@jd:body
-
-
-<p>Here are some tips and tricks for common Android errors. Don't forget to use the
-    ddms logcat capability to get a deeper view when errors occur. 
-    See the <a href="{@docRoot}guide/developing/debugging/index.html">Debugging</a> documentation for more information.</p>
-<ul>
-    <li><a href="#installeclipsecomponents">ADT Installation Error: "requires plug-in org.eclipse.wst.sse.ui".</a></li>
-    <li><a href="#nodevice">ADB reports &quot;no device&quot; when an emulator is running</a></li>
-    <li><a href="#noapp">My new application/activity isn't showing up in the device application
-        list </a></li>
-    <li><a href="#noupdate">I updated my app, but the updates don't seem to be showing up on
-    the device</a></li>
-    <li><a href="#layout_wilih">I'm getting a &quot;Binary XML file line #2: You must supply a layout_wilih
-    attribute&quot; error when I start an application</a></li>
-    <li><a href="#permission">My request to (<em>make a call, catch an incoming SMS, receive
-        a notification, send an intent to an Android application</em>) is being
-        ignored</a></li>
-    <li><a href="#build">Help! My project won't build in Eclipse</a></li>
-    <li><a href="#eclipse">Eclipse isn't talking to the emulator</a></li>
-    <li><a href="#majorminor">When I go to preferences in Eclipse and select "Android", I get the following error message: Unsupported major.minor version 49.0.</a></li>
-    <li><a href="#apidemosreinstall">I can't install ApiDemos apps in my IDE because of a signing error</a></li>
-    <li><a href="#gesturebuilderinstall">I can't install the GestureBuilder sample
-app in the emulator</a></li>
-    <li><a href="#signingcalendar">I can't compile my app because the build tools generated an expired debug certificate</a></li>
-    <li><a href="#manifestfiles">Unable to view manifest files from within Eclipse</a></li>
-</ul>
-
-<a name="installeclipsecomponents" id="installeclipsecomponents"></a><h2>ADT Installation Error: "requires plug-in org.eclipse.wst.sse.ui".</h2>
-<p>
-The "Android Editors" feature of the ADT Plugin requires specific Eclipse components, such as WST. If you
-encounter this error message during ADT installation, you need to install the
-required Eclipse components and then try the ADT installation again. Follow the steps below to install the required components for the 
-Android Editors feature, based on the version of Eclipse that you are using.</p>
-
-<table style="font-size:100%">
-<tr><th>Eclipse 3.3 (Europa)</th><th>Eclipse 3.4 (Ganymede)</th></tr>
-<tr>
-<td width="50%">
-<ol>
-<li>From the dialog where you select the <strong>Update sites to visit</strong>, select the checkboxes for both the
-ADT site, and the Callisto/Europa/Ganymede Discovery Site (you may want to
-check <strong>Automatically select mirrors</strong> at the bottom).</li>
-<li>Click <strong>Finish</strong>.</li>
-<li>In the <strong>Next</strong> dialog, select the Android Plugins.</li>
-<li>Now, expand the tree item of the discovery site. It seems that if you
-don't do it, it doesn't load the content of the discovery site.</li>
-<li>On the right, click <strong>Select required</strong>. This will select all the components
-that are required to install the Android plugin (wst, emf, etc...).</li>
-<li>Click <strong>Next</strong>, accept the agreement, click <strong>Install All</strong>, and restart Eclipse.</li>
-</ol>
-</td>
-<td>
-<ol>
-    <li>Select <strong>Help</strong> &gt; <strong>Software Updates...</strong></li>
-    <li>Select the <strong>Installed Software</strong> tab.</li>
-    <li>Click <strong>Update...</strong></li>
-    <li>If an update for ADT is available, select it and click <strong>Finish</strong>.</li>
-</ol>
-</td>
-</tr>
-</table>
-
-
-</p>
-<a name="nodevice"></a><h2>ADB reports &quot;no device&quot; when an emulator is running</h2>
-    <p>Try restarting adb by stopping it (<code>adb
-        kill-server</code>) then any other adb command to restart it.</p>
-
-<a name="noapp"></a><h2>My new application/activity isn't showing up in the
-        applications list </h2>
-<ul>
-    <li>You often must restart your device or emulator before a new activity shows
-        up in the applications list. This is particularly true when it is a completely
-        new application with a new AndroidManifest.xml file.</li>
-    <li>If this is for a new activity in an existing AndroidManifest.xml file, did
-        you include an <code>&lt;activity&gt;</code> tag for your app (or a <code>&lt;service&gt;</code>        tag
-        for a service, or a <code>&lt;receiver&gt;</code> tag for a receiver, etc.)? </li>
-    <li>Make sure that your AndroidManifest.xml file is valid. Errors in attribute
-        values, such as the <em>value </em> attribute in <code>&lt;action <em>value</em>=&quot;<em>&lt;something&gt;</em>&quot;&gt;</code>
-        will often not be caught by compilers, but will prevent your application
-        from being displayed because the intent filter will not be matched. Extra
-        spaces or other characters can often sneak into these strings.</li>
-    <li>Did you send your .apk file to the device (<a href="{@docRoot}guide/developing/tools/adb.html#move">adb install</a>)?</li>
-    <li>Run logcat on your device (<code>adb logcat</code>)
-        and then install your .apk file. Check the logcat output to see whether the
-        application is being installed and recognized properly. Here's sample output
-        from a successful installation:
-<pre>I/FileObserver( 414): *** onEvent wfd: 3 mask: 8 path: MyRSSReader.apk
-D/PackageManager( 414): Scanning package: /data/app/MyRSSReader.apk
-D/PackageManager( 414): Adding package com.example.codelab.rssexample
-D/PackageManager( 414): Registered content provider: my_rss_item, className = com.example.codelab.rssexample.RssContentProvider, isSyncable = false
-D/PackageManager( 414): Providers: com.example.codelab.rssexample.RssContentProvider
-D/PackageManager( 414): Activities: com.example.codelab.rssexample.MyRssReader com.example.codelab.rssexample.MyRssReader2 </pre>
-    </li>
-	<li>If logcat shows that the package manager is having problems loading the manifest
-	    file, force your manifest to be recompiled by adding a space in the file and
-	    compiling it.</li>
-</ul>
-<a name="noupdate"></a><h2>I updated my app, but the updates don't seem to be showing up on the device</h2>
-    <p>Did you remember to send your .apk file to the device (<a href="{@docRoot}guide/developing/tools/adb.html#move">adb
-        install</a>)?</p>
-
-<a name="layout_wilih"></a><h2>I'm getting a &quot;Binary XML file line #2: You must supply a layout_wilih
-    attribute&quot; error
-    when I start an application (but I declare a layout_wilih attribute <em>right
-        there!!!</em>)</h2>
-<ul>
-    <li>Make sure that the SDK you are building with is the same version as the Android
-        OS that you are running on. </li>
-    <li>Make sure that you're calling setContentView() early in your onCreate() method.
-        Calling other methods, such as setListAdapter() before calling setContentView()
-        can sometimes create odd errors when Android tries to access screen elements
-        that haven't been set before.</li>
-</ul>
-<a name="permission"></a><h2>My request to (<em>make a call, catch an incoming SMS,
-receive a notification, send an intent to an Android application</em>) is being
-ignored</h2>
-    <p>You might not have permission (or might not have requested permission) to
-        call this activity or receive this intent. Many standard Android activities,
-        such as making a call, have a permission assigned to it to prevent arbitrary
-        applications from sending or receiving requests. See <a
-        href="{@docRoot}guide/topics/security/security.html">Security and
-        Permissions</a> for more information on permissions, and 
-		{@link android.Manifest.permission Manifest.permission} for a list of
-        standard permissions supported by the Android platform.
-</p>
-<a name="build"></a><h2>Help! My project won't build in Eclipse</h2>
-<p>If your project doesn't build, you may notice symptoms such as new
-resources added in the <code>res/</code> sub-folders not showing up in the R class,
-the emulator not being started, not being able to run the application, or even seeming to run an old version of the application.</p>
-<p>To troubleshoot these types of problems, first try:</p>
-<ol>
-  <li>Switch to the DDMS view in Eclipse (if you don't already have it open):
-    <ol type="a">
-      <li>From the menu select <code>Window &gt; Open Perspective &gt; Other</code></li>      
-      <li>Select DDMS from the list and hit OK</li>
-    </ol>
-  </li>
-  <li>In the Devices panel (top right panel by default), click on the down triangle
-  to bring up the panel menu</li>
-  <li>Select <code>Reset ADB</code> from the menu, and then try running the
-  application again</li>
-</ol>
-<p>If the above still doesn't work, you can try these steps:</p>
-<ol>
-  <li>
-    Check the console and problems tabs at the bottom of the Eclipse UI
-  </li>
-  <li>
-    If there are problems listed in either place, they should give you a clue
-    what is wrong
-  </li>
-  <li>
-    If you aren't sure if the problems are fresh or stale, clear the console
-    with a right click &gt; Clear, then clean the project
-  </li>
-  <li>
-    To clean the project (a good idea with any kind of build error), select
-    Project &gt; Clean from the eclipse main menu, then select the project you
-    are working on (or clean all)
-  </li>
-</ol>
-<a name="eclipse"></a><h2>Eclipse isn't talking to the emulator</h2>
-<p>When communication doesn't seem to be happening between Eclipse and the emulator, symptoms can include: nothing happening when you press run, the emulator hanging waiting
-for a debugger to connect, or errors that Eclipse reports about not being able
-to find the emulator or shell. By far the most common symptom is that when you press run, the emulator starts (or
-is already running), but the application doesn't start.</p>
-<p>
-You may find any of these steps will fix the problem and with practice you
-probably can figure out which one you need to do for your particular issue, but
-to start with, the safest option is to run through all of them in order:</p>
-<ol>
-  <li>
-    Quit the emulator if it is running
-  </li>
-  <li>
-    Check that any emulator processes are killed (sometimes they    can hang, use ps on unix or mac, or task manager in the process view on
-    windows).
-  </li>
-  <li>
-    Quit Eclipse
-  </li>
-  <li>
-    From the command line, type: 
-<pre>adb kill-server </pre>
-  </li>
-  <li>
-    Start Eclipse and try again
-  </li>
-</ol>
-
-<a name="majorminor"></a><h2>When I go to preferences in Eclipse and select "Android", I get the following error message: Unsupported major.minor version 49.0.</h2>
-<p>This error is displayed if you are using an older version of the JDK. Please make sure you are using JDK version 5 or 6.</p>
-
-<h2 id="apidemosreinstall">I can't install ApiDemos apps in my IDE because of a signing error</a></h2>
-
-<p>The Android system requires that all applications be signed, as described in 
-	<a href="{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a>. The ApiDemos 
-applications included with the SDK are preinstalled on the emulator and for that reason have been 
-compiled and signed with a private key.</p>
-
-If you want to modify or run one of the ApiDemos apps from Eclipse/ADT or other IDE, you can do so 
-so only after you uninstall the <em>preinstalled</em> version of the app from the emulator. If 
-you try to run an ApiDemos apps from your IDE without removing the preinstalled version first, 
-you will get errors similar to: </p>
-
-<pre>[2008-08-13 15:14:15 - ApiDemos] Re-installation failed due to different application signatures.
-[2008-08-13 15:14:15 - ApiDemos] You must perform a full uninstall of the application. WARNING: ...This will remove the application data!
-[2008-08-13 15:14:15 - ApiDemos] Please execute 'adb uninstall com.android.samples' in a shell.</pre>
-
-<p>The error occurs because, in this case, you are attempting to install another copy of ApiDemos 
-onto the emulator, a copy that is signed with a different certificate (the Android IDE tools will 
-have signed the app with a debug certificate, where the existing version was already signed with 
-a private certificate). The system does not allow this type of reinstallation.  </p>
-
-<p>To resolve the issue, you need to fully uninstall the preinstalled and then reinstall it using 
-the adb tool. Here's how to do that:</p>
-
-<ol>
-  <li>In a terminal, change to the tools directory of the SDK.</li>
-  <li>If no emulator instance is running, start an emulator using using the command <code>emulator</code>.</li>
-  <li>Uninstall the preinstalled app using the command <code>adb uninstall com.example.android.apis</code>.</li>
-  <li>Reinstall the app using the command <code>adb install &lt;path to the ApiDemos.apk&gt;</code>. If you are 
-  working in Eclipse/ADT, you can just compile and run the app in the normal way. </li>
-</ol>
-
-<p>Note that if multiple emulator instances are running, you need to direct your uninstall/install 
-commands to the emulator instance that you are targeting. To do that you can add the 
-<code>-s &lt;serialNumber&gt;</code> to the command, for example: </p>
-
-<pre>adb -s emulator-5556 install</pre>
-
-<p>For more information about adb, see the <a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a> 
-documentation.</p>
-
-<h2 id="gesturebuilderinstall">I can't install the GestureBuilder sample 
-app in the emulator</a></h2>
-
-<p>This is similar to the ApiDemos problem described above, except that
-you cannot fix it by uninstalling GestureBuilder from the emulator. The 
-GestureBuilder app cannot be uninstalled because it is currently installed 
-within the system files themselves.</p>
-
-<p><strong>Symptoms</strong></p>
-
-<ul><li><p>You cannot run GestureBuilder in the emulator:</p>
-
-<pre>[2009-12-10 14:57:19 - GestureBuilderActivity]Re-installation failed due to different application signatures.
-[2009-12-10 14:57:19 - GestureBuilderActivity]You must perform a full uninstall of the application. WARNING: This will remove the application data!
-[2009-12-10 14:57:19 - GestureBuilderActivity]Please execute 'adb uninstall com.android.gesture.builder' in a shell.</pre>
-</li>
-
-<li><p>Running <code>adb uninstall com.android.gesture.builder</code> fails:</p>
-<pre>$ adb uninstall com.android.gesture.builder
-	Failure</pre>
-</li></ul>
-
-<p>For now, the work-around is to change the sample's package name
-so that the system can install it as a new app rather than as a 
-replacement for the existing GestureBuilder app. To change the 
-package name, open the manifest file and modify the package attribute 
-of the manifest element. Next, update imports and other references to 
-the package name, rebuild the app, and run it in an AVD.</p>
-
-<p>For example, here's how you could do this in Eclipse:</p>
-
-<ol>
-  <li>Right-click on the package name
-(<code>src/com.android.gesture.builder</code>).</li>
-  <li>Select <strong>Refactor &gt; Rename</strong> and change the name, for example to
-<code>com.android.gestureNEW.builder</code>. </li>
-  <li>Open the manifest file. Inside the <code>&lt;manifest&gt;</code>
-tag, change the package name to
-<code>com.android.gestureNEW.builder</code>.</li>
-  <li>Open each of the two Activity files and do Ctrl-Shift-O to add
-missing import packages, then save each file.</li>
-<li>Run the GestureBuilder application on the emulator.</li>
-</ol>
-
-<p>If you get an error message such as "Could not load /sdcard/gestures. 
-Make sure you have a mounted SD card," be sure that your target AVD has an 
-SD card. To create an AVD that has an SD card, specify one when creating
-an AVD with the AVD manager. See 
-<a href="{@docRoot}guide/developing/devices/managing-avds.html#createavd">
-Creating and Managing AVDs with AVD Manager</a> for more information.</p>
-
-<h2 id="signingcalendar">I can't compile my app because the build tools generated an expired debug certificate</h2>
-
-<p>If your development machine uses a locale that has a non-Gregorian calendar, you may encounter problems when first trying to compile and run your application. Specifically, you may find that the Android build tools won't compile your application because the debug key is expired. </p>
-
-<p>The problem occurs because the Keytool utility &mdash; included in the JDK and used by the Android build tools &mdash; fails to properly handle non-Gregorian locales and may create validity dates that are in the past. That is, it may generate a debug key that is already expired, which results in the compile error.</p>
-
-<p>If you encounter this problem, follow these steps to work around it: </p>
-
-<ol>
-<li>First, delete the debug keystore/key already generated by the Android build tools. Specifically, delete the <code>debug.keystore</code> file. On Linux/Mac OSX, the file is stored in <code>~/.android</code>. On Windows XP, the file is stored in <code>
-C:\Documents and Settings\&lt;user&gt;\.android</code>. On Windows Vista, the file is stored in <code>
-C:\Users\&lt;user&gt;\.android</code></li>
-<li>Next, you can either
-<ul>
-<li>Temporarily change your development machine's locale (date and time) to one that uses a Gregorian calendar, for example, United States. Once the locale is changed, use the Android build tools to compile and install your app. The build tools will regenerate a new keystore and debug key with valid dates. Once the new debug key is generated, you can reset your development machine to the original locale. </li>
-<li>Alternatively, if you do not want to change your machine's locale settings, you can generate the keystore/key on any machine using the Gregorian calendar, then copy the <code>debug.keystore</code> file from that computer to the proper location on your development machine. </li>
-</ul>
-</li>
-</ol>
-
-<p>This problem has been verified on Windows and may apply to other platforms. </p>
-
-<p>For general information about signing Android applications, see 
-<a href="{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a>. </p>
-
-<h2 id="manifestfiles">Unable to view manifest files from within
-Eclipse</a></h2>
-
-<p>When you try to open an application's manifest file from within
-Eclipse, you might get an error such as this one:</p>
-<pre>An error has occurred. See error log for more details.
-org.eclipse.wst.sse.ui.StructuredTextEditor.isBlockSelectionModeEnabled()Z</pre>
-
-<p>Try reverting to the 3.0 version of the Eclipse XML Editors and
-Tools. If this does not work, remove the 3.1 version of the tool. To do
-this in Eclipse 3.4:</p>
-
-<ol>
-	<li>Select <strong>Help > Software Updates...</strong></li>
-	<li>Select the <strong>Installed Software</strong> tab.</li>
-	<li>Select <strong>Eclipse XML Editors and Tools</strong>.</li>
-	<li>Click <strong>Uninstall</strong>.</li>
-	<li>Click <strong>Finish</strong>.</li>
-</ol>
-
-<p>When you restart Eclipse, you should be able to view the manifest
-files. </p>
\ No newline at end of file
diff --git a/docs/html/sdk/index.jd b/docs/html/sdk/index.jd
index fed3f47..02beefd 100644
--- a/docs/html/sdk/index.jd
+++ b/docs/html/sdk/index.jd
@@ -30,21 +30,21 @@
 
 
 
-sdk.linux_download=android-sdk_r24.2-linux.tgz
-sdk.linux_bytes=168119905
-sdk.linux_checksum=1a29f9827ef395a96db629209b0e38d5e2dd8089
+sdk.linux_download=android-sdk_r24.3.2-linux.tgz
+sdk.linux_bytes=309563606
+sdk.linux_checksum=98e70ce403fea2e24e90103395d418feb3a9b7e8
 
-sdk.mac_download=android-sdk_r24.2-macosx.zip
-sdk.mac_bytes=88949635
-sdk.mac_checksum=256c9bf642f56242d963c090d147de7402733451
+sdk.mac_download=android-sdk_r24.3.2-macosx.zip
+sdk.mac_bytes=98259310
+sdk.mac_checksum=aa9aef30ff27358118318d82414b1481625faf2a
 
-sdk.win_download=android-sdk_r24.2-windows.zip
-sdk.win_bytes=155944165
-sdk.win_checksum=2611ed9a6080f4838f1d4e55172801714a8a169b
+sdk.win_download=android-sdk_r24.3.2-windows.zip
+sdk.win_bytes=187214094
+sdk.win_checksum=c33a63a955bb448ee550710a764ba18c37cb58d6
 
-sdk.win_installer=installer_r24.2-windows.exe
-sdk.win_installer_bytes=107849819
-sdk.win_installer_checksum=e764ea93aa72766737f9be3b9fb3e42d879ab599
+sdk.win_installer=installer_r24.3.2-windows.exe
+sdk.win_installer_bytes=139471724
+sdk.win_installer_checksum=8f9d0ae9fdb37973ed62d6e93975ff375beb5542
 
 
 
diff --git a/docs/html/tools/sdk/tools-notes.jd b/docs/html/tools/sdk/tools-notes.jd
index 434dc44..326fbe2 100644
--- a/docs/html/tools/sdk/tools-notes.jd
+++ b/docs/html/tools/sdk/tools-notes.jd
@@ -21,9 +21,98 @@
 <p>For a summary of all known issues in SDK Tools, see <a
 href="http://tools.android.com/knownissues">http://tools.android.com/knownissues</a>.</p>
 
+
 <div class="toggle-content opened">
   <p><a href="#" onclick="return toggleContent(this)">
     <img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img"
+      alt=""/>SDK Tools, Revision 24.3.2</a> <em>(June 2015)</em>
+  </p>
+
+  <div class="toggle-content-toggleme">
+
+    <dl>
+    <dt>Dependencies:</dt>
+
+    <dd>
+      <ul>
+        <li>Android SDK Platform-tools revision 19 or later.</li>
+      </ul>
+    </dd>
+
+    <dt>General Notes:</dt>
+    <dd>
+      <ul>
+        <li>Fixed issues with the ARM 64-bit emulator.</li>
+      </ul>
+    </dd>
+  </div>
+</div>
+
+
+<div class="toggle-content closed">
+  <p><a href="#" onclick="return toggleContent(this)">
+    <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img"
+      alt=""/>SDK Tools, Revision 24.3.1</a> <em>(June 2015)</em>
+  </p>
+
+  <div class="toggle-content-toggleme">
+
+    <dl>
+    <dt>Dependencies:</dt>
+
+    <dd>
+      <ul>
+        <li>Android SDK Platform-tools revision 19 or later.</li>
+      </ul>
+    </dd>
+
+    <dt>General Notes:</dt>
+    <dd>
+      <ul>
+        <li>Fixed issue with the <code>root/</code> and <code>lib/</code> folders. </li>
+      </ul>
+      <p class="caution"><strong>Caution:</strong> This release is known to contain issues which
+      prevent builds from completing. We strongly recommend that you update to SDK Tools 24.3.2
+      as soon as possible. </p>
+    </dd>
+  </div>
+</div>
+
+
+<div class="toggle-content closed">
+  <p><a href="#" onclick="return toggleContent(this)">
+    <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img"
+      alt=""/>SDK Tools, Revision 24.3.0</a> <em>(June 2015)</em>
+  </p>
+
+  <div class="toggle-content-toggleme">
+
+    <dl>
+    <dt>Dependencies:</dt>
+
+    <dd>
+      <ul>
+        <li>Android SDK Platform-tools revision 19 or later.</li>
+      </ul>
+    </dd>
+
+    <dt>General Notes:</dt>
+    <dd>
+      <ul>
+        <li>Fixed several minor emulator issues.</li>
+      </ul>
+      <p class="caution"><strong>Caution:</strong> This release is known to contain issues which
+      prevent builds from completing. We strongly recommend that you update to SDK Tools 24.3.2
+      as soon as possible. </p>
+    </dd>
+  </div>
+</div>
+
+
+
+<div class="toggle-content closed">
+  <p><a href="#" onclick="return toggleContent(this)">
+    <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img"
       alt=""/>SDK Tools, Revision 24.2.0</a> <em>(May 2015)</em>
   </p>
 
diff --git a/docs/html/training/cloudsync/gcm.jd b/docs/html/training/cloudsync/gcm.jd
deleted file mode 100644
index 6303372..0000000
--- a/docs/html/training/cloudsync/gcm.jd
+++ /dev/null
@@ -1,212 +0,0 @@
-page.title=Making the Most of Google Cloud Messaging
-
-trainingnavtop=true
-
-@jd:body
-
-<div id="tb-wrapper">
-  <div id="tb">
-    <h2>This lesson teaches you to</h2>
-    <ol>
-      <li><a href="#multicast">Send Multicast Messages Efficiently</a></li>
-      <li><a href="#collapse">Collapse Messages that can Be Replaced</a></li>
-      <li><a href="#embed">Embed Data Directly in the GCM Message</a></li>
-      <li><a href="#react">React Intelligently to GCM Messages</a></li>
-    </ol>
-    <h2>You should also read</h2>
-    <ul>
-      <li><a href="http://developer.android.com/google/gcm/index.html">Google
-      Cloud Messaging for Android</a></li>
-    </ul>
-  </div>
-</div>
-
-<p>Google Cloud Messaging (GCM) is a free service for sending
-messages to Android devices.  GCM messaging can greatly enhance the user
-experience.  Your application can stay up to date without wasting battery power
-on waking up the radio and polling the server when there are no updates.  Also,
-GCM allows you to attach up to 1,000 recipients to a single message, letting you easily contact
-large user bases quickly when appropriate, while minimizing the work load on
-your server.</p>
-
-<p>This lesson covers some of the best practices
-for integrating GCM into your application, and assumes you are already familiar
-with basic implementation of this service.  If this is not the case, you can read the <a
-  href="{@docRoot}google/gcm/demo.html">GCM demo app tutorial</a>.</p>
-
-<h2 id="multicast">Send Multicast Messages Efficiently</h2>
-<p>One of the most useful features in GCM is support for up to 1,000 recipients for
-a single message.  This capability makes it much easier to send out important messages to
-your entire user base.  For instance, let's say you had a message that needed to
-be sent to 1,000,000 of your users, and your server could handle sending out
-about 500 messages per second.  If you send each message with only a single
-recipient, it would take 1,000,000/500 = 2,000 seconds, or around half an hour.
-However, attaching 1,000 recipients to each message, the total time required to
-send a message out to 1,000,000 recipients becomes (1,000,000/1,000) / 500 = 2
-seconds. This is not only useful, but important for timely data, such as natural
-disaster alerts or sports scores, where a 30 minute interval might render the
-information useless.</p>
-
-<p>Taking advantage of this functionality is easy.  If you're using the <a
-  href="{@docRoot}google/gcm/gs.html#libs">GCM helper
-  library</a> for Java, simply provide a <code>List<String></code> collection of
-registration IDs to the <code>send</code> or <code>sendNoRetry</code> method,
-instead of a single registration ID.</p>
-
-<pre>
-// This method name is completely fabricated, but you get the idea.
-List<String> regIds = whoShouldISendThisTo(message);
-
-// If you want the SDK to automatically retry a certain number of times, use the
-// standard send method.
-MulticastResult result = sender.send(message, regIds, 5);
-
-// Otherwise, use sendNoRetry.
-MulticastResult result = sender.sendNoRetry(message, regIds);
-</pre>
-
-<p>For those implementing GCM support in a language other than Java, construct
-an HTTP POST request with the following headers:</p>
-<ul>
-  <li><code>Authorization: key=YOUR_API_KEY</code></li>
-  <li><code>Content-type: application/json</code></li>
-</ul>
-
-<p>Then encode the parameters you want into a JSON object, listing all the
-registration IDs under the key <code>registration_ids</code>.  The snippet below
-serves as an example.  All parameters except <code>registration_ids</code> are
-optional, and the items nested in <code>data</code> represent the user-defined payload, not
-GCM-defined parameters.  The endpoint for this HTTP POST message will be
-<code>https://android.googleapis.com/gcm/send</code>.</p>
-
-<pre>
-{ "collapse_key": "score_update",
-   "time_to_live": 108,
-   "delay_while_idle": true,
-   "data": {
-       "score": "4 x 8",
-       "time": "15:16.2342"
-   },
-   "registration_ids":["4", "8", "15", "16", "23", "42"]
-}
-</pre>
-
-<p>For a more thorough overview of the format of multicast GCM messages, see the <a
-  href="{@docRoot}google/gcm/gcm.html#send-msg">Sending
-  Messages</a> section of the GCM guide.</pre>
-
-<h2 id="collapse">Collapse Messages that Can Be Replaced</h2>
-<p>GCM messages are often a tickle, telling the mobile application to
-contact the server for fresh data.  In GCM, it's possible (and recommended) to
-create collapsible messages for this situation, wherein new messages replace
-older ones.  Let's take the example
-of sports scores.  If you send out a message to all users following a certain
-game with the updated score, and then 15 minutes later an updated score message
-goes out, the earlier one no longer matters.  For any users who haven't received
-the first message yet, there's no reason to send both, and force the device to
-react (and possibly alert the user) twice when only one of the messages is still
-important.</p>
-
-<p>When you define a collapse key, when multiple messages are queued up in the GCM
-servers for the same user, only the last one with any given collapse key is
-delivered.  For a situation like with sports scores, this saves the device from
-doing needless work and potentially over-notifying the user.  For situations
-that involve a server sync (like checking email), this can cut down on the
-number of syncs the device has to do.  For instance, if there are 10 emails
-waiting on the server, and ten "new email" GCM tickles have been sent to the
-device, it only needs one, since it should only sync once.</p>
-
-<p>In order to use this feature, just add a collapse key to your outgoing
-message.  If you're using the GCM helper library, use the Message class's <code>collapseKey(String key)</code> method.</p>
-
-<pre>
-Message message = new Message.Builder(regId)
-    .collapseKey("game4_scores") // The key for game 4.
-    .ttl(600) // Time in seconds to keep message queued if device offline.
-    .delayWhileIdle(true) // Wait for device to become active before sending.
-    .addPayload("key1", "value1")
-    .addPayload("key2", "value2")
-    .build();
-</pre>
-
-<p>If not using the helper library, simply add a variable to the
-POST header you're constructing, with <code>collapse_key</code> as the field
-name, and the string you're using for that set of updates as the value.</p>
-
-
-
-<h2 id="embed">Embed Data Directly in the GCM Message</h2>
-<p>Often, GCM messages are meant to be a tickle, or indication to the device
-that there's fresh data waiting on a server somewhere.  However, a GCM message
-can be up to 4kb in size, so sometimes it makes sense to simply send the
-data within the GCM message itself, so that the device doesn't need to contact the
-server at all.  Consider this approach for situations where all of the
-following statements are true:
-<ul>
-  <li>The total data fits inside the 4kb limit.</li>
-  <li>Each message is important, and should be preserved.</li>
-  <li>It doesn't make sense to collapse multiple GCM messages into a single
-  "new data on the server" tickle.</li>
-</ul>
-
-<p>For instance, short messages or encoded player moves
-in a turn-based network game are examples of good use-cases for data to embed directly
-into a GCM message. Email is an example of a bad use-case, since messages are
-often larger than 4kb,
-and users don't need a GCM message for each email waiting for them on
-the server.</p>
-
-<p>Also consider this approach when sending
-multicast messages, so you don't tell every device across your user base to hit
-your server for updates simultaneously.</p>
-<p>This strategy isn't appropriate for sending large amounts of data, for a few
-reasons:</p>
-<ul>
-  <li>Rate limits are in place to prevent malicious or poorly coded apps from spamming an
-  individual device with messages.</li>
-  <li>Messages aren't guaranteed to arrive in-order.</li>
-  <li>Messages aren't guaranteed to arrive as fast as you send them out.  Even
-  if the device receives one GCM message a second, at a max of 1K, that's 8kbps, or
-  about the speed of home dial-up internet in the early 1990's.  Your app rating
-  on Google Play will reflect having done that to your users.</p>
-</ul>
-
-<p>When used appropriately, directly embedding data in the GCM message can speed
-up the perceived speediness of your application, by letting it skip a round trip
-to the server.</p>
-
-<h2 id="react">React Intelligently to GCM Messages</h2>
-<p>Your application should not only react to incoming GCM messages, but react
-<em>intelligently</em>.  How to react depends on the context.</p>
-
-<h3>Don't be irritating</h3>
-<p>When it comes to alerting your user of fresh data, it's easy to cross the line
-from "useful" to "annoying".  If your application uses status bar notifications,
-<a
-  href="http://developer.android.com/guide/topics/ui/notifiers/notifications.html#Updating">update
-  your existing notification</a> instead of creating a second one. If you
-beep or vibrate to alert the user, consider setting up a timer.  Don't let the
-application alert more than once a minute, lest users be tempted to uninstall
-your application, turn the device off, or toss it in a nearby river.</p>
-
-<h3>Sync smarter, not harder</h3>
-<p>When using GCM as an indicator to the device that data needs to be downloaded
-from the server, remember you have 4kb of metadata you can send along to
-help your application be smart about it.  For instance, if you have a feed
-reading app, and your user has 100 feeds that they follow, help the device be
-smart about what it downloads from the server!  Look at the following examples
-of what metadata is sent to your application in the GCM payload, and how the application
-can react:</p>
-<ul>
-  <li><code>refresh</code> &mdash; Your app basically got told to request a dump of
-  every feed it follows.  Your app would either need to send feed requests to 100 different servers, or
-  if you have an aggregator on your server, send a request to retrieve, bundle
-  and
-  transmit recent data from 100 different feeds, every time one updates.</li>
-  <li><code>refresh</code>, <code>feedID</code> &mdash; Better:  Your app knows to check
-  a specific feed for updates.</li>
-  <li><code>refresh</code>, <code>feedID</code>, <code>timestamp</code> &mdash;
-  Best:  If the user happened to manually refresh before the GCM message
-  arrived, the application can compare timestamps of the most recent post, and
-  determine that it <em>doesn't need to do anything</em>.
-</ul>
diff --git a/docs/html/training/cloudsync/index.jd b/docs/html/training/cloudsync/index.jd
index cf7117c..082ace5 100644
--- a/docs/html/training/cloudsync/index.jd
+++ b/docs/html/training/cloudsync/index.jd
@@ -21,10 +21,8 @@
 service, making sure all your devices always stay in sync, and your valuable
 data is always backed up to the cloud.</p>
 
-<p>This class covers different strategies for cloud enabled applications.  It
-covers syncing data with the cloud using your own back-end web application, and
-backing up data using the cloud so that users can restore their data when
-installing your application on a new device.
+<p>This class covers strategies for backing up data using the cloud so that
+users can restore their data when installing your application on a new device.
 </p>
 
 <h2>Lessons</h2>
@@ -34,9 +32,5 @@
   <dd>Learn how to integrate the Backup API into your Android Application, so
   that user data such as preferences, notes, and high scores update seamlessly
   across all of a user's devices</dd>
-  <dt><strong><a href="gcm.html">Making the Most of Google Cloud Messaging</a></strong></dt>
-  <dd>Learn how to efficiently send multicast messages, react intelligently to
-  incoming Google Cloud Messaging (GCM) messages, and use GCM messages to
-  efficiently sync with the server.</dd>
 </dl>
 
diff --git a/docs/html/training/training_toc.cs b/docs/html/training/training_toc.cs
index 0baef14..ccefe72 100644
--- a/docs/html/training/training_toc.cs
+++ b/docs/html/training/training_toc.cs
@@ -596,10 +596,6 @@
             Using the Backup API
           </a>
           </li>
-          <li><a href="<?cs var:toroot ?>training/cloudsync/gcm.html">
-            Making the Most of Google Cloud Messaging
-          </a>
-          </li>
         </ul>
         <li><a href="<?cs var:toroot ?>training/cloudsave/conflict-res.html"
            description=
diff --git a/graphics/java/android/graphics/BitmapShader.java b/graphics/java/android/graphics/BitmapShader.java
index bd74bc8..9211225 100644
--- a/graphics/java/android/graphics/BitmapShader.java
+++ b/graphics/java/android/graphics/BitmapShader.java
@@ -16,6 +16,8 @@
 
 package android.graphics;
 
+import android.annotation.NonNull;
+
 /**
  * Shader used to draw a bitmap as a texture. The bitmap can be repeated or
  * mirrored by setting the tiling mode.
@@ -38,7 +40,7 @@
      * @param tileX             The tiling mode for x to draw the bitmap in.
      * @param tileY             The tiling mode for y to draw the bitmap in.
      */
-    public BitmapShader(Bitmap bitmap, TileMode tileX, TileMode tileY) {
+    public BitmapShader(@NonNull Bitmap bitmap, TileMode tileX, TileMode tileY) {
         mBitmap = bitmap;
         mTileX = tileX;
         mTileY = tileY;
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 392a5b6..7386637 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -1728,8 +1728,7 @@
      * @param contextIndex the start of the context for shaping.  Must be
      *         no greater than index.
      * @param contextCount the number of characters in the context for shaping.
-     *         contexIndex + contextCount must be no less than index
-     *         + count.
+     *         contexIndex + contextCount must be no less than index + count.
      * @param x the x position at which to draw the text
      * @param y the y position at which to draw the text
      * @param isRtl whether the run is in RTL direction
@@ -1744,12 +1743,14 @@
         if (paint == null) {
             throw new NullPointerException("paint is null");
         }
-        if ((index | count | text.length - index - count) < 0) {
+        if ((index | count | contextIndex | contextCount | index - contextIndex
+                | (contextIndex + contextCount) - (index + count)
+                | text.length - (contextIndex + contextCount)) < 0) {
             throw new IndexOutOfBoundsException();
         }
 
-        native_drawTextRun(mNativeCanvasWrapper, text, index, count,
-                contextIndex, contextCount, x, y, isRtl, paint.getNativeInstance(), paint.mNativeTypeface);
+        native_drawTextRun(mNativeCanvasWrapper, text, index, count, contextIndex, contextCount,
+                x, y, isRtl, paint.getNativeInstance(), paint.mNativeTypeface);
     }
 
     /**
@@ -1796,14 +1797,15 @@
         if (paint == null) {
             throw new NullPointerException("paint is null");
         }
-        if ((start | end | end - start | text.length() - end) < 0) {
+        if ((start | end | contextStart | contextEnd | start - contextStart | end - start
+                | contextEnd - end | text.length() - contextEnd) < 0) {
             throw new IndexOutOfBoundsException();
         }
 
         if (text instanceof String || text instanceof SpannedString ||
                 text instanceof SpannableString) {
-            native_drawTextRun(mNativeCanvasWrapper, text.toString(), start, end,
-                    contextStart, contextEnd, x, y, isRtl, paint.getNativeInstance(), paint.mNativeTypeface);
+            native_drawTextRun(mNativeCanvasWrapper, text.toString(), start, end, contextStart,
+                    contextEnd, x, y, isRtl, paint.getNativeInstance(), paint.mNativeTypeface);
         } else if (text instanceof GraphicsOperations) {
             ((GraphicsOperations) text).drawTextRun(this, start, end,
                     contextStart, contextEnd, x, y, isRtl, paint);
diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java
index 35fcda6..6a08368 100644
--- a/keystore/java/android/security/KeyStore.java
+++ b/keystore/java/android/security/KeyStore.java
@@ -108,15 +108,10 @@
     }
 
     public static Context getApplicationContext() {
-        ActivityThread activityThread = ActivityThread.currentActivityThread();
-        if (activityThread == null) {
-            throw new IllegalStateException(
-                    "Failed to obtain application Context: no ActivityThread");
-        }
-        Application application = activityThread.getApplication();
+        Application application = ActivityThread.currentApplication();
         if (application == null) {
             throw new IllegalStateException(
-                    "Failed to obtain application Context: no Application");
+                    "Failed to obtain application Context from ActivityThread");
         }
         return application;
     }
@@ -698,16 +693,13 @@
     }
 
     private long getFingerprintOnlySid() {
-        FingerprintManager fingerprintManager =
-                mContext.getSystemService(FingerprintManager.class);
+        FingerprintManager fingerprintManager = mContext.getSystemService(FingerprintManager.class);
         if (fingerprintManager == null) {
             return 0;
         }
 
-        if (!fingerprintManager.isHardwareDetected()) {
-            return 0;
-        }
-
+        // TODO: Restore USE_FINGERPRINT permission check in
+        // FingerprintManager.getAuthenticatorId once the ID is no longer needed here.
         return fingerprintManager.getAuthenticatorId();
     }
 
diff --git a/keystore/java/android/security/keystore/KeymasterUtils.java b/keystore/java/android/security/keystore/KeymasterUtils.java
index 0639d49..4b37d90 100644
--- a/keystore/java/android/security/keystore/KeymasterUtils.java
+++ b/keystore/java/android/security/keystore/KeymasterUtils.java
@@ -101,13 +101,10 @@
             // fingerprint-only auth.
             FingerprintManager fingerprintManager =
                     KeyStore.getApplicationContext().getSystemService(FingerprintManager.class);
-            if ((fingerprintManager == null) || (!fingerprintManager.isHardwareDetected())) {
-                throw new IllegalStateException(
-                        "This device does not support keys which require authentication for every"
-                        + " use -- this requires fingerprint authentication which is not"
-                        + " available on this device");
-            }
-            long fingerprintOnlySid = fingerprintManager.getAuthenticatorId();
+            // TODO: Restore USE_FINGERPRINT permission check in
+            // FingerprintManager.getAuthenticatorId once the ID is no longer needed here.
+            long fingerprintOnlySid =
+                    (fingerprintManager != null) ? fingerprintManager.getAuthenticatorId() : 0;
             if (fingerprintOnlySid == 0) {
                 throw new IllegalStateException(
                         "At least one fingerprint must be enrolled to create keys requiring user"
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp
index 49614bd..635fa11 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/media/jni/android_media_ImageReader.cpp
@@ -72,6 +72,12 @@
     jmethodID ctor;
 } gSurfacePlaneClassInfo;
 
+// Get an ID that's unique within this process.
+static int32_t createProcessUniqueId() {
+    static volatile int32_t globalCounter = 0;
+    return android_atomic_inc(&globalCounter);
+}
+
 // ----------------------------------------------------------------------------
 
 class JNIImageReaderContext : public ConsumerBase::FrameAvailableListener
@@ -808,6 +814,9 @@
     sp<ConsumerBase> consumer;
     sp<CpuConsumer> cpuConsumer;
     sp<BufferItemConsumer> opaqueConsumer;
+    String8 consumerName = String8::format("ImageReader-%dx%df%xm%d-%d-%d",
+            width, height, format, maxImages, getpid(),
+            createProcessUniqueId());
     if (isFormatOpaque(nativeFormat)) {
         // Use the SW_READ_NEVER usage to tell producer that this format is not for preview or video
         // encoding. The only possibility will be ZSL output.
@@ -819,6 +828,7 @@
             return;
         }
         ctx->setOpaqueConsumer(opaqueConsumer);
+        opaqueConsumer->setName(consumerName);
         consumer = opaqueConsumer;
     } else {
         cpuConsumer = new CpuConsumer(gbConsumer, maxImages, /*controlledByApp*/true);
@@ -828,6 +838,7 @@
             return;
         }
         ctx->setCpuConsumer(cpuConsumer);
+        cpuConsumer->setName(consumerName);
         consumer = cpuConsumer;
     }
 
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
index e6a89f1..273f166 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -117,6 +117,7 @@
     private static final int MSG_FINGERPRINT_AUTH_FAILED = 326;
     private static final int MSG_FACE_UNLOCK_STATE_CHANGED = 327;
     private static final int MSG_SIM_SUBSCRIPTION_INFO_CHANGED = 328;
+    private static final int MSG_AIRPLANE_MODE_CHANGED = 329;
 
     private static KeyguardUpdateMonitor sInstance;
 
@@ -222,6 +223,9 @@
                 case MSG_SIM_SUBSCRIPTION_INFO_CHANGED:
                     handleSimSubscriptionInfoChanged();
                     break;
+                case MSG_AIRPLANE_MODE_CHANGED:
+                    handleAirplaneModeChanged();
+                    break;
             }
         }
     };
@@ -305,6 +309,15 @@
         }
     }
 
+    private void handleAirplaneModeChanged() {
+        for (int j = 0; j < mCallbacks.size(); j++) {
+            KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get();
+            if (cb != null) {
+                cb.onRefreshCarrierInfo();
+            }
+        }
+    }
+
     /** @return List of SubscriptionInfo records, maybe empty but never null */
     List<SubscriptionInfo> getSubscriptionInfo(boolean forceReload) {
         List<SubscriptionInfo> sil = mSubscriptionInfo;
@@ -486,6 +499,8 @@
             } else if (TelephonyManager.ACTION_PHONE_STATE_CHANGED.equals(action)) {
                 String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
                 mHandler.sendMessage(mHandler.obtainMessage(MSG_PHONE_STATE_CHANGED, state));
+            } else if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) {
+                mHandler.sendEmptyMessage(MSG_AIRPLANE_MODE_CHANGED);
             } else if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
                 dispatchBootCompleted();
             }
@@ -721,6 +736,7 @@
         filter.addAction(Intent.ACTION_TIME_CHANGED);
         filter.addAction(Intent.ACTION_BATTERY_CHANGED);
         filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
+        filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
         filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
         filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
         filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 1dba942e..5137e1b 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -516,7 +516,7 @@
     }
 
     private void dumpSettings(Cursor cursor, PrintWriter pw) {
-        if (!cursor.moveToFirst()) {
+        if (cursor == null || !cursor.moveToFirst()) {
             return;
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index 49eb9b2..c8212c2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -404,7 +404,9 @@
                 ((TileRecord) r).openingDetail = true;
             }
         } else {
-            MetricsLogger.hidden(mContext, mDetailRecord.detailAdapter.getMetricsCategory());
+            if (mDetailRecord != null) {
+                MetricsLogger.hidden(mContext, mDetailRecord.detailAdapter.getMetricsCategory());
+            }
             mClosingDetail = true;
             setGridContentVisibility(true);
             listener = mTeardownDetailWhenDone;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
index 296538c..08a6603 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
@@ -353,8 +353,8 @@
     @Override
     public void getBoundsOnScreen(Rect outRect, boolean clipToParent) {
         super.getBoundsOnScreen(outRect, clipToParent);
-        outRect.bottom = (int) (outRect.top + getActualHeight());
-        outRect.top += getClipTopAmount();
+        outRect.bottom = outRect.top + getActualHeight();
+        outRect.top += getClipTopOptimization();
     }
 
     public int getContentHeight() {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
index 49278c5..aa891b6 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
@@ -17,6 +17,7 @@
 package com.android.systemui.volume;
 
 import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
+import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_GENERIC;
 
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.animation.LayoutTransition;
@@ -422,17 +423,15 @@
 
     protected void rescheduleTimeoutH() {
         mHandler.removeMessages(H.DISMISS);
-        int timeout = -1;
-        if (!mAccessibility.mFeedbackEnabled) {
-            timeout = computeTimeoutH();
-            mHandler.sendMessageDelayed(mHandler
-                    .obtainMessage(H.DISMISS, Events.DISMISS_REASON_TIMEOUT, 0), timeout);
-        }
+        final int timeout = computeTimeoutH();
+        mHandler.sendMessageDelayed(mHandler
+                .obtainMessage(H.DISMISS, Events.DISMISS_REASON_TIMEOUT, 0), timeout);
         if (D.BUG) Log.d(TAG, "rescheduleTimeout " + timeout + " " + Debug.getCaller());
         mController.userActivity();
     }
 
     private int computeTimeoutH() {
+        if (mAccessibility.mFeedbackEnabled) return 20000;
         if (mSafetyWarning != null) return 5000;
         if (mExpanded || mExpanding) return 5000;
         if (mActiveStream == AudioManager.STREAM_MUSIC) return 1500;
@@ -959,7 +958,7 @@
         }
     }
 
-    private final class Accessibility {
+    private final class Accessibility extends AccessibilityDelegate {
         private AccessibilityManager mMgr;
         private boolean mFeedbackEnabled;
 
@@ -976,14 +975,7 @@
                     updateFeedbackEnabled();
                 }
             });
-            mDialogView.setAccessibilityDelegate(new AccessibilityDelegate() {
-                @Override
-                public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
-                        AccessibilityEvent event) {
-                    rescheduleTimeoutH();
-                    return super.onRequestSendAccessibilityEvent(host, child, event);
-                }
-            });
+            mDialogView.setAccessibilityDelegate(this);
             mMgr.addAccessibilityStateChangeListener(new AccessibilityStateChangeListener() {
                 @Override
                 public void onAccessibilityStateChanged(boolean enabled) {
@@ -993,15 +985,23 @@
             updateFeedbackEnabled();
         }
 
+        @Override
+        public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
+                AccessibilityEvent event) {
+            rescheduleTimeoutH();
+            return super.onRequestSendAccessibilityEvent(host, child, event);
+        }
+
         private void updateFeedbackEnabled() {
             mFeedbackEnabled = computeFeedbackEnabled();
         }
 
         private boolean computeFeedbackEnabled() {
+            // are there any enabled non-generic a11y services?
             final List<AccessibilityServiceInfo> services =
                     mMgr.getEnabledAccessibilityServiceList(FEEDBACK_ALL_MASK);
             for (AccessibilityServiceInfo asi : services) {
-                if ((asi.feedbackType & FEEDBACK_ALL_MASK) != 0) {
+                if (asi.feedbackType != 0 && asi.feedbackType != FEEDBACK_GENERIC) {
                     return true;
                 }
             }
diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java
index 4c7b523..ad34b37 100644
--- a/services/core/java/com/android/server/DeviceIdleController.java
+++ b/services/core/java/com/android/server/DeviceIdleController.java
@@ -22,6 +22,7 @@
 import android.app.AppGlobals;
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -29,12 +30,14 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.database.ContentObserver;
 import android.hardware.Sensor;
 import android.hardware.SensorManager;
 import android.hardware.TriggerEvent;
 import android.hardware.TriggerEventListener;
 import android.hardware.display.DisplayManager;
 import android.net.INetworkPolicyManager;
+import android.net.Uri;
 import android.os.Binder;
 import android.os.Environment;
 import android.os.FileUtils;
@@ -48,11 +51,11 @@
 import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.os.UserHandle;
+import android.provider.Settings;
 import android.util.ArrayMap;
 import android.util.ArraySet;
-import android.util.Log;
+import android.util.KeyValueListParser;
 import android.util.Slog;
-import android.util.SparseArray;
 import android.util.SparseBooleanArray;
 import android.util.SparseLongArray;
 import android.util.TimeUtils;
@@ -62,7 +65,6 @@
 import com.android.internal.app.IBatteryStats;
 import com.android.internal.os.AtomicFile;
 import com.android.internal.os.BackgroundThread;
-import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.FastXmlSerializer;
 import com.android.internal.util.XmlUtils;
 import com.android.server.am.BatteryStatsService;
@@ -103,84 +105,7 @@
 
     // TODO: These need to be moved to system settings.
 
-    /**
-     * This is the time, after becoming inactive, at which we start looking at the
-     * motion sensor to determine if the device is being left alone.  We don't do this
-     * immediately after going inactive just because we don't want to be continually running
-     * the significant motion sensor whenever the screen is off.
-     */
 
-    private static final long DEFAULT_INACTIVE_TIMEOUT = !COMPRESS_TIME ? 30*60*1000L
-            : 3 * 60 * 1000L;
-
-    /**
-     * If we don't receive a callback from AnyMotion in this amount of time, we will change from
-     * STATE_SENSING to STATE_INACTIVE, and any AnyMotion callbacks while not in STATE_SENSING will
-     * be ignored.
-     */
-    private static final long DEFAULT_SENSING_TIMEOUT = !DEBUG ? 5 * 60 * 1000L : 60 * 1000L;
-
-    /**
-     * This is the time, after seeing motion, that we wait after becoming inactive from
-     * that until we start looking for motion again.
-     */
-    private static final long DEFAULT_MOTION_INACTIVE_TIMEOUT = !COMPRESS_TIME ? 10*60*1000L
-            : 60 * 1000L;
-
-    /**
-     * This is the time, after the inactive timeout elapses, that we will wait looking
-     * for significant motion until we truly consider the device to be idle.
-     */
-
-    private static final long DEFAULT_IDLE_AFTER_INACTIVE_TIMEOUT = !COMPRESS_TIME ? 30*60*1000L
-            : 3 * 60 * 1000L;
-
-    /**
-     * This is the initial time, after being idle, that we will allow ourself to be back
-     * in the IDLE_PENDING state allowing the system to run normally until we return to idle.
-     */
-
-    private static final long DEFAULT_IDLE_PENDING_TIMEOUT = !COMPRESS_TIME ? 5*60*1000L
-            : 30 * 1000L;
-
-    /**
-     * Maximum pending idle timeout (time spent running) we will be allowed to use.
-     */
-    private static final long DEFAULT_MAX_IDLE_PENDING_TIMEOUT = !COMPRESS_TIME ? 10*60*1000L
-            : 60 * 1000L;
-    /**
-     * Scaling factor to apply to current pending idle timeout each time we cycle through
-     * that state.
-     */
-    private static final float DEFAULT_IDLE_PENDING_FACTOR = 2f;
-    /**
-     * This is the initial time that we want to sit in the idle state before waking up
-     * again to return to pending idle and allowing normal work to run.
-     */
-
-    private static final long DEFAULT_IDLE_TIMEOUT = !COMPRESS_TIME ? 60*60*1000L
-            : 6 * 60 * 1000L;
-
-    /**
-     * Maximum idle duration we will be allowed to use.
-     */
-    private static final long DEFAULT_MAX_IDLE_TIMEOUT = !COMPRESS_TIME ? 6*60*60*1000L
-            : 30 * 60 * 1000L;
-    /**
-     * Scaling factor to apply to current idle timeout each time we cycle through that state.
-     */
-    private static final float DEFAULT_IDLE_FACTOR = 2f;
-    /**
-     * This is the minimum time we will allow until the next upcoming alarm for us to
-     * actually go in to idle mode.
-     */
-    private static final long DEFAULT_MIN_TIME_TO_ALARM = !COMPRESS_TIME ? 60*60*1000L
-            : 6 * 60 * 1000L;
-
-    /**
-     * Max amount of time to temporarily whitelist an app when it receives a high priority tickle.
-     */
-    private static final long MAX_TEMP_APP_WHITELIST_DURATION = 5 * 60 * 1000L;
 
     private AlarmManager mAlarmManager;
     private IBatteryStats mBatteryStats;
@@ -306,6 +231,230 @@
         }
     };
 
+    /**
+     * All times are in milliseconds. These constants are kept synchronized with the system
+     * global Settings. Any access to this class or its fields should be done while
+     * holding the DeviceIdleController lock.
+     */
+    private class Constants extends ContentObserver {
+        // Key names stored in the settings value.
+        private static final String KEY_INACTIVE_TIMEOUT = "inactive_to";
+        private static final String KEY_SENSING_TIMEOUT = "sensing_to";
+        private static final String KEY_MOTION_INACTIVE_TIMEOUT = "motion_inactive_to";
+        private static final String KEY_IDLE_AFTER_INACTIVE_TIMEOUT = "idle_after_inactive_to";
+        private static final String KEY_IDLE_PENDING_TIMEOUT = "idle_pending_to";
+        private static final String KEY_MAX_IDLE_PENDING_TIMEOUT = "max_idle_pending_to";
+        private static final String KEY_IDLE_PENDING_FACTOR = "idle_pending_factor";
+        private static final String KEY_IDLE_TIMEOUT = "idle_to";
+        private static final String KEY_MAX_IDLE_TIMEOUT = "max_idle_to";
+        private static final String KEY_IDLE_FACTOR = "idle_factor";
+        private static final String KEY_MIN_TIME_TO_ALARM = "min_time_to_alarm";
+        private static final String KEY_MAX_TEMP_APP_WHITELIST_DURATION =
+                "max_temp_app_whitelist_duration";
+
+        /**
+         * This is the time, after becoming inactive, at which we start looking at the
+         * motion sensor to determine if the device is being left alone.  We don't do this
+         * immediately after going inactive just because we don't want to be continually running
+         * the significant motion sensor whenever the screen is off.
+         * @see Settings.Global#DEVICE_IDLE_CONSTANTS
+         * @see #KEY_INACTIVE_TIMEOUT
+         */
+        public long INACTIVE_TIMEOUT;
+
+        /**
+         * If we don't receive a callback from AnyMotion in this amount of time, we will change from
+         * STATE_SENSING to STATE_INACTIVE, and any AnyMotion callbacks while not in STATE_SENSING
+         * will be ignored.
+         * @see Settings.Global#DEVICE_IDLE_CONSTANTS
+         * @see #KEY_SENSING_TIMEOUT
+         */
+        public long SENSING_TIMEOUT;
+
+        /**
+         * This is the time, after seeing motion, that we wait after becoming inactive from
+         * that until we start looking for motion again.
+         * @see Settings.Global#DEVICE_IDLE_CONSTANTS
+         * @see #KEY_MOTION_INACTIVE_TIMEOUT
+         */
+        public long MOTION_INACTIVE_TIMEOUT;
+
+        /**
+         * This is the time, after the inactive timeout elapses, that we will wait looking
+         * for significant motion until we truly consider the device to be idle.
+         * @see Settings.Global#DEVICE_IDLE_CONSTANTS
+         * @see #KEY_IDLE_AFTER_INACTIVE_TIMEOUT
+         */
+        public long IDLE_AFTER_INACTIVE_TIMEOUT;
+
+        /**
+         * This is the initial time, after being idle, that we will allow ourself to be back
+         * in the IDLE_PENDING state allowing the system to run normally until we return to idle.
+         * @see Settings.Global#DEVICE_IDLE_CONSTANTS
+         * @see #KEY_IDLE_PENDING_TIMEOUT
+         */
+        public long IDLE_PENDING_TIMEOUT;
+
+        /**
+         * Maximum pending idle timeout (time spent running) we will be allowed to use.
+         * @see Settings.Global#DEVICE_IDLE_CONSTANTS
+         * @see #KEY_MAX_IDLE_PENDING_TIMEOUT
+         */
+        public long MAX_IDLE_PENDING_TIMEOUT;
+
+        /**
+         * Scaling factor to apply to current pending idle timeout each time we cycle through
+         * that state.
+         * @see Settings.Global#DEVICE_IDLE_CONSTANTS
+         * @see #KEY_IDLE_PENDING_FACTOR
+         */
+        public float IDLE_PENDING_FACTOR;
+
+        /**
+         * This is the initial time that we want to sit in the idle state before waking up
+         * again to return to pending idle and allowing normal work to run.
+         * @see Settings.Global#DEVICE_IDLE_CONSTANTS
+         * @see #KEY_IDLE_TIMEOUT
+         */
+        public long IDLE_TIMEOUT;
+
+        /**
+         * Maximum idle duration we will be allowed to use.
+         * @see Settings.Global#DEVICE_IDLE_CONSTANTS
+         * @see #KEY_MAX_IDLE_TIMEOUT
+         */
+        public long MAX_IDLE_TIMEOUT;
+
+        /**
+         * Scaling factor to apply to current idle timeout each time we cycle through that state.
+          * @see Settings.Global#DEVICE_IDLE_CONSTANTS
+         * @see #KEY_IDLE_FACTOR
+         */
+        public float IDLE_FACTOR;
+
+        /**
+         * This is the minimum time we will allow until the next upcoming alarm for us to
+         * actually go in to idle mode.
+         * @see Settings.Global#DEVICE_IDLE_CONSTANTS
+         * @see #KEY_MIN_TIME_TO_ALARM
+         */
+        public long MIN_TIME_TO_ALARM;
+
+        /**
+         * Max amount of time to temporarily whitelist an app when it receives a high priority
+         * tickle.
+         * @see Settings.Global#DEVICE_IDLE_CONSTANTS
+         * @see #KEY_MAX_TEMP_APP_WHITELIST_DURATION
+         */
+        public long MAX_TEMP_APP_WHITELIST_DURATION;
+
+        private final ContentResolver mResolver;
+        private final KeyValueListParser mParser = new KeyValueListParser(',');
+
+        public Constants(Handler handler, ContentResolver resolver) {
+            super(handler);
+            mResolver = resolver;
+            mResolver.registerContentObserver(
+                    Settings.Global.getUriFor(Settings.Global.DEVICE_IDLE_CONSTANTS), false, this);
+            updateConstants();
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            updateConstants();
+        }
+
+        private void updateConstants() {
+            synchronized (DeviceIdleController.this) {
+                try {
+                    mParser.setString(Settings.Global.getString(mResolver,
+                            Settings.Global.DEVICE_IDLE_CONSTANTS));
+                } catch (IllegalArgumentException e) {
+                    // Failed to parse the settings string, log this and move on
+                    // with defaults.
+                    Slog.e(TAG, "Bad device idle settings", e);
+                }
+
+                INACTIVE_TIMEOUT = mParser.getLong(KEY_INACTIVE_TIMEOUT,
+                        !COMPRESS_TIME ? 30 * 60 * 1000L : 3 * 60 * 1000L);
+                SENSING_TIMEOUT = mParser.getLong(KEY_SENSING_TIMEOUT,
+                        !DEBUG ? 5 * 60 * 1000L : 60 * 1000L);
+                MOTION_INACTIVE_TIMEOUT = mParser.getLong(KEY_MOTION_INACTIVE_TIMEOUT,
+                        !COMPRESS_TIME ? 10 * 60 * 1000L : 60 * 1000L);
+                IDLE_AFTER_INACTIVE_TIMEOUT = mParser.getLong(KEY_IDLE_AFTER_INACTIVE_TIMEOUT,
+                        !COMPRESS_TIME ? 30 * 60 * 1000L : 3 * 60 * 1000L);
+                IDLE_PENDING_TIMEOUT = mParser.getLong(KEY_IDLE_PENDING_TIMEOUT,
+                        !COMPRESS_TIME ? 5 * 60 * 1000L : 30 * 1000L);
+                MAX_IDLE_PENDING_TIMEOUT = mParser.getLong(KEY_MAX_IDLE_PENDING_TIMEOUT,
+                        !COMPRESS_TIME ? 10 * 60 * 1000L : 60 * 1000L);
+                IDLE_PENDING_FACTOR = mParser.getFloat(KEY_IDLE_PENDING_FACTOR,
+                        2f);
+                IDLE_TIMEOUT = mParser.getLong(KEY_IDLE_TIMEOUT,
+                        !COMPRESS_TIME ? 60 * 60 * 1000L : 6 * 60 * 1000L);
+                MAX_IDLE_TIMEOUT = mParser.getLong(KEY_MAX_IDLE_TIMEOUT,
+                        !COMPRESS_TIME ? 6 * 60 * 60 * 1000L : 30 * 60 * 1000L);
+                IDLE_FACTOR = mParser.getFloat(KEY_IDLE_FACTOR,
+                        2f);
+                MIN_TIME_TO_ALARM = mParser.getLong(KEY_MIN_TIME_TO_ALARM,
+                        !COMPRESS_TIME ? 60 * 60 * 1000L : 6 * 60 * 1000L);
+                MAX_TEMP_APP_WHITELIST_DURATION = mParser.getLong(KEY_MAX_TEMP_APP_WHITELIST_DURATION,
+                        5 * 60 * 1000L);
+            }
+        }
+
+        void dump(PrintWriter pw) {
+            pw.println("  Settings:");
+
+            pw.print("    DOZE_INACTIVE_TIMEOUT=");
+            TimeUtils.formatDuration(INACTIVE_TIMEOUT, pw);
+            pw.println();
+
+            pw.print("    DOZE_SENSING_TIMEOUT=");
+            TimeUtils.formatDuration(SENSING_TIMEOUT, pw);
+            pw.println();
+
+            pw.print("    DOZE_MOTION_INACTIVE_TIMEOUT=");
+            TimeUtils.formatDuration(MOTION_INACTIVE_TIMEOUT, pw);
+            pw.println();
+
+            pw.print("    DOZE_IDLE_AFTER_INACTIVE_TIMEOUT=");
+            TimeUtils.formatDuration(IDLE_AFTER_INACTIVE_TIMEOUT, pw);
+            pw.println();
+
+            pw.print("    DOZE_IDLE_PENDING_TIMEOUT=");
+            TimeUtils.formatDuration(IDLE_PENDING_TIMEOUT, pw);
+            pw.println();
+
+            pw.print("    DOZE_MAX_IDLE_PENDING_TIMEOUT=");
+            TimeUtils.formatDuration(MAX_IDLE_PENDING_TIMEOUT, pw);
+            pw.println();
+
+            pw.print("    DOZE_IDLE_PENDING_FACTOR=");
+            pw.println(IDLE_PENDING_FACTOR);
+
+            pw.print("    DOZE_IDLE_TIMEOUT=");
+            TimeUtils.formatDuration(IDLE_TIMEOUT, pw);
+            pw.println();
+
+            pw.print("    DOZE_MAX_IDLE_TIMEOUT=");
+            TimeUtils.formatDuration(MAX_IDLE_TIMEOUT, pw);
+            pw.println();
+
+            pw.print("    DOZE_IDLE_FACTOR=");
+            pw.println(IDLE_FACTOR);
+
+            pw.print("    DOZE_MIN_TIME_TO_ALARM=");
+            TimeUtils.formatDuration(MIN_TIME_TO_ALARM, pw);
+            pw.println();
+
+            pw.print("    DOZE_MAX_TEMP_APP_WHITELIST_DURATION=");
+            TimeUtils.formatDuration(MAX_TEMP_APP_WHITELIST_DURATION, pw);
+            pw.println();
+        }
+    }
+
+    private Constants mConstants;
+
     @Override
     public void onAnyMotionResult(int result) {
         if (DEBUG) Slog.d(TAG, "onAnyMotionResult(" + result + ")");
@@ -474,6 +623,8 @@
                 }
             }
 
+            mConstants = new Constants(mHandler, getContext().getContentResolver());
+
             readConfigFileLocked();
             updateWhitelistAppIdsLocked();
 
@@ -482,7 +633,7 @@
             // a battery update the next time the level drops.
             mCharging = true;
             mState = STATE_ACTIVE;
-            mInactiveTimeout = DEFAULT_INACTIVE_TIMEOUT;
+            mInactiveTimeout = mConstants.INACTIVE_TIMEOUT;
         }
 
         publishBinderService(SERVICE_NAME, new BinderService());
@@ -613,14 +764,12 @@
      */
     public void addPowerSaveTempWhitelistAppInternal(String packageName, long duration,
             int userId) {
-        if (duration > MAX_TEMP_APP_WHITELIST_DURATION) {
-            duration = MAX_TEMP_APP_WHITELIST_DURATION;
-        }
         try {
             int uid = getContext().getPackageManager().getPackageUid(packageName, userId);
             int appId = UserHandle.getAppId(uid);
             final long timeNow = System.currentTimeMillis();
             synchronized (this) {
+                duration = Math.min(duration, mConstants.MAX_TEMP_APP_WHITELIST_DURATION);
                 long currentEndTime = mTempWhitelistAppIdEndTimes.get(appId);
                 // Set the new end time
                 mTempWhitelistAppIdEndTimes.put(appId, timeNow + duration);
@@ -704,7 +853,7 @@
             EventLogTags.writeDeviceIdle(STATE_ACTIVE, reason);
             scheduleReportActiveLocked(false);
             mState = STATE_ACTIVE;
-            mInactiveTimeout = DEFAULT_INACTIVE_TIMEOUT;
+            mInactiveTimeout = mConstants.INACTIVE_TIMEOUT;
             mNextIdlePendingDelay = 0;
             mNextIdleDelay = 0;
             cancelAlarmLocked();
@@ -731,7 +880,7 @@
      * within the DEFAULT_SENSING_TIMEOUT, to return to STATE_INACTIVE.
      */
     void enterInactiveStateLocked() {
-        mInactiveTimeout = DEFAULT_INACTIVE_TIMEOUT;
+        mInactiveTimeout = mConstants.INACTIVE_TIMEOUT;
         becomeInactiveIfAppropriateLocked();
     }
 
@@ -740,7 +889,7 @@
         EventLogTags.writeDeviceIdleStep();
 
         final long now = SystemClock.elapsedRealtime();
-        if ((now+DEFAULT_MIN_TIME_TO_ALARM) > mAlarmManager.getNextWakeFromIdleTime()) {
+        if ((now+mConstants.MIN_TIME_TO_ALARM) > mAlarmManager.getNextWakeFromIdleTime()) {
             // Whoops, there is an upcoming alarm.  We don't actually want to go idle.
             if (mState != STATE_ACTIVE) {
                 becomeActiveLocked("alarm");
@@ -753,10 +902,10 @@
                 // We have now been inactive long enough, it is time to start looking
                 // for significant motion and sleep some more while doing so.
                 startMonitoringSignificantMotion();
-                scheduleAlarmLocked(DEFAULT_IDLE_AFTER_INACTIVE_TIMEOUT, false);
+                scheduleAlarmLocked(mConstants.IDLE_AFTER_INACTIVE_TIMEOUT, false);
                 // Reset the upcoming idle delays.
-                mNextIdlePendingDelay = DEFAULT_IDLE_PENDING_TIMEOUT;
-                mNextIdleDelay = DEFAULT_IDLE_TIMEOUT;
+                mNextIdlePendingDelay = mConstants.IDLE_PENDING_TIMEOUT;
+                mNextIdleDelay = mConstants.IDLE_TIMEOUT;
                 mState = STATE_IDLE_PENDING;
                 if (DEBUG) Slog.d(TAG, "Moved from STATE_INACTIVE to STATE_IDLE_PENDING.");
                 EventLogTags.writeDeviceIdle(mState, "step");
@@ -764,7 +913,7 @@
             case STATE_IDLE_PENDING:
                 mState = STATE_SENSING;
                 if (DEBUG) Slog.d(TAG, "Moved from STATE_IDLE_PENDING to STATE_SENSING.");
-                scheduleSensingAlarmLocked(DEFAULT_SENSING_TIMEOUT);
+                scheduleSensingAlarmLocked(mConstants.SENSING_TIMEOUT);
                 mAnyMotionDetector.checkForAnyMotion();
                 break;
             case STATE_SENSING:
@@ -773,11 +922,9 @@
                 scheduleAlarmLocked(mNextIdleDelay, true);
                 if (DEBUG) Slog.d(TAG, "Moved to STATE_IDLE. Next alarm in " + mNextIdleDelay +
                         " ms.");
-                mNextIdleDelay = (long)(mNextIdleDelay * DEFAULT_IDLE_FACTOR);
+                mNextIdleDelay = (long)(mNextIdleDelay * mConstants.IDLE_FACTOR);
                 if (DEBUG) Slog.d(TAG, "Setting mNextIdleDelay = " + mNextIdleDelay);
-                if (mNextIdleDelay > DEFAULT_MAX_IDLE_TIMEOUT) {
-                    mNextIdleDelay = DEFAULT_MAX_IDLE_TIMEOUT;
-                }
+                mNextIdleDelay = Math.min(mNextIdleDelay, mConstants.MAX_IDLE_TIMEOUT);
                 mState = STATE_IDLE;
                 mHandler.sendEmptyMessage(MSG_REPORT_IDLE_ON);
                 break;
@@ -786,10 +933,8 @@
                 scheduleAlarmLocked(mNextIdlePendingDelay, false);
                 if (DEBUG) Slog.d(TAG, "Moved from STATE_IDLE to STATE_IDLE_MAINTENANCE. " +
                         "Next alarm in " + mNextIdlePendingDelay + " ms.");
-                mNextIdlePendingDelay = (long)(mNextIdlePendingDelay*DEFAULT_IDLE_PENDING_FACTOR);
-                if (mNextIdlePendingDelay > DEFAULT_MAX_IDLE_PENDING_TIMEOUT) {
-                    mNextIdlePendingDelay = DEFAULT_MAX_IDLE_PENDING_TIMEOUT;
-                }
+                mNextIdlePendingDelay = Math.min(mConstants.MAX_IDLE_PENDING_TIMEOUT,
+                        (long)(mNextIdlePendingDelay * mConstants.IDLE_PENDING_FACTOR));
                 mState = STATE_IDLE_MAINTENANCE;
                 EventLogTags.writeDeviceIdle(mState, "step");
                 mHandler.sendEmptyMessage(MSG_REPORT_IDLE_OFF);
@@ -807,7 +952,7 @@
         if (mState != STATE_ACTIVE) {
             scheduleReportActiveLocked(true);
             mState = STATE_ACTIVE;
-            mInactiveTimeout = DEFAULT_MOTION_INACTIVE_TIMEOUT;
+            mInactiveTimeout = mConstants.MOTION_INACTIVE_TIMEOUT;
             EventLogTags.writeDeviceIdle(mState, "motion");
             becomeInactiveIfAppropriateLocked();
         }
@@ -1179,6 +1324,9 @@
                     pw.println();
                 }
             }
+
+            mConstants.dump(pw);
+
             pw.print("  mSigMotionSensor="); pw.println(mSigMotionSensor);
             pw.print("  mCurDisplay="); pw.println(mCurDisplay);
             pw.print("  mIdleDisabled="); pw.println(mIdleDisabled);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 27656d4..6496ba2 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -2968,9 +2968,14 @@
             // should never happen).
             SparseArray<ProcessRecord> procs = mProcessNames.getMap().get(processName);
             if (procs == null) return null;
-            final int N = procs.size();
-            for (int i = 0; i < N; i++) {
-                if (UserHandle.isSameUser(procs.keyAt(i), uid)) return procs.valueAt(i);
+            final int procCount = procs.size();
+            for (int i = 0; i < procCount; i++) {
+                final int procUid = procs.keyAt(i);
+                if (UserHandle.isApp(procUid) || !UserHandle.isSameUser(procUid, uid)) {
+                    // Don't use an app process or different user process for system component.
+                    continue;
+                }
+                return procs.valueAt(i);
             }
         }
         ProcessRecord proc = mProcessNames.get(processName, uid);
@@ -18619,7 +18624,7 @@
             if (packages != null) {
                 for (int i = 0; i < packages.length; i++) {
                     mUsageStatsService.reportEvent(packages[i], app.userId,
-                            UsageEvents.Event.INTERACTION);
+                            UsageEvents.Event.SYSTEM_INTERACTION);
                 }
             }
         }
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
index b0d5765..7f0be57 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java
@@ -706,9 +706,22 @@
 
         @Override // Binder call
         public long getAuthenticatorId(String opPackageName) {
-            if (!canUseFingerprint(opPackageName)) {
-                return 0;
-            }
+            // In this method, we're not checking whether the caller is permitted to use fingerprint
+            // API because current authenticator ID is leaked (in a more contrived way) via Android
+            // Keystore (android.security.keystore package): the user of that API can create a key
+            // which requires fingerprint authentication for its use, and then query the key's
+            // characteristics (hidden API) which returns, among other things, fingerprint
+            // authenticator ID which was active at key creation time.
+            //
+            // Reason: The part of Android Keystore which runs inside an app's process invokes this
+            // method in certain cases. Those cases are not always where the developer demonstrates
+            // explicit intent to use fingerprint functionality. Thus, to avoiding throwing an
+            // unexpected SecurityException this method does not check whether its caller is
+            // permitted to use fingerprint API.
+            //
+            // The permission check should be restored once Android Keystore no longer invokes this
+            // method from inside app processes.
+
             return FingerprintService.this.getAuthenticatorId();
         }
     }
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 8ee2076..90e912d 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -1407,7 +1407,7 @@
                                 mAppUsageStats.reportEvent(r.sbn.getPackageName(),
                                         userId == UserHandle.USER_ALL ? UserHandle.USER_OWNER
                                                 : userId,
-                                        UsageEvents.Event.INTERACTION);
+                                        UsageEvents.Event.USER_INTERACTION);
                                 r.setSeen();
                             }
                         }
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 4861050..1802301 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -208,7 +208,7 @@
     static final boolean DEBUG_APP_ORIENTATION = false;
     static final boolean DEBUG_CONFIGURATION = false;
     static final boolean DEBUG_APP_TRANSITIONS = false;
-    static final boolean DEBUG_STARTING_WINDOW = true;
+    static final boolean DEBUG_STARTING_WINDOW = false;
     static final boolean DEBUG_WALLPAPER = false;
     static final boolean DEBUG_WALLPAPER_LIGHT = false || DEBUG_WALLPAPER;
     static final boolean DEBUG_DRAG = false;
diff --git a/services/usage/java/com/android/server/usage/IntervalStats.java b/services/usage/java/com/android/server/usage/IntervalStats.java
index a615675..1aa2978 100644
--- a/services/usage/java/com/android/server/usage/IntervalStats.java
+++ b/services/usage/java/com/android/server/usage/IntervalStats.java
@@ -110,7 +110,10 @@
             usageStats.mLastEvent = eventType;
         }
 
-        usageStats.mLastTimeUsed = timeStamp;
+        if (eventType != UsageEvents.Event.SYSTEM_INTERACTION) {
+            usageStats.mLastTimeUsed = timeStamp;
+        }
+        usageStats.mLastTimeSystemUsed = timeStamp;
         usageStats.mEndTimeStamp = timeStamp;
 
         if (eventType == UsageEvents.Event.MOVE_TO_FOREGROUND) {
@@ -131,9 +134,9 @@
         usageStats.mBeginIdleTime = timeStamp;
     }
 
-    void updateLastUsedTime(String packageName, long lastUsedTime) {
+    void updateSystemLastUsedTime(String packageName, long lastUsedTime) {
         UsageStats usageStats = getOrCreateUsageStats(packageName);
-        usageStats.mLastTimeUsed = lastUsedTime;
+        usageStats.mLastTimeSystemUsed = lastUsedTime;
     }
 
     void updateConfigurationStats(Configuration config, long timeStamp) {
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 633aee8..7a34757 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -60,7 +60,6 @@
 import android.telephony.TelephonyManager;
 import android.util.ArraySet;
 import android.util.AtomicFile;
-import android.util.Log;
 import android.util.Slog;
 import android.util.SparseArray;
 import android.view.Display;
@@ -543,14 +542,15 @@
             final UserUsageStatsService service =
                     getUserDataAndInitializeIfNeededLocked(userId, timeNow);
             final long beginIdleTime = service.getBeginIdleTime(event.mPackage);
-            final long lastUsedTime = service.getLastUsedTime(event.mPackage);
+            final long lastUsedTime = service.getSystemLastUsedTime(event.mPackage);
             final boolean previouslyIdle = hasPassedIdleTimeoutLocked(beginIdleTime,
                     lastUsedTime, screenOnTime, timeNow);
             service.reportEvent(event, getScreenOnTimeLocked(timeNow));
             // Inform listeners if necessary
             if ((event.mEventType == Event.MOVE_TO_FOREGROUND
                     || event.mEventType == Event.MOVE_TO_BACKGROUND
-                    || event.mEventType == Event.INTERACTION)) {
+                    || event.mEventType == Event.SYSTEM_INTERACTION
+                    || event.mEventType == Event.USER_INTERACTION)) {
                 if (previouslyIdle) {
                     // Slog.d(TAG, "Informing listeners of out-of-idle " + event.mPackage);
                     mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS, userId,
@@ -575,11 +575,11 @@
             final UserUsageStatsService service =
                     getUserDataAndInitializeIfNeededLocked(userId, timeNow);
             final long beginIdleTime = service.getBeginIdleTime(packageName);
-            final long lastUsedTime = service.getLastUsedTime(packageName);
+            final long lastUsedTime = service.getSystemLastUsedTime(packageName);
             final boolean previouslyIdle = hasPassedIdleTimeoutLocked(beginIdleTime,
                     lastUsedTime, screenOnTime, timeNow);
             service.setBeginIdleTime(packageName, deviceUsageTime);
-            service.setLastUsedTime(packageName,
+            service.setSystemLastUsedTime(packageName,
                     timeNow - (idle ? DEFAULT_WALLCLOCK_APP_IDLE_THRESHOLD_MILLIS : 0) - 5000);
             // Inform listeners if necessary
             if (previouslyIdle != idle) {
@@ -666,7 +666,7 @@
             final UserUsageStatsService service =
                     getUserDataAndInitializeIfNeededLocked(userId, timeNow);
             long beginIdleTime = service.getBeginIdleTime(packageName);
-            long lastUsedTime = service.getLastUsedTime(packageName);
+            long lastUsedTime = service.getSystemLastUsedTime(packageName);
             return hasPassedIdleTimeoutLocked(beginIdleTime, lastUsedTime, screenOnTime, timeNow);
         }
     }
diff --git a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
index 0111201..f2ca3a4 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
@@ -55,6 +55,7 @@
 
     // Time attributes stored as an offset of the beginTime.
     private static final String LAST_TIME_ACTIVE_ATTR = "lastTimeActive";
+    private static final String LAST_TIME_ACTIVE_SYSTEM_ATTR = "lastTimeActiveSystem";
     private static final String BEGIN_IDLE_TIME_ATTR = "beginIdleTime";
     private static final String END_TIME_ATTR = "endTime";
     private static final String TIME_ATTR = "time";
@@ -71,6 +72,16 @@
         // Apply the offset to the beginTime to find the absolute time.
         stats.mLastTimeUsed = statsOut.beginTime + XmlUtils.readLongAttribute(
                 parser, LAST_TIME_ACTIVE_ATTR);
+
+        final String lastTimeUsedSystem = parser.getAttributeValue(null,
+                LAST_TIME_ACTIVE_SYSTEM_ATTR);
+        if (TextUtils.isEmpty(lastTimeUsedSystem)) {
+            // If the field isn't present, use the old one.
+            stats.mLastTimeSystemUsed = stats.mLastTimeUsed;
+        } else {
+            stats.mLastTimeSystemUsed = statsOut.beginTime + Long.parseLong(lastTimeUsedSystem);
+        }
+
         final String beginIdleTime = parser.getAttributeValue(null, BEGIN_IDLE_TIME_ATTR);
         if (!TextUtils.isEmpty(beginIdleTime)) {
             stats.mBeginIdleTime = Long.parseLong(beginIdleTime);
@@ -130,6 +141,8 @@
         // Write the time offset.
         XmlUtils.writeLongAttribute(xml, LAST_TIME_ACTIVE_ATTR,
                 usageStats.mLastTimeUsed - stats.beginTime);
+        XmlUtils.writeLongAttribute(xml, LAST_TIME_ACTIVE_SYSTEM_ATTR,
+                usageStats.mLastTimeSystemUsed - stats.beginTime);
 
         XmlUtils.writeStringAttribute(xml, PACKAGE_ATTR, usageStats.mPackageName);
         XmlUtils.writeLongAttribute(xml, TOTAL_TIME_ACTIVE_ATTR, usageStats.mTotalTimeInForeground);
diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
index 7c00dae..b07b815 100644
--- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
@@ -157,7 +157,7 @@
             if (pi.applicationInfo != null && (firstUpdate || pi.applicationInfo.isSystemApp())
                     && getBeginIdleTime(packageName) == -1) {
                 for (IntervalStats stats : mCurrentStats) {
-                    stats.update(packageName, currentTimeMillis, Event.INTERACTION);
+                    stats.update(packageName, currentTimeMillis, Event.SYSTEM_INTERACTION);
                     stats.updateBeginIdleTime(packageName, deviceUsageTime);
                     mStatsChanged = true;
                 }
@@ -199,7 +199,7 @@
         if (currentDailyStats.events == null) {
             currentDailyStats.events = new TimeSparseArray<>();
         }
-        if (event.mEventType != UsageEvents.Event.INTERACTION) {
+        if (event.mEventType != UsageEvents.Event.SYSTEM_INTERACTION) {
             currentDailyStats.events.put(event.mTimeStamp, event);
         }
 
@@ -226,9 +226,9 @@
         notifyStatsChanged();
     }
 
-    void setLastUsedTime(String packageName, long lastUsedTime) {
+    void setSystemLastUsedTime(String packageName, long lastUsedTime) {
         for (IntervalStats stats : mCurrentStats) {
-            stats.updateLastUsedTime(packageName, lastUsedTime);
+            stats.updateSystemLastUsedTime(packageName, lastUsedTime);
         }
         notifyStatsChanged();
     }
@@ -397,13 +397,13 @@
         }
     }
 
-    long getLastUsedTime(String packageName) {
+    long getSystemLastUsedTime(String packageName) {
         final IntervalStats yearly = mCurrentStats[UsageStatsManager.INTERVAL_YEARLY];
         UsageStats packageUsage;
         if ((packageUsage = yearly.packageStats.get(packageName)) == null) {
             return -1;
         } else {
-            return packageUsage.getLastTimeUsed();
+            return packageUsage.getLastTimeSystemUsed();
         }
     }
 
@@ -586,8 +586,11 @@
         for (int i = 0; i < pkgCount; i++) {
             final UsageStats usageStats = pkgStats.valueAt(i);
             pw.printPair("package", usageStats.mPackageName);
-            pw.printPair("totalTime", formatElapsedTime(usageStats.mTotalTimeInForeground, prettyDates));
+            pw.printPair("totalTime",
+                    formatElapsedTime(usageStats.mTotalTimeInForeground, prettyDates));
             pw.printPair("lastTime", formatDateTime(usageStats.mLastTimeUsed, prettyDates));
+            pw.printPair("lastTimeSystem",
+                    formatDateTime(usageStats.mLastTimeSystemUsed, prettyDates));
             pw.printPair("inactiveTime",
                     formatElapsedTime(screenOnTime - usageStats.mBeginIdleTime, prettyDates));
             pw.println();
@@ -596,8 +599,7 @@
 
         pw.println("configurations");
         pw.increaseIndent();
-        final ArrayMap<Configuration, ConfigurationStats> configStats =
-                stats.configurations;
+        final ArrayMap<Configuration, ConfigurationStats> configStats = stats.configurations;
         final int configCount = configStats.size();
         for (int i = 0; i < configCount; i++) {
             final ConfigurationStats config = configStats.valueAt(i);
@@ -659,8 +661,10 @@
                 return "CONTINUE_PREVIOUS_DAY";
             case UsageEvents.Event.CONFIGURATION_CHANGE:
                 return "CONFIGURATION_CHANGE";
-            case UsageEvents.Event.INTERACTION:
-                return "INTERACTION";
+            case UsageEvents.Event.SYSTEM_INTERACTION:
+                return "SYSTEM_INTERACTION";
+            case UsageEvents.Event.USER_INTERACTION:
+                return "USER_INTERACTION";
             default:
                 return "UNKNOWN";
         }
diff --git a/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageLogActivity.java b/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageLogActivity.java
index 8e6daea..05cac10 100644
--- a/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageLogActivity.java
+++ b/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageLogActivity.java
@@ -28,8 +28,6 @@
 import android.widget.BaseAdapter;
 import android.widget.TextView;
 
-import java.util.ArrayList;
-
 public class UsageLogActivity extends ListActivity implements Runnable {
     private static final long USAGE_STATS_PERIOD = 1000 * 60 * 60 * 24 * 14;
 
@@ -166,8 +164,8 @@
                 case UsageEvents.Event.CONFIGURATION_CHANGE:
                     return "Config change";
 
-                case UsageEvents.Event.INTERACTION:
-                    return "Interaction";
+                case UsageEvents.Event.USER_INTERACTION:
+                    return "User Interaction";
 
                 default:
                     return "Unknown: " + eventType;