Update InCallService#onConnectionEvent comments.
am: 06f3fa66b7

Change-Id: I954dd7bd3079f33e5966a1998c4f676c98cbe0de
diff --git a/api/test-current.txt b/api/test-current.txt
index 3b5c223..74e65d9 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -3255,6 +3255,7 @@
     method public java.lang.Object getAnimatedValue(java.lang.String);
     method public long getCurrentPlayTime();
     method public long getDuration();
+    method public static float getDurationScale();
     method public static long getFrameDelay();
     method public int getRepeatCount();
     method public int getRepeatMode();
@@ -3272,6 +3273,7 @@
     method public void setCurrentFraction(float);
     method public void setCurrentPlayTime(long);
     method public android.animation.ValueAnimator setDuration(long);
+    method public static void setDurationScale(float);
     method public void setEvaluator(android.animation.TypeEvaluator);
     method public void setFloatValues(float...);
     method public static void setFrameDelay(long);
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index 7465ed9..ed08a70 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -18,6 +18,7 @@
 
 import static android.Manifest.permission.GET_ACCOUNTS;
 
+import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.RequiresPermission;
 import android.annotation.Size;
@@ -28,6 +29,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.IntentSender;
 import android.content.res.Resources;
 import android.database.SQLException;
 import android.os.Build;
@@ -265,6 +267,15 @@
             "android.accounts.AccountAuthenticator";
     public static final String AUTHENTICATOR_ATTRIBUTES_NAME = "account-authenticator";
 
+    /**
+     * Token for the special case where a UID has access only to an account
+     * but no authenticator specific auth tokens.
+     *
+     * @hide
+     */
+    public static final String ACCOUNT_ACCESS_TOKEN =
+            "com.android.abbfd278-af8b-415d-af8b-7571d5dab133";
+
     private final Context mContext;
     private final IAccountManager mService;
     private final Handler mMainHandler;
@@ -2960,4 +2971,49 @@
             }
         }.start();
     }
+
+    /**
+     * Gets whether a given package under a user has access to an account.
+     * Can be called only from the system UID.
+     *
+     * @param account The account for which to check.
+     * @param packageName The package for which to check.
+     * @param userHandle The user for which to check.
+     * @return True if the package can access the account.
+     *
+     * @hide
+     */
+    public boolean hasAccountAccess(@NonNull Account account, @NonNull String packageName,
+            @NonNull UserHandle userHandle) {
+        try {
+            return mService.hasAccountAccess(account, packageName, userHandle);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Creates an intent to request access to a given account for a UID.
+     * The returned intent should be stated for a result where {@link
+     * Activity#RESULT_OK} result means access was granted whereas {@link
+     * Activity#RESULT_CANCELED} result means access wasn't granted. Can
+     * be called only from the system UID.
+     *
+     * @param account The account for which to request.
+     * @param packageName The package name which to request.
+     * @param userHandle The user for which to request.
+     * @return The intent to request account access or null if the package
+     *     doesn't exist.
+     *
+     * @hide
+     */
+    public IntentSender createRequestAccountAccessIntentSenderAsUser(@NonNull Account account,
+            @NonNull String packageName, @NonNull UserHandle userHandle) {
+        try {
+            return mService.createRequestAccountAccessIntentSenderAsUser(account, packageName,
+                    userHandle);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
 }
diff --git a/core/java/android/accounts/AccountManagerInternal.java b/core/java/android/accounts/AccountManagerInternal.java
new file mode 100644
index 0000000..d777643
--- /dev/null
+++ b/core/java/android/accounts/AccountManagerInternal.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2016 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.accounts;
+
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.os.RemoteCallback;
+
+/**
+ * Account manager local system service interface.
+ *
+ * @hide Only for use within the system server.
+ */
+public abstract class AccountManagerInternal {
+
+    /**
+     * Requests that a given package is given access to an account.
+     * The provided callback will be invoked with a {@link android.os.Bundle}
+     * containing the result which will be a boolean value mapped to the
+     * {@link AccountManager#KEY_BOOLEAN_RESULT} key.
+     *
+     * @param account The account for which to request.
+     * @param packageName The package name for which to request.
+     * @param userId Concrete user id for which to request.
+     * @param callback A callback for receiving the result.
+     */
+    public abstract void requestAccountAccess(@NonNull  Account account,
+            @NonNull String packageName, @IntRange(from = 0) int userId,
+            @NonNull RemoteCallback callback);
+}
diff --git a/core/java/android/accounts/GrantCredentialsPermissionActivity.java b/core/java/android/accounts/GrantCredentialsPermissionActivity.java
index 12b2b9c..8d0ce58 100644
--- a/core/java/android/accounts/GrantCredentialsPermissionActivity.java
+++ b/core/java/android/accounts/GrantCredentialsPermissionActivity.java
@@ -35,12 +35,10 @@
  */
 public class GrantCredentialsPermissionActivity extends Activity implements View.OnClickListener {
     public static final String EXTRAS_ACCOUNT = "account";
-    public static final String EXTRAS_AUTH_TOKEN_LABEL = "authTokenLabel";
     public static final String EXTRAS_AUTH_TOKEN_TYPE = "authTokenType";
     public static final String EXTRAS_RESPONSE = "response";
-    public static final String EXTRAS_ACCOUNT_TYPE_LABEL = "accountTypeLabel";
-    public static final String EXTRAS_PACKAGES = "application";
     public static final String EXTRAS_REQUESTING_UID = "uid";
+
     private Account mAccount;
     private String mAuthTokenType;
     private int mUid;
@@ -109,7 +107,11 @@
                 }
             }
         };
-        AccountManager.get(this).getAuthTokenLabel(mAccount.type, mAuthTokenType, callback, null);
+
+        if (!AccountManager.ACCOUNT_ACCESS_TOKEN.equals(mAuthTokenType)) {
+            AccountManager.get(this).getAuthTokenLabel(mAccount.type,
+                    mAuthTokenType, callback, null);
+        }
 
         findViewById(R.id.allow_button).setOnClickListener(this);
         findViewById(R.id.deny_button).setOnClickListener(this);
diff --git a/core/java/android/accounts/IAccountManager.aidl b/core/java/android/accounts/IAccountManager.aidl
index 7199288..56a6488 100644
--- a/core/java/android/accounts/IAccountManager.aidl
+++ b/core/java/android/accounts/IAccountManager.aidl
@@ -19,8 +19,10 @@
 import android.accounts.IAccountManagerResponse;
 import android.accounts.Account;
 import android.accounts.AuthenticatorDescription;
+import android.content.IntentSender;
 import android.os.Bundle;
-
+import android.os.RemoteCallback;
+import android.os.UserHandle;
 
 /**
  * Central application service that provides account management.
@@ -102,4 +104,10 @@
     /* Check if credentials update is suggested */
     void isCredentialsUpdateSuggested(in IAccountManagerResponse response, in Account account,
         String statusToken);
+
+    /* Check if the package in a user can access an account */
+    boolean hasAccountAccess(in Account account, String packageName, in UserHandle userHandle);
+    /* Crate an intent to request account access for package and a given user id */
+    IntentSender createRequestAccountAccessIntentSenderAsUser(in Account account,
+        String packageName, in UserHandle userHandle);
 }
diff --git a/core/java/android/animation/ValueAnimator.java b/core/java/android/animation/ValueAnimator.java
index e3f8fa4..7e16e3e 100644
--- a/core/java/android/animation/ValueAnimator.java
+++ b/core/java/android/animation/ValueAnimator.java
@@ -18,6 +18,7 @@
 
 import android.annotation.CallSuper;
 import android.annotation.IntDef;
+import android.annotation.TestApi;
 import android.os.Looper;
 import android.os.Trace;
 import android.util.AndroidRuntimeException;
@@ -261,6 +262,7 @@
     /**
      * @hide
      */
+    @TestApi
     public static void setDurationScale(float durationScale) {
         sDurationScale = durationScale;
     }
@@ -268,6 +270,7 @@
     /**
      * @hide
      */
+    @TestApi
     public static float getDurationScale() {
         return sDurationScale;
     }
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 06a01fc..e4880b0 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -175,11 +175,11 @@
  * part of the platform's application model. For a detailed perspective on the structure of an
  * Android application and how activities behave, please read the
  * <a href="{@docRoot}guide/topics/fundamentals.html">Application Fundamentals</a> and
- * <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back Stack</a>
+ * <a href="{@docRoot}guide/components/tasks-and-back-stack.html">Tasks and Back Stack</a>
  * developer guides.</p>
  *
  * <p>You can also find a detailed discussion about how to create activities in the
- * <a href="{@docRoot}guide/topics/fundamentals/activities.html">Activities</a>
+ * <a href="{@docRoot}guide/components/activities.html">Activities</a>
  * developer guide.</p>
  * </div>
  *
@@ -3366,7 +3366,7 @@
      * should override the method {@link #onPrepareNavigateUpTaskStack(TaskStackBuilder)}
      * to supply those arguments.</p>
      *
-     * <p>See <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back Stack</a>
+     * <p>See <a href="{@docRoot}guide/components/tasks-and-back-stack.html">Tasks and Back Stack</a>
      * from the developer guide and <a href="{@docRoot}design/patterns/navigation.html">Navigation</a>
      * from the design guide for more information about navigating within your app.</p>
      *
@@ -4482,7 +4482,7 @@
      *
      * @throws android.content.ActivityNotFoundException
      *
-     * @see {@link #startActivity(Intent, Bundle)}
+     * @see #startActivity(Intent, Bundle)
      * @see #startActivityForResult
      */
     @Override
@@ -4509,7 +4509,7 @@
      *
      * @throws android.content.ActivityNotFoundException
      *
-     * @see {@link #startActivity(Intent)}
+     * @see #startActivity(Intent)
      * @see #startActivityForResult
      */
     @Override
@@ -4531,7 +4531,7 @@
      *
      * @throws android.content.ActivityNotFoundException
      *
-     * @see {@link #startActivities(Intent[], Bundle)}
+     * @see #startActivities(Intent[], Bundle)
      * @see #startActivityForResult
      */
     @Override
@@ -4558,7 +4558,7 @@
      *
      * @throws android.content.ActivityNotFoundException
      *
-     * @see {@link #startActivities(Intent[])}
+     * @see #startActivities(Intent[])
      * @see #startActivityForResult
      */
     @Override
@@ -4940,7 +4940,7 @@
      * <p>As of {@link android.os.Build.VERSION_CODES#JELLY_BEAN} an alternative
      * to using this with starting activities is to supply the desired animation
      * information through a {@link ActivityOptions} bundle to
-     * {@link #startActivity(Intent, Bundle) or a related function.  This allows
+     * {@link #startActivity(Intent, Bundle)} or a related function.  This allows
      * you to specify a custom animation even when starting an activity from
      * outside the context of the current top activity.
      *
@@ -6122,7 +6122,6 @@
      *      the return value must be checked.
      *
      * @see #onVisibleBehindCanceled()
-     * @see #onBackgroundVisibleBehindChanged(boolean)
      */
     public boolean requestVisibleBehind(boolean visible) {
         if (!mResumed) {
@@ -6150,7 +6149,6 @@
      * process. Otherwise {@link #onStop()} will be called following return.
      *
      * @see #requestVisibleBehind(boolean)
-     * @see #onBackgroundVisibleBehindChanged(boolean)
      */
     @CallSuper
     public void onVisibleBehindCanceled() {
diff --git a/core/java/android/app/IWallpaperManager.aidl b/core/java/android/app/IWallpaperManager.aidl
index ec22ff6..75a5bf7 100644
--- a/core/java/android/app/IWallpaperManager.aidl
+++ b/core/java/android/app/IWallpaperManager.aidl
@@ -44,7 +44,7 @@
      */
     ParcelFileDescriptor setWallpaper(String name, in String callingPackage,
             in Rect cropHint, boolean allowBackup, out Bundle extras, int which,
-            IWallpaperManagerCallback completion);
+            IWallpaperManagerCallback completion, int userId);
 
     /**
      * Set the live wallpaper. This only affects the system wallpaper.
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 6e44662..219afea 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -48,6 +48,7 @@
 import android.os.IBinder;
 import android.os.Looper;
 import android.os.ParcelFileDescriptor;
+import android.os.Process;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.SystemProperties;
@@ -939,7 +940,8 @@
             /* Set the wallpaper to the default values */
             ParcelFileDescriptor fd = sGlobals.mService.setWallpaper(
                     "res:" + resources.getResourceName(resid),
-                    mContext.getOpPackageName(), null, false, result, which, completion);
+                    mContext.getOpPackageName(), null, false, result, which, completion,
+                    UserHandle.myUserId());
             if (fd != null) {
                 FileOutputStream fos = null;
                 boolean ok = false;
@@ -1040,6 +1042,19 @@
     public int setBitmap(Bitmap fullImage, Rect visibleCropHint,
             boolean allowBackup, @SetWallpaperFlags int which)
             throws IOException {
+        return setBitmap(fullImage, visibleCropHint, allowBackup, which,
+                UserHandle.myUserId());
+    }
+
+    /**
+     * Like {@link #setBitmap(Bitmap, Rect, boolean, int)}, but allows to pass in an explicit user
+     * id. If the user id doesn't match the user id the process is running under, calling this
+     * requires permission {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL}.
+     * @hide
+     */
+    public int setBitmap(Bitmap fullImage, Rect visibleCropHint,
+            boolean allowBackup, @SetWallpaperFlags int which, int userId)
+            throws IOException {
         validateRect(visibleCropHint);
         if (sGlobals.mService == null) {
             Log.w(TAG, "WallpaperService not running");
@@ -1050,7 +1065,7 @@
         try {
             ParcelFileDescriptor fd = sGlobals.mService.setWallpaper(null,
                     mContext.getOpPackageName(), visibleCropHint, allowBackup,
-                    result, which, completion);
+                    result, which, completion, userId);
             if (fd != null) {
                 FileOutputStream fos = null;
                 try {
@@ -1176,7 +1191,7 @@
         try {
             ParcelFileDescriptor fd = sGlobals.mService.setWallpaper(null,
                     mContext.getOpPackageName(), visibleCropHint, allowBackup,
-                    result, which, completion);
+                    result, which, completion, UserHandle.myUserId());
             if (fd != null) {
                 FileOutputStream fos = null;
                 try {
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 2a12ac8..b8c133e 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -2219,6 +2219,7 @@
      * @throws SecurityException if the calling application does not own an active administrator
      *             that uses {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD}
      * @throws IllegalStateException if the calling user is locked or has a managed profile.
+     * @throws IllegalArgumentException if the password does not meet system requirements.
      */
     public boolean resetPassword(String password, int flags) {
         throwIfParentInstance("resetPassword");
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 47ae687..246a752 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -89,8 +89,11 @@
  *
  * <div class="special reference">
  * <h3>Developer Guides</h3>
- * <p>For more information about using Bluetooth, read the
- * <a href="{@docRoot}guide/topics/wireless/bluetooth.html">Bluetooth</a> developer guide.
+ * <p>
+ *  For more information about using Bluetooth, read the <a href=
+ * "{@docRoot}guide/topics/connectivity/bluetooth.html">Bluetooth</a> developer
+ * guide.
+ * </p>
  * </div>
  *
  * {@see BluetoothDevice}
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index f43fb30..189147e 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -59,8 +59,11 @@
  *
  * <div class="special reference">
  * <h3>Developer Guides</h3>
- * <p>For more information about using Bluetooth, read the
- * <a href="{@docRoot}guide/topics/wireless/bluetooth.html">Bluetooth</a> developer guide.</p>
+ * <p>
+ * For more information about using Bluetooth, read the <a href=
+ * "{@docRoot}guide/topics/connectivity/bluetooth.html">Bluetooth</a> developer
+ * guide.
+ * </p>
  * </div>
  *
  * {@see BluetoothAdapter}
diff --git a/core/java/android/bluetooth/BluetoothManager.java b/core/java/android/bluetooth/BluetoothManager.java
index 35437a1..00058a9 100644
--- a/core/java/android/bluetooth/BluetoothManager.java
+++ b/core/java/android/bluetooth/BluetoothManager.java
@@ -38,8 +38,11 @@
  *
  * <div class="special reference">
  * <h3>Developer Guides</h3>
- * <p>For more information about using BLUETOOTH, read the
- * <a href="{@docRoot}guide/topics/connectivity/bluetooth.html">Bluetooth</a> developer guide.</p>
+ * <p>
+ * For more information about using BLUETOOTH, read the <a href=
+ * "{@docRoot}guide/topics/connectivity/bluetooth.html">Bluetooth</a> developer
+ * guide.
+ * </p>
  * </div>
  *
  * @see Context#getSystemService
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 3f18ea9..f908abc 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -2761,8 +2761,10 @@
      *  <dd> A {@link android.net.ConnectivityManager ConnectivityManager} for
      *  handling management of network connections.
      *  <dt> {@link #WIFI_SERVICE} ("wifi")
-     *  <dd> A {@link android.net.wifi.WifiManager WifiManager} for management of
-     * Wi-Fi connectivity.
+     *  <dd> A {@link android.net.wifi.WifiManager WifiManager} for management of Wi-Fi
+     *  connectivity.  On releases before NYC, it should only be obtained from an application
+     *  context, and not from any other derived context to avoid memory leaks within the calling
+     *  process.
      *  <dt> {@link #WIFI_P2P_SERVICE} ("wifip2p")
      *  <dd> A {@link android.net.wifi.p2p.WifiP2pManager WifiP2pManager} for management of
      * Wi-Fi Direct connectivity.
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 4d9db98..1cf23ae 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -4314,6 +4314,14 @@
     public static final int FLAG_DEBUG_TRIAGED_MISSING = 0x00000100;
 
     /**
+     * Internal flag used to indicate ephemeral applications should not be
+     * considered when resolving the intent.
+     *
+     * @hide
+     */
+    public static final int FLAG_IGNORE_EPHEMERAL = 0x00000200;
+
+    /**
      * If set, the new activity is not kept in the history stack.  As soon as
      * the user navigates away from it, the activity is finished.  This may also
      * be set with the {@link android.R.styleable#AndroidManifestActivity_noHistory
diff --git a/core/java/android/content/Loader.java b/core/java/android/content/Loader.java
index c5e0ea7..3faf13b 100644
--- a/core/java/android/content/Loader.java
+++ b/core/java/android/content/Loader.java
@@ -44,7 +44,7 @@
  * <div class="special reference">
  * <h3>Developer Guides</h3>
  * <p>For more information about using loaders, read the
- * <a href="{@docRoot}guide/topics/fundamentals/loaders.html">Loaders</a> developer guide.</p>
+ * <a href="{@docRoot}guide/components/loaders.html">Loaders</a> developer guide.</p>
  * </div>
  *
  * @param <D> The result returned when the load is complete
diff --git a/core/java/android/content/SyncAdapterType.java b/core/java/android/content/SyncAdapterType.java
index 8a16ac9..6ef7fd2 100644
--- a/core/java/android/content/SyncAdapterType.java
+++ b/core/java/android/content/SyncAdapterType.java
@@ -16,6 +16,7 @@
 
 package android.content;
 
+import android.annotation.Nullable;
 import android.text.TextUtils;
 import android.os.Parcelable;
 import android.os.Parcel;
@@ -33,6 +34,7 @@
     private final boolean isAlwaysSyncable;
     private final boolean allowParallelSyncs;
     private final String settingsActivity;
+    private final String packageName;
 
     public SyncAdapterType(String authority, String accountType, boolean userVisible,
             boolean supportsUploading) {
@@ -50,6 +52,7 @@
         this.allowParallelSyncs = false;
         this.settingsActivity = null;
         this.isKey = false;
+        this.packageName = null;
     }
 
     /** @hide */
@@ -57,7 +60,8 @@
             boolean supportsUploading,
             boolean isAlwaysSyncable,
             boolean allowParallelSyncs,
-            String settingsActivity) {
+            String settingsActivity,
+            String packageName) {
         if (TextUtils.isEmpty(authority)) {
             throw new IllegalArgumentException("the authority must not be empty: " + authority);
         }
@@ -72,6 +76,7 @@
         this.allowParallelSyncs = allowParallelSyncs;
         this.settingsActivity = settingsActivity;
         this.isKey = false;
+        this.packageName = packageName;
     }
 
     private SyncAdapterType(String authority, String accountType) {
@@ -89,6 +94,7 @@
         this.allowParallelSyncs = false;
         this.settingsActivity = null;
         this.isKey = true;
+        this.packageName = null;
     }
 
     public boolean supportsUploading() {
@@ -148,6 +154,16 @@
         return settingsActivity;
     }
 
+    /**
+     * The package hosting the sync adapter.
+     * @return The package name.
+     *
+     * @hide
+     */
+    public @Nullable String getPackageName() {
+        return packageName;
+    }
+
     public static SyncAdapterType newKey(String authority, String accountType) {
         return new SyncAdapterType(authority, accountType);
     }
@@ -181,6 +197,7 @@
                     + ", isAlwaysSyncable=" + isAlwaysSyncable
                     + ", allowParallelSyncs=" + allowParallelSyncs
                     + ", settingsActivity=" + settingsActivity
+                    + ", packageName=" + packageName
                     + "}";
         }
     }
@@ -201,6 +218,7 @@
         dest.writeInt(isAlwaysSyncable ? 1 : 0);
         dest.writeInt(allowParallelSyncs ? 1 : 0);
         dest.writeString(settingsActivity);
+        dest.writeString(packageName);
     }
 
     public SyncAdapterType(Parcel source) {
@@ -211,6 +229,7 @@
                 source.readInt() != 0,
                 source.readInt() != 0,
                 source.readInt() != 0,
+                source.readString(),
                 source.readString());
     }
 
diff --git a/core/java/android/content/SyncAdaptersCache.java b/core/java/android/content/SyncAdaptersCache.java
index 6704b75..ddbdb8a 100644
--- a/core/java/android/content/SyncAdaptersCache.java
+++ b/core/java/android/content/SyncAdaptersCache.java
@@ -81,7 +81,7 @@
                     sa.getString(com.android.internal.R.styleable
                             .SyncAdapter_settingsActivity);
             return new SyncAdapterType(authority, accountType, userVisible, supportsUploading,
-                    isAlwaysSyncable, allowParallelSyncs, settingsActivity);
+                    isAlwaysSyncable, allowParallelSyncs, settingsActivity, packageName);
         } finally {
             sa.recycle();
         }
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 82cd448..2093124 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -2290,11 +2290,7 @@
             b.append(cls);
             return b.toString().intern();
         }
-        if (c >= 'a' && c <= 'z') {
-            return cls.intern();
-        }
-        outError[0] = "Bad class name " + cls + " in package " + pkg;
-        return null;
+        return cls.intern();
     }
 
     private static String buildCompoundName(String pkg,
@@ -2755,12 +2751,7 @@
         }
 
         if (ai.name != null) {
-            ai.className = buildClassName(pkgName, ai.name, outError);
-            if (ai.className == null) {
-                sa.recycle();
-                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
-                return false;
-            }
+            ai.className = ai.name;
         }
 
         String manageSpaceActivity = sa.getNonConfigurationString(
diff --git a/core/java/android/content/pm/RegisteredServicesCache.java b/core/java/android/content/pm/RegisteredServicesCache.java
index 6162d1a..a110383 100644
--- a/core/java/android/content/pm/RegisteredServicesCache.java
+++ b/core/java/android/content/pm/RegisteredServicesCache.java
@@ -30,6 +30,7 @@
 import android.os.UserManager;
 import android.util.AtomicFile;
 import android.util.AttributeSet;
+import android.util.IntArray;
 import android.util.Log;
 import android.util.Slog;
 import android.util.SparseArray;
@@ -54,6 +55,7 @@
 import java.io.PrintWriter;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -344,6 +346,47 @@
         }
     }
 
+    public void updateServices(int userId) {
+        if (DEBUG) {
+            Slog.d(TAG, "updateServices u" + userId);
+        }
+        List<ServiceInfo<V>> allServices;
+        synchronized (mServicesLock) {
+            final UserServices<V> user = findOrCreateUserLocked(userId);
+            // If services haven't been initialized yet - no updates required
+            if (user.services == null) {
+                return;
+            }
+            allServices = new ArrayList<>(user.services.values());
+        }
+        IntArray updatedUids = null;
+        for (ServiceInfo<V> service : allServices) {
+            int versionCode = service.componentInfo.applicationInfo.versionCode;
+            String pkg = service.componentInfo.packageName;
+            ApplicationInfo newAppInfo = null;
+            try {
+                newAppInfo = mContext.getPackageManager().getApplicationInfoAsUser(pkg, 0, userId);
+            } catch (NameNotFoundException e) {
+                // Package uninstalled - treat as null app info
+            }
+            // If package updated or removed
+            if ((newAppInfo == null) || (newAppInfo.versionCode != versionCode)) {
+                if (DEBUG) {
+                    Slog.d(TAG, "Package " + pkg + " uid=" + service.uid
+                            + " updated. New appInfo: " + newAppInfo);
+                }
+                if (updatedUids == null) {
+                    updatedUids = new IntArray();
+                }
+                updatedUids.add(service.uid);
+            }
+        }
+        if (updatedUids != null && updatedUids.size() > 0) {
+            int[] updatedUidsArray = updatedUids.toArray();
+            generateServicesMap(updatedUidsArray, userId);
+        }
+    }
+
     @VisibleForTesting
     protected boolean inSystemImage(int callerUid) {
         String[] packages = mContext.getPackageManager().getPackagesForUid(callerUid);
@@ -379,10 +422,11 @@
      */
     private void generateServicesMap(int[] changedUids, int userId) {
         if (DEBUG) {
-            Slog.d(TAG, "generateServicesMap() for " + userId + ", changed UIDs = " + changedUids);
+            Slog.d(TAG, "generateServicesMap() for " + userId + ", changed UIDs = "
+                    + Arrays.toString(changedUids));
         }
 
-        final ArrayList<ServiceInfo<V>> serviceInfos = new ArrayList<ServiceInfo<V>>();
+        final ArrayList<ServiceInfo<V>> serviceInfos = new ArrayList<>();
         final List<ResolveInfo> resolveInfos = queryIntentServices(userId);
         for (ResolveInfo resolveInfo : resolveInfos) {
             try {
diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java
index c9be6ed..b5df4d7 100644
--- a/core/java/android/content/pm/ResolveInfo.java
+++ b/core/java/android/content/pm/ResolveInfo.java
@@ -68,12 +68,6 @@
     public EphemeralResolveInfo ephemeralResolveInfo;
 
     /**
-     * A ResolveInfo that points at the ephemeral installer.
-     * @hide
-     */
-    public ResolveInfo ephemeralInstaller;
-
-    /**
      * The IntentFilter that was matched for this ResolveInfo.
      */
     public IntentFilter filter;
diff --git a/core/java/android/hardware/location/ContextHubManager.java b/core/java/android/hardware/location/ContextHubManager.java
index 0c3d4b3..d4dcacc 100644
--- a/core/java/android/hardware/location/ContextHubManager.java
+++ b/core/java/android/hardware/location/ContextHubManager.java
@@ -123,10 +123,18 @@
     /**
      * Load a nano app on a specified context hub.
      *
+     * Note that loading is asynchronous.  When we return from this method,
+     * the nano app (probably) hasn't loaded yet.  Assuming a return of 0
+     * from this method, then the final success/failure for the load, along
+     * with the "handle" for the nanoapp, is all delivered in a byte
+     * string via a call to Callback.onMessageReceipt.
+     *
+     * TODO(b/30784270): Provide a better success/failure and "handle" delivery.
+     *
      * @param hubHandle handle of context hub to load the app on.
      * @param app the nanoApp to load on the hub
      *
-     * @return int nanoAppInstance of the loaded nanoApp on success,
+     * @return 0 if the command for loading was sent to the context hub;
      *         -1 otherwise
      *
      * @see NanoApp
@@ -150,9 +158,17 @@
     /**
      * Unload a specified nanoApp
      *
-     * @param nanoAppHandle handle of the nanoApp to load
+     * Note that unloading is asynchronous.  When we return from this method,
+     * the nano app (probably) hasn't unloaded yet.  Assuming a return of 0
+     * from this method, then the final success/failure for the unload is
+     * delivered in a byte string via a call to Callback.onMessageReceipt.
      *
-     * @return int  0 on success, -1 otherwise
+     * TODO(b/30784270): Provide a better success/failure delivery.
+     *
+     * @param nanoAppHandle handle of the nanoApp to unload
+     *
+     * @return 0 if the command for unloading was sent to the context hub;
+     *         -1 otherwise
      */
     public int unloadNanoApp(int nanoAppHandle) {
         int retVal = -1;
@@ -169,6 +185,24 @@
     /**
      * get information about the nano app instance
      *
+     * NOTE: The returned NanoAppInstanceInfo does _not_ contain correct
+     * information for several fields, specifically:
+     * - getName()
+     * - getPublisher()
+     * - getNeededExecMemBytes()
+     * - getNeededReadMemBytes()
+     * - getNeededWriteMemBytes()
+     *
+     * For example, say you call loadNanoApp() with a NanoApp that has
+     * getName() returning "My Name".  Later, if you call getNanoAppInstanceInfo
+     * for that nanoapp, the returned NanoAppInstanceInfo's getName()
+     * method will claim "Preloaded app, unknown", even though you would
+     * have expected "My Name".  For now, as the user, you'll need to
+     * separately track the above fields if they are of interest to you.
+     *
+     * TODO(b/30943489): Have the returned NanoAppInstanceInfo contain the
+     *     correct information.
+     *
      * @param nanoAppHandle handle of the nanoAppInstance
      * @return NanoAppInstanceInfo Information about the nano app instance.
      *
@@ -209,6 +243,14 @@
     /**
      * Send a message to a specific nano app instance on a context hub.
      *
+     * Note that the return value of this method only speaks of success
+     * up to the point of sending this to the Context Hub.  It is not
+     * an assurance that the Context Hub successfully sent this message
+     * on to the nanoapp.  If assurance is desired, a protocol should be
+     * established between your code and the nanoapp, with the nanoapp
+     * sending a confirmation message (which will be reported via
+     * Callback.onMessageReceipt).
+     *
      * @param hubHandle handle of the hub to send the message to
      * @param nanoAppHandle  handle of the nano app to send to
      * @param message Message to be sent
diff --git a/core/java/android/hardware/location/ContextHubService.java b/core/java/android/hardware/location/ContextHubService.java
index 062c958..eea2387 100644
--- a/core/java/android/hardware/location/ContextHubService.java
+++ b/core/java/android/hardware/location/ContextHubService.java
@@ -162,6 +162,28 @@
         msgHeader[HEADER_FIELD_MSG_TYPE] = MSG_LOAD_NANO_APP;
 
         long appId = app.getAppId();
+        // TODO(b/30808791): Remove this hack when the NanoApp API is fixed.
+        // Due to a bug in the NanoApp API, only the least significant four
+        // bytes of the app ID can be stored.  The most significant five
+        // bytes of a normal app ID are the "vendor", and thus the most
+        // significant of the bytes we have is the least significant byte
+        // of the vendor.  In the case that byte is the ASCII value for
+        // lower-case 'L', we assume the vendor is supposed to be "Googl"
+        // and fill in the four most significant bytes accordingly.
+        if ((appId >> 32) != 0) {
+            // We're unlikely to notice this warning, but at least
+            // we can avoid running our hack logic.
+            Log.w(TAG, "Code has not been updated since API fix.");
+        } else {
+            // Note: Lower-case 'L', not the number 1.
+            if (((appId >> 24) & 0xFF) == (long)'l') {
+                // Assume we're a Google nanoapp.
+                appId |= ((long)'G') << 56;
+                appId |= ((long)'o') << 48;
+                appId |= ((long)'o') << 40;
+                appId |= ((long)'g') << 32;
+            }
+        }
 
         msgHeader[HEADER_FIELD_LOAD_APP_ID_LO] = (int)(appId & 0xFFFFFFFF);
         msgHeader[HEADER_FIELD_LOAD_APP_ID_HI] = (int)((appId >> 32) & 0xFFFFFFFF);
@@ -322,9 +344,16 @@
         appInfo.setNeededReadMemBytes(PRE_LOADED_APP_MEM_REQ);
         appInfo.setNeededWriteMemBytes(PRE_LOADED_APP_MEM_REQ);
 
+        String action;
+        if (mNanoAppHash.containsKey(appInstanceHandle)) {
+            action = "Updated";
+        } else {
+            action = "Added";
+        }
+
         mNanoAppHash.put(appInstanceHandle, appInfo);
-        Log.d(TAG, "Added app instance " + appInstanceHandle + " with id " + appId
-              + " version " + appVersion);
+        Log.d(TAG, action + " app instance " + appInstanceHandle + " with id "
+              + appId + " version " + appVersion);
 
         return 0;
     }
diff --git a/core/java/android/hardware/location/NanoAppFilter.java b/core/java/android/hardware/location/NanoAppFilter.java
index 8db70e9..bf35a3d 100644
--- a/core/java/android/hardware/location/NanoAppFilter.java
+++ b/core/java/android/hardware/location/NanoAppFilter.java
@@ -43,7 +43,8 @@
     private long mAppIdVendorMask;
 
     // Id of the context hub this instance is expected on
-    private int mContextHubId;
+    // TODO: Provide an API which will let us change this HubId.
+    private int mContextHubId = HUB_ANY;
 
     /**
      * Flag indicating any version. With this flag set, all versions shall match provided version.
diff --git a/core/java/android/hardware/location/NanoAppInstanceInfo.java b/core/java/android/hardware/location/NanoAppInstanceInfo.java
index 71a5a88..ac6d83f 100644
--- a/core/java/android/hardware/location/NanoAppInstanceInfo.java
+++ b/core/java/android/hardware/location/NanoAppInstanceInfo.java
@@ -113,7 +113,12 @@
     }
 
     /**
-     * Set the application version
+     * Get the application version
+     *
+     * NOTE: There is a race condition where shortly after loading, this
+     * may return -1 instead of the correct version.
+     *
+     * TODO(b/30970527): Fix this race condition.
      *
      * @return int - version of the app
      */
diff --git a/core/java/android/net/NetworkIdentity.java b/core/java/android/net/NetworkIdentity.java
index 9cd563e..d570e66 100644
--- a/core/java/android/net/NetworkIdentity.java
+++ b/core/java/android/net/NetworkIdentity.java
@@ -175,7 +175,11 @@
 
         if (isNetworkTypeMobile(type)) {
             if (state.subscriberId == null) {
-                Slog.w(TAG, "Active mobile network without subscriber!");
+                if (state.networkInfo.getState() != NetworkInfo.State.DISCONNECTED &&
+                        state.networkInfo.getState() != NetworkInfo.State.UNKNOWN) {
+                    Slog.w(TAG, "Active mobile network without subscriber! ni = "
+                            + state.networkInfo);
+                }
             }
 
             subscriberId = state.subscriberId;
diff --git a/core/java/android/os/AsyncTask.java b/core/java/android/os/AsyncTask.java
index 63f39c5..9a4b599 100644
--- a/core/java/android/os/AsyncTask.java
+++ b/core/java/android/os/AsyncTask.java
@@ -35,8 +35,8 @@
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
- * <p>AsyncTask enables proper and easy use of the UI thread. This class allows to
- * perform background operations and publish results on the UI thread without
+ * <p>AsyncTask enables proper and easy use of the UI thread. This class allows you
+ * to perform background operations and publish results on the UI thread without
  * having to manipulate threads and/or handlers.</p>
  *
  * <p>AsyncTask is designed to be a helper class around {@link Thread} and {@link Handler}
@@ -55,7 +55,7 @@
  * <div class="special reference">
  * <h3>Developer Guides</h3>
  * <p>For more information about using tasks and threads, read the
- * <a href="{@docRoot}guide/topics/fundamentals/processes-and-threads.html">Processes and
+ * <a href="{@docRoot}guide/components/processes-and-threads.html">Processes and
  * Threads</a> developer guide.</p>
  * </div>
  *
@@ -298,12 +298,16 @@
         mWorker = new WorkerRunnable<Params, Result>() {
             public Result call() throws Exception {
                 mTaskInvoked.set(true);
-
-                Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-                //noinspection unchecked
-                Result result = doInBackground(mParams);
-                Binder.flushPendingCommands();
-                return postResult(result);
+                Result result = null;
+                try {
+                    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
+                    //noinspection unchecked
+                    result = doInBackground(mParams);
+                    Binder.flushPendingCommands();
+                } finally {
+                    postResult(result);
+                }
+                return result;
             }
         };
 
diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
index 8d6d9ed..4616af8 100644
--- a/core/java/android/os/Environment.java
+++ b/core/java/android/os/Environment.java
@@ -372,6 +372,14 @@
     }
 
     /**
+     * @see #getDataPreloadsDirectory()
+     * {@hide}
+     */
+    public static File getDataPreloadsMediaDirectory() {
+        return new File(getDataPreloadsDirectory(), "media");
+    }
+
+    /**
      * Return the primary shared/external storage directory. This directory may
      * not currently be accessible if it has been mounted by the user on their
      * computer, has been removed from the device, or some other problem has
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 9383a8b..0b428d4 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -5839,6 +5839,8 @@
         /**
          * If nonzero, ANRs in invisible background processes bring up a dialog.
          * Otherwise, the process will be silently killed.
+         *
+         * Also prevents ANRs and crash dialogs from being suppressed.
          * @hide
          */
         public static final String ANR_SHOW_BACKGROUND = "anr_show_background";
@@ -6311,6 +6313,12 @@
                 "system_navigation_keys_enabled";
 
         /**
+         * Holds comma separated list of ordering of QS tiles.
+         * @hide
+         */
+        public static final String QS_TILES = "sysui_qs_tiles";
+
+        /**
          * Whether preloaded APKs have been installed for the user.
          * @hide
          */
@@ -6318,6 +6326,13 @@
                 = "demo_user_setup_complete";
 
         /**
+         * Specifies whether the web action API is enabled.
+         *
+         * @hide
+         */
+        public static final String WEB_ACTION_ENABLED = "web_action_enabled";
+
+        /**
          * This are the settings to be backed up.
          *
          * NOTE: Settings are backed up and restored in the order they appear
@@ -6393,7 +6408,11 @@
             NIGHT_DISPLAY_CUSTOM_START_TIME,
             NIGHT_DISPLAY_CUSTOM_END_TIME,
             NIGHT_DISPLAY_AUTO_MODE,
-            NIGHT_DISPLAY_ACTIVATED
+            NIGHT_DISPLAY_ACTIVATED,
+            CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED,
+            CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED,
+            SYSTEM_NAVIGATION_KEYS_ENABLED,
+            QS_TILES,
         };
 
         /**
@@ -8719,6 +8738,16 @@
         public static final String RETAIL_DEMO_MODE_CONSTANTS = "retail_demo_mode_constants";
 
         /**
+         * The reason for the settings database being downgraded. This is only for
+         * troubleshooting purposes and its value should not be interpreted in any way.
+         *
+         * Type: string
+         *
+         * @hide
+         */
+        public static final String DATABASE_DOWNGRADE_REASON = "database_downgrade_reason";
+
+        /**
          * Settings to backup. This is here so that it's in the same place as the settings
          * keys and easy to update.
          *
diff --git a/core/java/android/provider/VoicemailContract.java b/core/java/android/provider/VoicemailContract.java
index 27b0a8b..5099eeb 100644
--- a/core/java/android/provider/VoicemailContract.java
+++ b/core/java/android/provider/VoicemailContract.java
@@ -30,7 +30,6 @@
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.Voicemail;
-
 import java.util.List;
 
 /**
@@ -123,22 +122,36 @@
             "android.intent.action.VOICEMAIL_SMS_RECEIVED";
 
     /**
-     * Extra included in {@link #ACTION_VOICEMAIL_SMS_RECEIVED} broadcast intents to indicate the
-     * event type of the SMS. Common values are "SYNC" or "STATUS"
+     * Optional extra included in {@link #ACTION_VOICEMAIL_SMS_RECEIVED} broadcast intents to
+     * indicate the event type of the SMS. Common values are "SYNC" or "STATUS". The extra will not
+     * exist if the framework cannot parse the SMS as voicemail but the carrier pattern indicates
+     * it is.
      */
     /** @hide */
     public static final String EXTRA_VOICEMAIL_SMS_PREFIX =
             "com.android.voicemail.extra.VOICEMAIL_SMS_PREFIX";
 
     /**
-     * Extra included in {@link #ACTION_VOICEMAIL_SMS_RECEIVED} broadcast intents to indicate the
-     * fields sent by the SMS
+     * Optional extra included in {@link #ACTION_VOICEMAIL_SMS_RECEIVED} broadcast intents to
+     * indicate the fields sent by the SMS. The extra will not exist if the framework cannot
+     * parse the SMS as voicemail but the carrier pattern indicates it is.
      */
     /** @hide */
     public static final String EXTRA_VOICEMAIL_SMS_FIELDS =
             "com.android.voicemail.extra.VOICEMAIL_SMS_FIELDS";
 
     /**
+     * Extra included in {@link #ACTION_VOICEMAIL_SMS_RECEIVED} broadcast intents to indicate the
+     * message body of the SMS. This extra is included if the framework cannot
+     * parse the SMS as voicemail but the carrier pattern indicates it is.
+     */
+    /**
+     * @hide
+     */
+    public static final String EXTRA_VOICEMAIL_SMS_MESSAGE_BODY =
+        "com.android.voicemail.extra.VOICEMAIL_SMS_MESSAGE_BODY";
+
+    /**
      * Extra included in {@link #ACTION_VOICEMAIL_SMS_RECEIVED} broadcast intents to indicate he
      * subscription ID of the phone account that received the SMS.
      */
diff --git a/core/java/android/util/ArraySet.java b/core/java/android/util/ArraySet.java
index 1e765b6..a02c070 100644
--- a/core/java/android/util/ArraySet.java
+++ b/core/java/android/util/ArraySet.java
@@ -156,28 +156,46 @@
             synchronized (ArraySet.class) {
                 if (mTwiceBaseCache != null) {
                     final Object[] array = mTwiceBaseCache;
-                    mArray = array;
-                    mTwiceBaseCache = (Object[])array[0];
-                    mHashes = (int[])array[1];
-                    array[0] = array[1] = null;
-                    mTwiceBaseCacheSize--;
-                    if (DEBUG) Log.d(TAG, "Retrieving 2x cache " + mHashes
-                            + " now have " + mTwiceBaseCacheSize + " entries");
-                    return;
+                    try {
+                        mArray = array;
+                        mTwiceBaseCache = (Object[]) array[0];
+                        mHashes = (int[]) array[1];
+                        array[0] = array[1] = null;
+                        mTwiceBaseCacheSize--;
+                        if (DEBUG) Log.d(TAG, "Retrieving 2x cache " + mHashes
+                                + " now have " + mTwiceBaseCacheSize + " entries");
+                        return;
+                    } catch (ClassCastException e) {
+                    }
+                    // Whoops!  Someone trampled the array (probably due to not protecting
+                    // their access with a lock).  Our cache is corrupt; report and give up.
+                    Slog.wtf(TAG, "Found corrupt ArraySet cache: [0]=" + array[0]
+                            + " [1]=" + array[1]);
+                    mTwiceBaseCache = null;
+                    mTwiceBaseCacheSize = 0;
                 }
             }
         } else if (size == BASE_SIZE) {
             synchronized (ArraySet.class) {
                 if (mBaseCache != null) {
                     final Object[] array = mBaseCache;
-                    mArray = array;
-                    mBaseCache = (Object[])array[0];
-                    mHashes = (int[])array[1];
-                    array[0] = array[1] = null;
-                    mBaseCacheSize--;
-                    if (DEBUG) Log.d(TAG, "Retrieving 1x cache " + mHashes
-                            + " now have " + mBaseCacheSize + " entries");
-                    return;
+                    try {
+                        mArray = array;
+                        mBaseCache = (Object[]) array[0];
+                        mHashes = (int[]) array[1];
+                        array[0] = array[1] = null;
+                        mBaseCacheSize--;
+                        if (DEBUG) Log.d(TAG, "Retrieving 1x cache " + mHashes
+                                + " now have " + mBaseCacheSize + " entries");
+                        return;
+                    } catch (ClassCastException e) {
+                    }
+                    // Whoops!  Someone trampled the array (probably due to not protecting
+                    // their access with a lock).  Our cache is corrupt; report and give up.
+                    Slog.wtf(TAG, "Found corrupt ArraySet cache: [0]=" + array[0]
+                            + " [1]=" + array[1]);
+                    mBaseCache = null;
+                    mBaseCacheSize = 0;
                 }
             }
         }
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 0601219..81469c8 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -173,7 +173,7 @@
             in CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes,
             int icon, int logo, int windowFlags, IBinder transferFrom, boolean createIfNeeded);
     void setAppVisibility(IBinder token, boolean visible);
-    void notifyAppResumed(IBinder token, boolean wasStopped);
+    void notifyAppResumed(IBinder token, boolean wasStopped, boolean allowSavedSurface);
     void notifyAppStopped(IBinder token);
     void startAppFreezingScreen(IBinder token, int configChanges);
     void stopAppFreezingScreen(IBinder token, boolean force);
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 286e097..dc19d32 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -96,6 +96,8 @@
 
     private HwuiContext mHwuiContext;
 
+    private boolean mIsSingleBuffered;
+
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
     @IntDef({SCALING_MODE_FREEZE, SCALING_MODE_SCALE_TO_WINDOW,
@@ -158,7 +160,7 @@
         if (surfaceTexture == null) {
             throw new IllegalArgumentException("surfaceTexture must not be null");
         }
-
+        mIsSingleBuffered = surfaceTexture.isSingleBuffered();
         synchronized (mLock) {
             mName = surfaceTexture.toString();
             setNativeObjectLocked(nativeCreateFromSurfaceTexture(surfaceTexture));
@@ -458,6 +460,7 @@
             // the reference count on mNativeObject.  Either way, it is
             // not necessary to call nativeRelease() here.
             mName = source.readString();
+            mIsSingleBuffered = source.readInt() != 0;
             setNativeObjectLocked(nativeReadFromParcel(mNativeObject, source));
         }
     }
@@ -469,6 +472,7 @@
         }
         synchronized (mLock) {
             dest.writeString(mName);
+            dest.writeInt(mIsSingleBuffered ? 1 : 0);
             nativeWriteToParcel(mNativeObject, dest);
         }
         if ((flags & Parcelable.PARCELABLE_WRITE_RETURN_VALUE) != 0) {
@@ -531,6 +535,14 @@
     }
 
     /**
+     * Returns whether or not this Surface is backed by a single-buffered SurfaceTexture
+     * @hide
+     */
+    public boolean isSingleBuffered() {
+        return mIsSingleBuffered;
+    }
+
+    /**
      * Exception thrown when a Canvas couldn't be locked with {@link Surface#lockCanvas}, or
      * when a SurfaceTexture could not successfully be allocated.
      */
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 4818910..e0ac7ed 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -193,26 +193,20 @@
     private boolean mGlobalListenersAdded;
 
     public SurfaceView(Context context) {
-        super(context);
-        init();
+        this(context, null);
     }
 
     public SurfaceView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        init();
+        this(context, attrs, 0);
     }
 
     public SurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-        init();
+        this(context, attrs, defStyleAttr, 0);
     }
 
     public SurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
-        init();
-    }
 
-    private void init() {
         setWillNotDraw(true);
     }
 
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 872168a..908658f 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -10384,7 +10384,7 @@
      *                  ancestors or by window visibility
      * @return true if this view is visible to the user, not counting clipping or overlapping
      */
-    @Visibility boolean dispatchVisibilityAggregated(boolean isVisible) {
+    boolean dispatchVisibilityAggregated(boolean isVisible) {
         final boolean thisVisible = getVisibility() == VISIBLE;
         // If we're not visible but something is telling us we are, ignore it.
         if (thisVisible || !isVisible) {
@@ -15527,7 +15527,7 @@
         if (vis != GONE) {
             onWindowVisibilityChanged(vis);
             if (isShown()) {
-                // Calling onVisibilityChanged directly here since the subtree will also
+                // Calling onVisibilityAggregated directly here since the subtree will also
                 // receive dispatchAttachedToWindow and this same call
                 onVisibilityAggregated(vis == VISIBLE);
             }
@@ -20280,8 +20280,14 @@
                 // remove it from the transparent region.
                 final int[] location = attachInfo.mTransparentLocation;
                 getLocationInWindow(location);
-                region.op(location[0], location[1], location[0] + mRight - mLeft,
-                        location[1] + mBottom - mTop, Region.Op.DIFFERENCE);
+                // When a view has Z value, then it will be better to leave some area below the view
+                // for drawing shadow. The shadow outset is proportional to the Z value. Note that
+                // the bottom part needs more offset than the left, top and right parts due to the
+                // spot light effects.
+                int shadowOffset = getZ() > 0 ? (int) getZ() : 0;
+                region.op(location[0] - shadowOffset, location[1] - shadowOffset,
+                        location[0] + mRight - mLeft + shadowOffset,
+                        location[1] + mBottom - mTop + (shadowOffset * 3), Region.Op.DIFFERENCE);
             } else {
                 if (mBackground != null && mBackground.getOpacity() != PixelFormat.TRANSPARENT) {
                     // The SKIP_DRAW flag IS set and the background drawable exists, we remove
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 3ff8d4f..6933efc 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -6406,16 +6406,28 @@
             return true;
         }
         super.gatherTransparentRegion(region);
-        final View[] children = mChildren;
-        final int count = mChildrenCount;
+        // Instead of naively traversing the view tree, we have to traverse according to the Z
+        // order here. We need to go with the same order as dispatchDraw().
+        // One example is that after surfaceView punch a hole, we will still allow other views drawn
+        // on top of that hole. In this case, those other views should be able to cut the
+        // transparent region into smaller area.
+        final int childrenCount = mChildrenCount;
         boolean noneOfTheChildrenAreTransparent = true;
-        for (int i = 0; i < count; i++) {
-            final View child = children[i];
-            if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) {
-                if (!child.gatherTransparentRegion(region)) {
-                    noneOfTheChildrenAreTransparent = false;
+        if (childrenCount > 0) {
+            final ArrayList<View> preorderedList = buildOrderedChildList();
+            final boolean customOrder = preorderedList == null
+                    && isChildrenDrawingOrderEnabled();
+            final View[] children = mChildren;
+            for (int i = 0; i < childrenCount; i++) {
+                final int childIndex = getAndVerifyPreorderedIndex(childrenCount, i, customOrder);
+                final View child = getAndVerifyPreorderedView(preorderedList, children, childIndex);
+                if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) {
+                    if (!child.gatherTransparentRegion(region)) {
+                        noneOfTheChildrenAreTransparent = false;
+                    }
                 }
             }
+            if (preorderedList != null) preorderedList.clear();
         }
         return meOpaque || noneOfTheChildrenAreTransparent;
     }
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 4dc1009..1bb4c08 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -1467,6 +1467,8 @@
         final int viewVisibility = getHostVisibility();
         final boolean viewVisibilityChanged = !mFirst
                 && (mViewVisibility != viewVisibility || mNewSurfaceNeeded);
+        final boolean viewUserVisibilityChanged = !mFirst &&
+                ((mViewVisibility == View.VISIBLE) != (viewVisibility == View.VISIBLE));
 
         WindowManager.LayoutParams params = null;
         if (mWindowAttributesChanged) {
@@ -1540,7 +1542,9 @@
         if (viewVisibilityChanged) {
             mAttachInfo.mWindowVisibility = viewVisibility;
             host.dispatchWindowVisibilityChanged(viewVisibility);
-            host.dispatchVisibilityAggregated(viewVisibility == View.VISIBLE);
+            if (viewUserVisibilityChanged) {
+                host.dispatchVisibilityAggregated(viewVisibility == View.VISIBLE);
+            }
             if (viewVisibility != View.VISIBLE || mNewSurfaceNeeded) {
                 endDragResizing();
                 destroyHardwareResources();
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index 184544d..aa67c82 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -22,7 +22,6 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.res.ColorStateList;
-import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -115,11 +114,17 @@
     private int mBaseline = -1;
     private boolean mBaselineAlignBottom = false;
 
-    // AdjustViewBounds behavior will be in compatibility mode for older apps.
-    private boolean mAdjustViewBoundsCompat = false;
+    /** Compatibility modes dependent on targetSdkVersion of the app. */
+    private static boolean sCompatDone;
+
+    /** AdjustViewBounds behavior will be in compatibility mode for older apps. */
+    private static boolean sCompatAdjustViewBounds;
 
     /** Whether to pass Resources when creating the source from a stream. */
-    private boolean mUseCorrectStreamDensity;
+    private static boolean sCompatUseCorrectStreamDensity;
+
+    /** Whether to use pre-Nougat drawable visibility dispatching conditions. */
+    private static boolean sCompatDrawableVisibilityDispatch;
 
     private static final ScaleType[] sScaleTypeArray = {
         ScaleType.MATRIX,
@@ -206,9 +211,13 @@
         mMatrix = new Matrix();
         mScaleType = ScaleType.FIT_CENTER;
 
-        final int targetSdkVersion = mContext.getApplicationInfo().targetSdkVersion;
-        mAdjustViewBoundsCompat = targetSdkVersion <= Build.VERSION_CODES.JELLY_BEAN_MR1;
-        mUseCorrectStreamDensity = targetSdkVersion > Build.VERSION_CODES.M;
+        if (!sCompatDone) {
+            final int targetSdkVersion = mContext.getApplicationInfo().targetSdkVersion;
+            sCompatAdjustViewBounds = targetSdkVersion <= Build.VERSION_CODES.JELLY_BEAN_MR1;
+            sCompatUseCorrectStreamDensity = targetSdkVersion > Build.VERSION_CODES.M;
+            sCompatDrawableVisibilityDispatch = targetSdkVersion < Build.VERSION_CODES.N;
+            sCompatDone = true;
+        }
     }
 
     @Override
@@ -881,8 +890,8 @@
             InputStream stream = null;
             try {
                 stream = mContext.getContentResolver().openInputStream(uri);
-                return Drawable.createFromResourceStream(
-                        mUseCorrectStreamDensity ? getResources() : null, null, stream, null);
+                return Drawable.createFromResourceStream(sCompatUseCorrectStreamDensity
+                        ? getResources() : null, null, stream, null);
             } catch (Exception e) {
                 Log.w(LOG_TAG, "Unable to open content: " + uri, e);
             } finally {
@@ -917,10 +926,13 @@
             mRecycleableBitmapDrawable.setBitmap(null);
         }
 
+        boolean sameDrawable = false;
+
         if (mDrawable != null) {
+            sameDrawable = mDrawable == d;
             mDrawable.setCallback(null);
             unscheduleDrawable(mDrawable);
-            if (isAttachedToWindow()) {
+            if (!sCompatDrawableVisibilityDispatch && !sameDrawable && isAttachedToWindow()) {
                 mDrawable.setVisible(false, false);
             }
         }
@@ -933,8 +945,11 @@
             if (d.isStateful()) {
                 d.setState(getDrawableState());
             }
-            if (isAttachedToWindow()) {
-                d.setVisible(getWindowVisibility() == VISIBLE && isShown(), true);
+            if (!sameDrawable || sCompatDrawableVisibilityDispatch) {
+                final boolean visible = sCompatDrawableVisibilityDispatch
+                        ? getVisibility() == VISIBLE
+                        : isAttachedToWindow() && getWindowVisibility() == VISIBLE && isShown();
+                d.setVisible(visible, true);
             }
             d.setLevel(mLevel);
             mDrawableWidth = d.getIntrinsicWidth();
@@ -1058,7 +1073,7 @@
                                 pleft + pright;
 
                         // Allow the width to outgrow its original estimate if height is fixed.
-                        if (!resizeHeight && !mAdjustViewBoundsCompat) {
+                        if (!resizeHeight && !sCompatAdjustViewBounds) {
                             widthSize = resolveAdjustedSize(newWidth, mMaxWidth, widthMeasureSpec);
                         }
 
@@ -1074,7 +1089,7 @@
                                 ptop + pbottom;
 
                         // Allow the height to outgrow its original estimate if width is fixed.
-                        if (!resizeWidth && !mAdjustViewBoundsCompat) {
+                        if (!resizeWidth && !sCompatAdjustViewBounds) {
                             heightSize = resolveAdjustedSize(newHeight, mMaxHeight,
                                     heightMeasureSpec);
                         }
@@ -1513,11 +1528,40 @@
     @Override
     public void onVisibilityAggregated(boolean isVisible) {
         super.onVisibilityAggregated(isVisible);
-        if (mDrawable != null) {
+        // Only do this for new apps post-Nougat
+        if (mDrawable != null && !sCompatDrawableVisibilityDispatch) {
             mDrawable.setVisible(isVisible, false);
         }
     }
 
+    @RemotableViewMethod
+    @Override
+    public void setVisibility(int visibility) {
+        super.setVisibility(visibility);
+        // Only do this for old apps pre-Nougat; new apps use onVisibilityAggregated
+        if (mDrawable != null && sCompatDrawableVisibilityDispatch) {
+            mDrawable.setVisible(visibility == VISIBLE, false);
+        }
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        // Only do this for old apps pre-Nougat; new apps use onVisibilityAggregated
+        if (mDrawable != null && sCompatDrawableVisibilityDispatch) {
+            mDrawable.setVisible(getVisibility() == VISIBLE, false);
+        }
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        // Only do this for old apps pre-Nougat; new apps use onVisibilityAggregated
+        if (mDrawable != null && sCompatDrawableVisibilityDispatch) {
+            mDrawable.setVisible(false, false);
+        }
+    }
+
     @Override
     public CharSequence getAccessibilityClassName() {
         return ImageView.class.getName();
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java
index 6432f70..5935c78 100644
--- a/core/java/android/widget/PopupWindow.java
+++ b/core/java/android/widget/PopupWindow.java
@@ -1547,7 +1547,7 @@
         }
 
         // Let the window manager know to align the top to y.
-        outParams.gravity = Gravity.LEFT | Gravity.TOP;
+        outParams.gravity = computeGravity();
         outParams.width = width;
         outParams.height = height;
 
diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java
index f2fc617..1095978 100644
--- a/core/java/android/widget/TimePicker.java
+++ b/core/java/android/widget/TimePicker.java
@@ -16,19 +16,19 @@
 
 package android.widget;
 
+import com.android.internal.R;
+
+import android.annotation.IntRange;
 import android.annotation.NonNull;
-import android.annotation.Nullable;
 import android.annotation.Widget;
 import android.content.Context;
-import android.content.res.Configuration;
 import android.content.res.TypedArray;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.os.Parcelable.Creator;
 import android.util.AttributeSet;
+import android.util.MathUtils;
 import android.view.View;
 import android.view.accessibility.AccessibilityEvent;
-import com.android.internal.R;
 
 import java.util.Locale;
 
@@ -102,8 +102,8 @@
      * @param hour the hour to set, in the range (0-23)
      * @see #getHour()
      */
-    public void setHour(int hour) {
-        mDelegate.setHour(hour);
+    public void setHour(@IntRange(from = 0, to = 23) int hour) {
+        mDelegate.setHour(MathUtils.constrain(hour, 0, 23));
     }
 
     /**
@@ -117,13 +117,13 @@
     }
 
     /**
-     * Sets the currently selected minute..
+     * Sets the currently selected minute.
      *
      * @param minute the minute to set, in the range (0-59)
      * @see #getMinute()
      */
-    public void setMinute(int minute) {
-        mDelegate.setMinute(minute);
+    public void setMinute(@IntRange(from = 0, to = 59) int minute) {
+        mDelegate.setMinute(MathUtils.constrain(minute, 0, 59));
     }
 
     /**
@@ -137,8 +137,9 @@
     }
 
     /**
-     * Sets the current hour.
+     * Sets the currently selected hour using 24-hour time.
      *
+     * @param currentHour the hour to set, in the range (0-23)
      * @deprecated Use {@link #setHour(int)}
      */
     @Deprecated
@@ -147,33 +148,34 @@
     }
 
     /**
-     * @return the current hour in the range (0-23)
+     * @return the currently selected hour, in the range (0-23)
      * @deprecated Use {@link #getHour()}
      */
     @NonNull
     @Deprecated
     public Integer getCurrentHour() {
-        return mDelegate.getHour();
+        return getHour();
     }
 
     /**
-     * Set the current minute (0-59).
+     * Sets the currently selected minute.
      *
+     * @param currentMinute the minute to set, in the range (0-59)
      * @deprecated Use {@link #setMinute(int)}
      */
     @Deprecated
     public void setCurrentMinute(@NonNull Integer currentMinute) {
-        mDelegate.setMinute(currentMinute);
+        setMinute(currentMinute);
     }
 
     /**
-     * @return the current minute
+     * @return the currently selected minute, in the range (0-59)
      * @deprecated Use {@link #getMinute()}
      */
     @NonNull
     @Deprecated
     public Integer getCurrentMinute() {
-        return mDelegate.getMinute();
+        return getMinute();
     }
 
     /**
@@ -256,10 +258,10 @@
      * for the real behavior.
      */
     interface TimePickerDelegate {
-        void setHour(int hour);
+        void setHour(@IntRange(from = 0, to = 23) int hour);
         int getHour();
 
-        void setMinute(int minute);
+        void setMinute(@IntRange(from = 0, to = 59) int minute);
         int getMinute();
 
         void setIs24Hour(boolean is24Hour);
diff --git a/core/java/android/widget/VideoView.java b/core/java/android/widget/VideoView.java
index f084db2..b973324 100644
--- a/core/java/android/widget/VideoView.java
+++ b/core/java/android/widget/VideoView.java
@@ -70,46 +70,49 @@
  */
 public class VideoView extends SurfaceView
         implements MediaPlayerControl, SubtitleController.Anchor {
-    private String TAG = "VideoView";
-    // settable by the client
-    private Uri         mUri;
-    private Map<String, String> mHeaders;
+    private static final String TAG = "VideoView";
 
     // all possible internal states
-    private static final int STATE_ERROR              = -1;
-    private static final int STATE_IDLE               = 0;
-    private static final int STATE_PREPARING          = 1;
-    private static final int STATE_PREPARED           = 2;
-    private static final int STATE_PLAYING            = 3;
-    private static final int STATE_PAUSED             = 4;
+    private static final int STATE_ERROR = -1;
+    private static final int STATE_IDLE = 0;
+    private static final int STATE_PREPARING = 1;
+    private static final int STATE_PREPARED = 2;
+    private static final int STATE_PLAYING = 3;
+    private static final int STATE_PAUSED = 4;
     private static final int STATE_PLAYBACK_COMPLETED = 5;
 
+    private final Vector<Pair<InputStream, MediaFormat>> mPendingSubtitleTracks = new Vector<>();
+
+    // settable by the client
+    private Uri mUri;
+    private Map<String, String> mHeaders;
+
     // mCurrentState is a VideoView object's current state.
     // mTargetState is the state that a method caller intends to reach.
     // For instance, regardless the VideoView object's current state,
     // calling pause() intends to bring the object to a target state
     // of STATE_PAUSED.
     private int mCurrentState = STATE_IDLE;
-    private int mTargetState  = STATE_IDLE;
+    private int mTargetState = STATE_IDLE;
 
     // All the stuff we need for playing and showing a video
     private SurfaceHolder mSurfaceHolder = null;
     private MediaPlayer mMediaPlayer = null;
-    private int         mAudioSession;
-    private int         mVideoWidth;
-    private int         mVideoHeight;
-    private int         mSurfaceWidth;
-    private int         mSurfaceHeight;
+    private int mAudioSession;
+    private int mVideoWidth;
+    private int mVideoHeight;
+    private int mSurfaceWidth;
+    private int mSurfaceHeight;
     private MediaController mMediaController;
     private OnCompletionListener mOnCompletionListener;
     private MediaPlayer.OnPreparedListener mOnPreparedListener;
-    private int         mCurrentBufferPercentage;
+    private int mCurrentBufferPercentage;
     private OnErrorListener mOnErrorListener;
-    private OnInfoListener  mOnInfoListener;
-    private int         mSeekWhenPrepared;  // recording the seek position while preparing
-    private boolean     mCanPause;
-    private boolean     mCanSeekBack;
-    private boolean     mCanSeekForward;
+    private OnInfoListener mOnInfoListener;
+    private int mSeekWhenPrepared;  // recording the seek position while preparing
+    private boolean mCanPause;
+    private boolean mCanSeekBack;
+    private boolean mCanSeekForward;
 
     /** Subtitle rendering widget overlaid on top of the video. */
     private RenderingWidget mSubtitleWidget;
@@ -118,13 +121,11 @@
     private RenderingWidget.OnChangedListener mSubtitlesChangedListener;
 
     public VideoView(Context context) {
-        super(context);
-        initVideoView();
+        this(context, null);
     }
 
     public VideoView(Context context, AttributeSet attrs) {
         this(context, attrs, 0);
-        initVideoView();
     }
 
     public VideoView(Context context, AttributeSet attrs, int defStyleAttr) {
@@ -133,7 +134,19 @@
 
     public VideoView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
-        initVideoView();
+
+        mVideoWidth = 0;
+        mVideoHeight = 0;
+
+        getHolder().addCallback(mSHCallback);
+        getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+
+        setFocusable(true);
+        setFocusableInTouchMode(true);
+        requestFocus();
+
+        mCurrentState = STATE_IDLE;
+        mTargetState = STATE_IDLE;
     }
 
     @Override
@@ -209,19 +222,6 @@
         return getDefaultSize(desiredSize, measureSpec);
     }
 
-    private void initVideoView() {
-        mVideoWidth = 0;
-        mVideoHeight = 0;
-        getHolder().addCallback(mSHCallback);
-        getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
-        setFocusable(true);
-        setFocusableInTouchMode(true);
-        requestFocus();
-        mPendingSubtitleTracks = new Vector<Pair<InputStream, MediaFormat>>();
-        mCurrentState = STATE_IDLE;
-        mTargetState  = STATE_IDLE;
-    }
-
     /**
      * Sets video path.
      *
@@ -294,8 +294,6 @@
         }
     }
 
-    private Vector<Pair<InputStream, MediaFormat>> mPendingSubtitleTracks;
-
     public void stopPlayback() {
         if (mMediaPlayer != null) {
             mMediaPlayer.stop();
diff --git a/core/java/com/android/internal/graphics/drawable/AnimationScaleListDrawable.java b/core/java/com/android/internal/graphics/drawable/AnimationScaleListDrawable.java
new file mode 100644
index 0000000..62f18ea
--- /dev/null
+++ b/core/java/com/android/internal/graphics/drawable/AnimationScaleListDrawable.java
@@ -0,0 +1,254 @@
+/*
+ * Copyright (C) 2016 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 com.android.internal.graphics.drawable;
+
+import android.animation.ValueAnimator;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.res.Resources;
+import android.content.res.Resources.Theme;
+import android.content.res.TypedArray;
+import android.graphics.drawable.Animatable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.DrawableContainer;
+import android.util.AttributeSet;
+
+import com.android.internal.R;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
+/**
+ * An internal DrawableContainer class, used to draw different things depending on animation scale.
+ * i.e: animation scale can be 0 in battery saver mode.
+ * This class contains 2 drawable, one is animatable, the other is static. When animation scale is
+ * not 0, the animatable drawable will the drawn. Otherwise, the static drawable will be drawn.
+ * <p>This class implements Animatable since ProgressBar can pick this up similarly as an
+ * AnimatedVectorDrawable.
+ * <p>It can be defined in an XML file with the {@code <AnimationScaleListDrawable>}
+ * element.
+ */
+public class AnimationScaleListDrawable extends DrawableContainer implements Animatable {
+    private static final String TAG = "AnimationScaleListDrawable";
+    private AnimationScaleListState mAnimationScaleListState;
+    private boolean mMutated;
+
+    public AnimationScaleListDrawable() {
+        this(null, null);
+    }
+
+    private AnimationScaleListDrawable(@Nullable AnimationScaleListState state,
+            @Nullable Resources res) {
+        // Every scale list drawable has its own constant state.
+        final AnimationScaleListState newState = new AnimationScaleListState(state, this, res);
+        setConstantState(newState);
+        onStateChange(getState());
+    }
+
+    /**
+     * Set the current drawable according to the animation scale. If scale is 0, then pick the
+     * static drawable, otherwise, pick the animatable drawable.
+     */
+    @Override
+    protected boolean onStateChange(int[] stateSet) {
+        final boolean changed = super.onStateChange(stateSet);
+        int idx = mAnimationScaleListState.getCurrentDrawableIndexBasedOnScale();
+        return selectDrawable(idx) || changed;
+    }
+
+
+    @Override
+    public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser,
+            @NonNull AttributeSet attrs, @Nullable Theme theme)
+            throws XmlPullParserException, IOException {
+        final TypedArray a = obtainAttributes(r, theme, attrs,
+                R.styleable.AnimationScaleListDrawable);
+        updateDensity(r);
+        a.recycle();
+
+        inflateChildElements(r, parser, attrs, theme);
+
+        onStateChange(getState());
+    }
+
+    /**
+     * Inflates child elements from XML.
+     */
+    private void inflateChildElements(@NonNull Resources r, @NonNull XmlPullParser parser,
+            @NonNull AttributeSet attrs, @Nullable Theme theme)
+            throws XmlPullParserException, IOException {
+        final AnimationScaleListState state = mAnimationScaleListState;
+        final int innerDepth = parser.getDepth() + 1;
+        int type;
+        int depth;
+        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                && ((depth = parser.getDepth()) >= innerDepth
+                || type != XmlPullParser.END_TAG)) {
+            if (type != XmlPullParser.START_TAG) {
+                continue;
+            }
+
+            if (depth > innerDepth || !parser.getName().equals("item")) {
+                continue;
+            }
+
+            // Either pick up the android:drawable attribute.
+            final TypedArray a = obtainAttributes(r, theme, attrs,
+                    R.styleable.AnimationScaleListDrawableItem);
+            Drawable dr = a.getDrawable(R.styleable.AnimationScaleListDrawableItem_drawable);
+            a.recycle();
+
+            // Or parse the child element under <item>.
+            if (dr == null) {
+                while ((type = parser.next()) == XmlPullParser.TEXT) {
+                }
+                if (type != XmlPullParser.START_TAG) {
+                    throw new XmlPullParserException(
+                            parser.getPositionDescription()
+                                    + ": <item> tag requires a 'drawable' attribute or "
+                                    + "child tag defining a drawable");
+                }
+                dr = Drawable.createFromXmlInner(r, parser, attrs, theme);
+            }
+
+            state.addDrawable(dr);
+        }
+    }
+
+    @Override
+    public Drawable mutate() {
+        if (!mMutated && super.mutate() == this) {
+            mAnimationScaleListState.mutate();
+            mMutated = true;
+        }
+        return this;
+    }
+
+    @Override
+    public void clearMutated() {
+        super.clearMutated();
+        mMutated = false;
+    }
+
+    @Override
+    public void start() {
+        Drawable dr = getCurrent();
+        if (dr != null && dr instanceof Animatable) {
+            ((Animatable) dr).start();
+        }
+    }
+
+    @Override
+    public void stop() {
+        Drawable dr = getCurrent();
+        if (dr != null && dr instanceof Animatable) {
+            ((Animatable) dr).stop();
+        }
+    }
+
+    @Override
+    public boolean isRunning() {
+        boolean result = false;
+        Drawable dr = getCurrent();
+        if (dr != null && dr instanceof Animatable) {
+            result = ((Animatable) dr).isRunning();
+        }
+        return result;
+    }
+
+    static class AnimationScaleListState extends DrawableContainerState {
+        int[] mThemeAttrs = null;
+        // The index of the last static drawable.
+        int mStaticDrawableIndex = -1;
+        // The index of the last animatable drawable.
+        int mAnimatableDrawableIndex = -1;
+
+        AnimationScaleListState(AnimationScaleListState orig, AnimationScaleListDrawable owner,
+                Resources res) {
+            super(orig, owner, res);
+
+            if (orig != null) {
+                // Perform a shallow copy and rely on mutate() to deep-copy.
+                mThemeAttrs = orig.mThemeAttrs;
+
+                mStaticDrawableIndex = orig.mStaticDrawableIndex;
+                mAnimatableDrawableIndex = orig.mAnimatableDrawableIndex;
+            }
+
+        }
+
+        void mutate() {
+            mThemeAttrs = mThemeAttrs != null ? mThemeAttrs.clone() : null;
+        }
+
+        /**
+         * Add the drawable into the container.
+         * This class only keep track one animatable drawable, and one static. If there are multiple
+         * defined in the XML, then pick the last one.
+         */
+        int addDrawable(Drawable drawable) {
+            final int pos = addChild(drawable);
+            if (drawable instanceof Animatable) {
+                mAnimatableDrawableIndex = pos;
+            } else {
+                mStaticDrawableIndex = pos;
+            }
+            return pos;
+        }
+
+        @Override
+        public Drawable newDrawable() {
+            return new AnimationScaleListDrawable(this, null);
+        }
+
+        @Override
+        public Drawable newDrawable(Resources res) {
+            return new AnimationScaleListDrawable(this, res);
+        }
+
+        @Override
+        public boolean canApplyTheme() {
+            return mThemeAttrs != null || super.canApplyTheme();
+        }
+
+        public int getCurrentDrawableIndexBasedOnScale() {
+            if (ValueAnimator.getDurationScale() == 0) {
+                return mStaticDrawableIndex;
+            }
+            return mAnimatableDrawableIndex;
+        }
+    }
+
+    @Override
+    public void applyTheme(@NonNull Theme theme) {
+        super.applyTheme(theme);
+
+        onStateChange(getState());
+    }
+
+    @Override
+    protected void setConstantState(@NonNull DrawableContainerState state) {
+        super.setConstantState(state);
+
+        if (state instanceof AnimationScaleListState) {
+            mAnimationScaleListState = (AnimationScaleListState) state;
+        }
+    }
+}
+
diff --git a/core/java/com/android/internal/widget/AlertDialogLayout.java b/core/java/com/android/internal/widget/AlertDialogLayout.java
index 891c920..9bf0948 100644
--- a/core/java/com/android/internal/widget/AlertDialogLayout.java
+++ b/core/java/com/android/internal/widget/AlertDialogLayout.java
@@ -20,7 +20,9 @@
 import android.annotation.Nullable;
 import android.annotation.StyleRes;
 import android.content.Context;
+import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
+import android.view.Gravity;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.LinearLayout;
@@ -265,4 +267,92 @@
 
         return 0;
     }
+
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        final int paddingLeft = mPaddingLeft;
+
+        // Where right end of child should go
+        final int width = right - left;
+        final int childRight = width - mPaddingRight;
+
+        // Space available for child
+        final int childSpace = width - paddingLeft - mPaddingRight;
+
+        final int totalLength = getMeasuredHeight();
+        final int count = getChildCount();
+        final int gravity = getGravity();
+        final int majorGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK;
+        final int minorGravity = gravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK;
+
+        int childTop;
+        switch (majorGravity) {
+            case Gravity.BOTTOM:
+                // totalLength contains the padding already
+                childTop = mPaddingTop + bottom - top - totalLength;
+                break;
+
+            // totalLength contains the padding already
+            case Gravity.CENTER_VERTICAL:
+                childTop = mPaddingTop + (bottom - top - totalLength) / 2;
+                break;
+
+            case Gravity.TOP:
+            default:
+                childTop = mPaddingTop;
+                break;
+        }
+
+        final Drawable dividerDrawable = getDividerDrawable();
+        final int dividerHeight = dividerDrawable == null ?
+                0 : dividerDrawable.getIntrinsicHeight();
+
+        for (int i = 0; i < count; i++) {
+            final View child = getChildAt(i);
+            if (child != null && child.getVisibility() != GONE) {
+                final int childWidth = child.getMeasuredWidth();
+                final int childHeight = child.getMeasuredHeight();
+
+                final LinearLayout.LayoutParams lp =
+                        (LinearLayout.LayoutParams) child.getLayoutParams();
+
+                int layoutGravity = lp.gravity;
+                if (layoutGravity < 0) {
+                    layoutGravity = minorGravity;
+                }
+                final int layoutDirection = getLayoutDirection();
+                final int absoluteGravity = Gravity.getAbsoluteGravity(
+                        layoutGravity, layoutDirection);
+
+                final int childLeft;
+                switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
+                    case Gravity.CENTER_HORIZONTAL:
+                        childLeft = paddingLeft + ((childSpace - childWidth) / 2)
+                                + lp.leftMargin - lp.rightMargin;
+                        break;
+
+                    case Gravity.RIGHT:
+                        childLeft = childRight - childWidth - lp.rightMargin;
+                        break;
+
+                    case Gravity.LEFT:
+                    default:
+                        childLeft = paddingLeft + lp.leftMargin;
+                        break;
+                }
+
+                if (hasDividerBeforeChildAt(i)) {
+                    childTop += dividerHeight;
+                }
+
+                childTop += lp.topMargin;
+                setChildFrame(child, childLeft, childTop, childWidth, childHeight);
+                childTop += childHeight + lp.bottomMargin;
+            }
+        }
+    }
+
+    private void setChildFrame(View child, int left, int top, int width, int height) {
+        child.layout(left, top, left + width, top + height);
+    }
 }
diff --git a/core/jni/android/graphics/pdf/PdfEditor.cpp b/core/jni/android/graphics/pdf/PdfEditor.cpp
index d2d39cd..0468b64 100644
--- a/core/jni/android/graphics/pdf/PdfEditor.cpp
+++ b/core/jni/android/graphics/pdf/PdfEditor.cpp
@@ -52,11 +52,9 @@
 } gRectClassInfo;
 
 // Also used in PdfRenderer.cpp
-Mutex sPdfiumLock;
 int sUnmatchedPdfiumInitRequestCount = 0;
 
 static void initializeLibraryIfNeeded() {
-    Mutex::Autolock _l(sPdfiumLock);
     if (sUnmatchedPdfiumInitRequestCount == 0) {
         FPDF_InitLibrary();
     }
@@ -64,7 +62,6 @@
 }
 
 static void destroyLibraryIfNeeded() {
-    Mutex::Autolock _l(sPdfiumLock);
     sUnmatchedPdfiumInitRequestCount--;
     if (sUnmatchedPdfiumInitRequestCount == 0) {
        FPDF_DestroyLibrary();
diff --git a/core/jni/android/graphics/pdf/PdfRenderer.cpp b/core/jni/android/graphics/pdf/PdfRenderer.cpp
index 71bec78..43550ac 100644
--- a/core/jni/android/graphics/pdf/PdfRenderer.cpp
+++ b/core/jni/android/graphics/pdf/PdfRenderer.cpp
@@ -44,11 +44,9 @@
 } gPointClassInfo;
 
 // See PdfEditor.cpp
-extern Mutex sPdfiumLock;
 extern int sUnmatchedPdfiumInitRequestCount;
 
 static void initializeLibraryIfNeeded() {
-    Mutex::Autolock _l(sPdfiumLock);
     if (sUnmatchedPdfiumInitRequestCount == 0) {
         FPDF_InitLibrary();
     }
@@ -56,7 +54,6 @@
 }
 
 static void destroyLibraryIfNeeded() {
-    Mutex::Autolock _l(sPdfiumLock);
     sUnmatchedPdfiumInitRequestCount--;
     if (sUnmatchedPdfiumInitRequestCount == 0) {
        FPDF_DestroyLibrary();
diff --git a/core/jni/android_database_CursorWindow.cpp b/core/jni/android_database_CursorWindow.cpp
index bb09d00..e96613b 100644
--- a/core/jni/android_database_CursorWindow.cpp
+++ b/core/jni/android_database_CursorWindow.cpp
@@ -16,6 +16,7 @@
 
 #undef LOG_TAG
 #define LOG_TAG "CursorWindow"
+#define LOG_NDEBUG 0
 
 #include <inttypes.h>
 #include <jni.h>
@@ -30,6 +31,11 @@
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
+#include <sys/types.h>
+#include <dirent.h>
+
+#undef LOG_NDEBUG
+#define LOG_NDEBUG 1
 
 #include <androidfw/CursorWindow.h>
 #include "android_os_Parcel.h"
@@ -61,6 +67,22 @@
     jniThrowException(env, "java/lang/IllegalStateException", msg.string());
 }
 
+static int getFdCount() {
+    char fdpath[PATH_MAX];
+    int count = 0;
+    snprintf(fdpath, PATH_MAX, "/proc/%d/fd", getpid());
+    DIR *dir = opendir(fdpath);
+    if (dir != NULL) {
+        struct dirent *dirent;
+        while ((dirent = readdir(dir))) {
+            count++;
+        }
+        count -= 2; // discount "." and ".."
+        closedir(dir);
+    }
+    return count;
+}
+
 static jlong nativeCreate(JNIEnv* env, jclass clazz, jstring nameObj, jint cursorWindowSize) {
     String8 name;
     const char* nameStr = env->GetStringUTFChars(nameObj, NULL);
@@ -85,7 +107,8 @@
     CursorWindow* window;
     status_t status = CursorWindow::createFromParcel(parcel, &window);
     if (status || !window) {
-        ALOGE("Could not create CursorWindow from Parcel due to error %d.", status);
+        ALOGE("Could not create CursorWindow from Parcel due to error %d, process fd count=%d",
+                status, getFdCount());
         return 0;
     }
 
diff --git a/core/jni/android_hardware_location_ContextHubService.cpp b/core/jni/android_hardware_location_ContextHubService.cpp
index 9515a0e..3644410 100644
--- a/core/jni/android_hardware_location_ContextHubService.cpp
+++ b/core/jni/android_hardware_location_ContextHubService.cpp
@@ -26,6 +26,10 @@
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
+
+// TOOD: On master, alphabetize these and move <mutex> into this
+//     grouping.
+#include <chrono>
 #include <unordered_map>
 #include <queue>
 
@@ -34,11 +38,12 @@
 #include "JNIHelp.h"
 #include "core_jni_helpers.h"
 
-static constexpr int OS_APP_ID = -1;
+static constexpr jint OS_APP_ID = -1;
+static constexpr jint INVALID_APP_ID = -2;
 static constexpr uint64_t ALL_APPS = UINT64_C(0xFFFFFFFFFFFFFFFF);
 
-static constexpr int MIN_APP_ID = 1;
-static constexpr int MAX_APP_ID = 128;
+static constexpr jint MIN_APP_ID = 1;
+static constexpr jint MAX_APP_ID = 128;
 
 static constexpr size_t MSG_HEADER_SIZE = 4;
 static constexpr size_t HEADER_FIELD_MSG_TYPE = 0;
@@ -50,6 +55,10 @@
 static constexpr size_t HEADER_FIELD_LOAD_APP_ID_HI = MSG_HEADER_SIZE + 1;
 static constexpr size_t MSG_HEADER_SIZE_LOAD_APP = MSG_HEADER_SIZE + 2;
 
+// Monotonically increasing clock we use to determine if we can cancel
+// a transaction.
+using std::chrono::steady_clock;
+
 namespace android {
 
 namespace {
@@ -102,10 +111,21 @@
 struct app_instance_info_s {
     uint64_t truncName;          // Possibly truncated name for logging
     uint32_t hubHandle;          // Id of the hub this app is on
-    int instanceId;              // system wide unique instance id - assigned
+    jint instanceId;             // system wide unique instance id - assigned
     struct hub_app_info appInfo; // returned from the HAL
 };
 
+
+// If a transaction takes longer than this, we'll allow it to be
+// canceled by a new transaction.  Note we do _not_ automatically
+// cancel a transaction after this much time.  We can have a
+// legal transaction which takes longer than this amount of time,
+// as long as no other new transactions are attempted after this
+// time has expired.
+// TODO(b/31105001): Establish a clean timing approach for all
+// of our HAL interactions.
+constexpr auto kMinTransactionCancelTime = std::chrono::seconds(29);
+
 /*
  * TODO(ashutoshj): From original code review:
  *
@@ -147,14 +167,15 @@
     std::mutex m;                 // mutex for manager
     hub_messages_e txnIdentifier; // What are we doing
     void *txnData;                // Details
+    steady_clock::time_point firstTimeTxnCanBeCanceled;
 };
 
 struct contextHubServiceDb_s {
     int initialized;
     context_hub_info_s hubInfo;
     jniInfo_s jniInfo;
-    std::queue<int> freeIds;
-    std::unordered_map<int, app_instance_info_s> appInstances;
+    std::queue<jint> freeIds;
+    std::unordered_map<jint, app_instance_info_s> appInstances;
     txnManager_s txnManager;
 };
 
@@ -176,25 +197,40 @@
     std::lock_guard<std::mutex>lock(mgr->m);
 
     mgr->txnPending = true;
+    mgr->firstTimeTxnCanBeCanceled = steady_clock::now() +
+        kMinTransactionCancelTime;
     mgr->txnData = txnData;
     mgr->txnIdentifier = txnIdentifier;
 
     return 0;
 }
 
-static int closeTxn() {
+// Only call this if you hold the db.txnManager.m lock.
+static void closeTxnUnlocked() {
     txnManager_s *mgr = &db.txnManager;
-    std::lock_guard<std::mutex>lock(mgr->m);
     mgr->txnPending = false;
     free(mgr->txnData);
     mgr->txnData = nullptr;
+}
 
+static int closeTxn() {
+    std::lock_guard<std::mutex>lock(db.txnManager.m);
+    closeTxnUnlocked();
     return 0;
 }
 
+// If a transaction has been pending for longer than
+// kMinTransactionCancelTime, this call will "cancel" that
+// transaction and return that there are none pending.
 static bool isTxnPending() {
     txnManager_s *mgr = &db.txnManager;
     std::lock_guard<std::mutex>lock(mgr->m);
+    if (mgr->txnPending) {
+        if (steady_clock::now() >= mgr->firstTimeTxnCanBeCanceled) {
+            ALOGW("Transaction canceled");
+            closeTxnUnlocked();
+        }
+    }
     return mgr->txnPending;
 }
 
@@ -259,16 +295,17 @@
     }
 }
 
-static int get_hub_handle_for_app_instance(int id) {
+static int get_hub_handle_for_app_instance(jint id) {
     if (!db.appInstances.count(id)) {
-        ALOGD("%s: Cannot find app for app instance %d", __FUNCTION__, id);
+        ALOGD("%s: Cannot find app for app instance %" PRId32,
+              __FUNCTION__, id);
         return -1;
     }
 
     return db.appInstances[id].hubHandle;
 }
 
-static int get_hub_id_for_app_instance(int id) {
+static int get_hub_id_for_app_instance(jint id) {
     int hubHandle = get_hub_handle_for_app_instance(id);
 
     if (hubHandle < 0) {
@@ -278,7 +315,7 @@
     return db.hubInfo.hubs[hubHandle].hub_id;
 }
 
-static int get_app_instance_for_app_id(uint64_t app_id) {
+static jint get_app_instance_for_app_id(uint64_t app_id) {
     auto end = db.appInstances.end();
     for (auto current = db.appInstances.begin(); current != end; ++current) {
         if (current->second.appInfo.app_name.id == app_id) {
@@ -289,9 +326,10 @@
     return -1;
 }
 
-static int set_dest_app(hub_message_t *msg, int id) {
+static int set_dest_app(hub_message_t *msg, jint id) {
     if (!db.appInstances.count(id)) {
-        ALOGD("%s: Cannot find app for app instance %d", __FUNCTION__, id);
+        ALOGD("%s: Cannot find app for app instance %" PRId32,
+              __FUNCTION__, id);
         return -1;
     }
 
@@ -303,7 +341,7 @@
     hub_message_t msg;
     query_apps_request_t queryMsg;
 
-    queryMsg.app_name.id = NANOAPP_VENDOR_ALL_APPS;
+    queryMsg.app_name.id = appId;
 
     msg.message_type = CONTEXT_HUB_QUERY_APPS;
     msg.message_len  = sizeof(queryMsg);
@@ -322,7 +360,7 @@
     }
 }
 
-static int return_id(int id) {
+static int return_id(jint id) {
     // Note : This method is not thread safe.
     // id returned is guaranteed to be in use
     if (id >= 0) {
@@ -333,9 +371,9 @@
     return -1;
 }
 
-static int generate_id() {
+static jint generate_id() {
     // Note : This method is not thread safe.
-    int retVal = -1;
+    jint retVal = -1;
 
     if (!db.freeIds.empty()) {
         retVal = db.freeIds.front();
@@ -346,8 +384,8 @@
 }
 
 
-static int add_app_instance(const hub_app_info *appInfo, uint32_t hubHandle,
-        int appInstanceHandle, JNIEnv *env) {
+static jint add_app_instance(const hub_app_info *appInfo, uint32_t hubHandle,
+        jint appInstanceHandle, JNIEnv *env) {
 
     ALOGI("Loading App");
 
@@ -355,10 +393,12 @@
     app_instance_info_s entry;
     assert(appInfo);
 
+    const char *action = "Updated";
     if (db.appInstances.count(appInstanceHandle) == 0) {
+        action = "Added";
         appInstanceHandle = generate_id();
         if (appInstanceHandle < 0) {
-            ALOGE("Cannot find resources to add app instance %d",
+            ALOGE("Cannot find resources to add app instance %" PRId32,
                   appInstanceHandle);
             return -1;
         }
@@ -378,36 +418,42 @@
                        hubHandle, entry.instanceId, entry.truncName,
                        entry.appInfo.version);
 
-    ALOGW("Added App 0x%" PRIx64 " on hub Handle %" PRId32
-          " as appInstance %d", entry.truncName,
+    ALOGW("%s App 0x%" PRIx64 " on hub Handle %" PRId32
+          " as appInstance %" PRId32, action, entry.truncName,
           entry.hubHandle, appInstanceHandle);
 
     return appInstanceHandle;
 }
 
-int delete_app_instance(int id, JNIEnv *env) {
-    if (!db.appInstances.count(id)) {
-        ALOGW("Cannot find App id : %d", id);
-        return -1;
-    }
+int delete_app_instance(jint id, JNIEnv *env) {
+    bool fullyDeleted = true;
 
+    if (db.appInstances.count(id)) {
+        db.appInstances.erase(id);
+    } else {
+        ALOGW("Cannot delete App id (%" PRId32 ") from the JNI C++ cache", id);
+        fullyDeleted = false;
+    }
     return_id(id);
-    db.appInstances.erase(id);
-    if (env->CallIntMethod(db.jniInfo.jContextHubService,
+
+    if ((env == nullptr) ||
+        (env->CallIntMethod(db.jniInfo.jContextHubService,
                        db.jniInfo.contextHubServiceDeleteAppInstance,
-                       id) != 0) {
-        ALOGW("Could not delete App id : %d", id);
-        return -1;
+                       id) != 0)) {
+        ALOGW("Cannot delete App id (%" PRId32 ") from Java cache", id);
+        fullyDeleted = false;
     }
 
-    ALOGI("Deleted App id : %d", id);
-
-    return 0;
+    if (fullyDeleted) {
+        ALOGI("Deleted App id : %" PRId32, id);
+        return 0;
+    }
+    return -1;
 }
 
 static int startLoadAppTxn(uint64_t appId, int hubHandle) {
     app_instance_info_s *txnInfo = (app_instance_info_s *)malloc(sizeof(app_instance_info_s));
-    int instanceId = generate_id();
+    jint instanceId = generate_id();
 
     if (!txnInfo || instanceId < 0) {
         return_id(instanceId);
@@ -432,8 +478,8 @@
     return 0;
 }
 
-static int startUnloadAppTxn(uint32_t appInstanceHandle) {
-    uint32_t *txnData = (uint32_t *) malloc(sizeof(uint32_t));
+static int startUnloadAppTxn(jint appInstanceHandle) {
+    jint *txnData = (jint *) malloc(sizeof(jint));
     if (!txnData) {
         ALOGW("Cannot allocate memory to start unload transaction");
         return -1;
@@ -454,7 +500,6 @@
     int err = 0;
     db.hubInfo.hubs = nullptr;
     db.hubInfo.numHubs = 0;
-    int i;
 
     err = hw_get_module(CONTEXT_HUB_MODULE_ID,
                         (hw_module_t const**)(&db.hubInfo.contextHubModule));
@@ -465,7 +510,7 @@
     }
 
     // Prep for storing app info
-    for(i = MIN_APP_ID; i <= MAX_APP_ID; i++) {
+    for (jint i = MIN_APP_ID; i <= MAX_APP_ID; i++) {
         db.freeIds.push(i);
     }
 
@@ -485,7 +530,7 @@
                 return;
             }
 
-            for (i = 0; i < db.hubInfo.numHubs; i++) {
+            for (int i = 0; i < db.hubInfo.numHubs; i++) {
                 db.hubInfo.cookies[i] = db.hubInfo.hubs[i].hub_id;
                 ALOGI("Subscribing to hubHandle %d with OS App name %" PRIu64, i, db.hubInfo.hubs[i].os_app_name.id);
                 if (db.hubInfo.contextHubModule->subscribe_messages(db.hubInfo.hubs[i].hub_id,
@@ -547,13 +592,15 @@
         memcpy(&info, unalignedInfoAddr, sizeof(info));
         // We will only have one instance of the app
         // TODO : Change this logic once we support multiple instances of the same app
-        int appInstance = get_app_instance_for_app_id(info.app_name.id);
+        jint appInstance = get_app_instance_for_app_id(info.app_name.id);
         add_app_instance(&info, hubHandle, appInstance, env);
     }
 
     return 0;
 }
 
+// TODO(b/30807327): Do not use raw bytes for additional data.  Use the
+//     JNI interfaces for the appropriate types.
 static void passOnOsResponse(uint32_t hubHandle, uint32_t msgType,
                              status_response_t *rsp, int8_t *additionalData,
                              size_t additionalDataLen) {
@@ -584,7 +631,32 @@
     header[HEADER_FIELD_HUB_HANDLE] = hubHandle;
     header[HEADER_FIELD_APP_INSTANCE] = OS_APP_ID;
 
-    msg[0] = rsp->result;
+    // Due to API constraints, at the moment we can't change the fact that
+    // we're changing our 4-byte response to a 1-byte value.  But we can prevent
+    // the possible change in sign (and thus meaning) that would happen from
+    // a naive cast.  Further, we can log when we're losing part of the value.
+    // TODO(b/30918279): Don't truncate this result.
+    int8_t truncatedResult;
+    bool neededToTruncate;
+    if (rsp->result < INT8_MIN) {
+        neededToTruncate = true;
+        truncatedResult = INT8_MIN;
+    } else if (rsp->result > INT8_MAX) {
+        neededToTruncate = true;
+        truncatedResult = INT8_MAX;
+    } else {
+        neededToTruncate = false;
+        // Since this value fits within an int8_t, this is a safe cast which
+        // won't change the value or sign.
+        truncatedResult = static_cast<int8_t>(rsp->result);
+    }
+    if (neededToTruncate) {
+        ALOGW("Response from Context Hub truncated.  Value was %" PRId32
+              ", but giving Java layer %" PRId8,
+              rsp->result, (int)truncatedResult);
+    }
+
+    msg[0] = truncatedResult;
 
     if (additionalData) {
         memcpy(&msg[1], additionalData, additionalDataLen);
@@ -603,6 +675,8 @@
     env->CallIntMethod(db.jniInfo.jContextHubService,
                        db.jniInfo.contextHubServiceMsgReceiptCallback,
                        jheader, jmsg);
+    env->DeleteLocalRef(jmsg);
+    env->DeleteLocalRef(jheader);
 
     delete[] msg;
 }
@@ -613,7 +687,13 @@
 
     if (success && fetchTxnData(&txnId, &txnData) == 0 &&
         txnId == CONTEXT_HUB_UNLOAD_APP) {
-        db.appInstances.erase(*(uint32_t *)txnData);
+        JNIEnv *env;
+        if ((db.jniInfo.vm)->AttachCurrentThread(&env, nullptr) != JNI_OK) {
+            ALOGW("Could not attach to JVM !");
+            env = nullptr;
+        }
+        jint handle = *reinterpret_cast<jint *>(txnData);
+        delete_app_instance(handle, env);
     } else {
         ALOGW("Could not unload the app successfully ! success %d, txnData %p", success, txnData);
     }
@@ -621,7 +701,7 @@
     closeTxn();
 }
 
-void closeLoadTxn(bool success, int *appInstanceHandle) {
+static bool closeLoadTxn(bool success, jint *appInstanceHandle) {
     void *txnData;
     hub_messages_e txnId;
 
@@ -635,13 +715,17 @@
             add_app_instance(&info->appInfo, info->hubHandle, info->instanceId, env);
         } else {
             ALOGW("Could not attach to JVM !");
+            success = false;
         }
         sendQueryForApps(info->appInfo.app_name.id);
     } else {
         ALOGW("Could not load the app successfully ! Unexpected failure");
+        *appInstanceHandle = INVALID_APP_ID;
+        success = false;
     }
 
     closeTxn();
+    return success;
 }
 
 static bool isValidOsStatus(const uint8_t *msg, size_t msgLen,
@@ -668,6 +752,7 @@
 
     if ((db.jniInfo.vm)->AttachCurrentThread(&env, nullptr) != JNI_OK) {
         ALOGW("Could not attach to JVM !");
+        env = nullptr;
     }
 
     auto end = db.appInstances.end();
@@ -697,8 +782,27 @@
       case CONTEXT_HUB_UNLOAD_APP:
           if (isValidOsStatus(msg, msgLen, &rsp)) {
               if (msgType == CONTEXT_HUB_LOAD_APP) {
-                  int appInstanceHandle;
-                  closeLoadTxn(rsp.result == 0, &appInstanceHandle);
+                  jint appInstanceHandle = INVALID_APP_ID;
+                  bool appRunningOnHub = (rsp.result == 0);
+                  if (!(closeLoadTxn(appRunningOnHub, &appInstanceHandle))) {
+                      if (appRunningOnHub) {
+                          // Now we're in an odd situation.  Our nanoapp
+                          // is up and running on the Context Hub.  However,
+                          // something went wrong in our Service code so that
+                          // we're not able to properly track this nanoapp
+                          // in our Service code.  If we tell the Java layer
+                          // things are good, it's a lie because the handle
+                          // we give them will fail when used with the Service.
+                          // If we tell the Java layer this failed, it's kind
+                          // of a lie as well, since this nanoapp is running.
+                          //
+                          // We leave a more robust fix for later, and for
+                          // now just tell the user things have failed.
+                          //
+                          // TODO(b/30835981): Make this situation better.
+                          rsp.result = -1;
+                      }
+                  }
                   passOnOsResponse(hubHandle, msgType, &rsp, (int8_t *)(&appInstanceHandle),
                                    sizeof(appInstanceHandle));
               } else if (msgType == CONTEXT_HUB_UNLOAD_APP) {
@@ -778,7 +882,7 @@
     if (messageType < CONTEXT_HUB_TYPE_PRIVATE_MSG_BASE) {
         handle_os_message(messageType, hubHandle, (uint8_t*) msg->message, msg->message_len);
     } else {
-        int appHandle = get_app_instance_for_app_id(msg->app_name.id);
+        jint appHandle = get_app_instance_for_app_id(msg->app_name.id);
         if (appHandle < 0) {
             ALOGE("Filtering out message due to invalid App Instance.");
         } else {
@@ -1051,7 +1155,8 @@
         ALOGD("Asking HAL to remove app");
         retVal = db.hubInfo.contextHubModule->send_message(hubId, &msg);
     } else {
-      ALOGD("Could not find app instance %d on hubHandle %d, setAddress %d",
+      ALOGD("Could not find app instance %" PRId32 " on hubHandle %" PRId32
+            ", setAddress %d",
             header[HEADER_FIELD_APP_INSTANCE],
             header[HEADER_FIELD_HUB_HANDLE],
             (int)setAddressSuccess);
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 0d8a95c..73b3f52 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -371,7 +371,12 @@
     if (sur != NULL) {
         bufferProducer = sur->getIGraphicBufferProducer();
     }
-    SurfaceComposerClient::setDisplaySurface(token, bufferProducer);
+    status_t err = SurfaceComposerClient::setDisplaySurface(token,
+            bufferProducer);
+    if (err != NO_ERROR) {
+        doThrowIAE(env, "Illegal Surface, could not enable async mode. Was this"
+                " Surface created with singleBufferMode?");
+    }
 }
 
 static void nativeSetDisplayLayerStack(JNIEnv* env, jclass clazz,
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index a04fc2a..3207b3c 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -54,6 +54,7 @@
 #include "ScopedLocalRef.h"
 #include "ScopedPrimitiveArray.h"
 #include "ScopedUtfChars.h"
+#include "fd_utils-inl.h"
 
 #include "nativebridge/native_bridge.h"
 
@@ -436,6 +437,9 @@
 }
 #endif
 
+// The list of open zygote file descriptors.
+static FileDescriptorTable* gOpenFdTable = NULL;
+
 // Utility routine to fork zygote and specialize the child process.
 static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids,
                                      jint debug_flags, jobjectArray javaRlimits,
@@ -450,6 +454,18 @@
   SetForkLoad(true);
 #endif
 
+  // If this is the first fork for this zygote, create the open FD table.
+  // If it isn't, we just need to check whether the list of open files has
+  // changed (and it shouldn't in the normal case).
+  if (gOpenFdTable == NULL) {
+    gOpenFdTable = FileDescriptorTable::Create();
+    if (gOpenFdTable == NULL) {
+      RuntimeAbort(env, __LINE__, "Unable to construct file descriptor table.");
+    }
+  } else if (!gOpenFdTable->Restat()) {
+    RuntimeAbort(env, __LINE__, "Unable to restat file descriptor table.");
+  }
+
   pid_t pid = fork();
 
   if (pid == 0) {
@@ -459,6 +475,12 @@
     // Clean up any descriptors which must be closed immediately
     DetachDescriptors(env, fdsToClose);
 
+    // Re-open all remaining open file descriptors so that they aren't shared
+    // with the zygote across a fork.
+    if (!gOpenFdTable->Reopen()) {
+      RuntimeAbort(env, __LINE__, "Unable to reopen whitelisted descriptors.");
+    }
+
     // Keep capabilities across UID change, unless we're staying root.
     if (uid != 0) {
       EnableKeepCapabilities(env);
diff --git a/core/jni/fd_utils-inl.h b/core/jni/fd_utils-inl.h
new file mode 100644
index 0000000..1f34b02
--- /dev/null
+++ b/core/jni/fd_utils-inl.h
@@ -0,0 +1,448 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+#include <string>
+#include <unordered_map>
+#include <set>
+#include <vector>
+#include <algorithm>
+
+#include <dirent.h>
+#include <fcntl.h>
+#include <grp.h>
+#include <inttypes.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <cutils/log.h>
+#include "JNIHelp.h"
+#include "ScopedPrimitiveArray.h"
+
+// Whitelist of open paths that the zygote is allowed to keep open
+// that will be recreated across forks. In addition to files here,
+// all files ending with ".jar" under /system/framework" are
+// whitelisted. See FileDescriptorInfo::IsWhitelisted for the
+// canonical definition.
+static const char* kPathWhitelist[] = {
+  "/dev/null",
+  "/dev/pmsg0",
+  "/system/etc/event-log-tags",
+  "/sys/kernel/debug/tracing/trace_marker",
+  "/system/framework/framework-res.apk",
+  "/dev/urandom",
+  "/dev/ion"
+};
+
+static const char* kFdPath = "/proc/self/fd";
+
+// Keeps track of all relevant information (flags, offset etc.) of an
+// open zygote file descriptor.
+class FileDescriptorInfo {
+ public:
+  // Create a FileDescriptorInfo for a given file descriptor. Returns
+  // |NULL| if an error occurred.
+  static FileDescriptorInfo* createFromFd(int fd) {
+    struct stat f_stat;
+    // This should never happen; the zygote should always have the right set
+    // of permissions required to stat all its open files.
+    if (TEMP_FAILURE_RETRY(fstat(fd, &f_stat)) == -1) {
+      ALOGE("Unable to stat fd %d : %s", fd, strerror(errno));
+      return NULL;
+    }
+
+    // Ignore (don't reopen or fail on) socket fds for now.
+    if (S_ISSOCK(f_stat.st_mode)) {
+      ALOGW("Unsupported socket FD: %d, ignoring.", fd);
+      return new FileDescriptorInfo(fd);
+    }
+
+    // We only handle whitelisted regular files and character devices. Whitelisted
+    // character devices must provide a guarantee of sensible behaviour when
+    // reopened.
+    //
+    // S_ISDIR : Not supported. (We could if we wanted to, but it's unused).
+    // S_ISLINK : Not supported.
+    // S_ISBLK : Not supported.
+    // S_ISFIFO : Not supported. Note that the zygote uses pipes to communicate
+    // with the child process across forks but those should have been closed
+    // before we got to this point.
+    if (!S_ISCHR(f_stat.st_mode) && !S_ISREG(f_stat.st_mode)) {
+      ALOGE("Unsupported st_mode %d", f_stat.st_mode);
+      return NULL;
+    }
+
+    std::string file_path;
+    if (!Readlink(fd, &file_path)) {
+      return NULL;
+    }
+
+    if (!IsWhitelisted(file_path)) {
+      ALOGE("Not whitelisted : %s", file_path.c_str());
+      return NULL;
+    }
+
+    // File descriptor flags : currently on FD_CLOEXEC. We can set these
+    // using F_SETFD - we're single threaded at this point of execution so
+    // there won't be any races.
+    const int fd_flags = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFD));
+    if (fd_flags == -1) {
+      ALOGE("Failed fcntl(%d, F_GETFD) : %s", fd, strerror(errno));
+      return NULL;
+    }
+
+    // File status flags :
+    // - File access mode : (O_RDONLY, O_WRONLY...) we'll pass these through
+    //   to the open() call.
+    //
+    // - File creation flags : (O_CREAT, O_EXCL...) - there's not much we can
+    //   do about these, since the file has already been created. We shall ignore
+    //   them here.
+    //
+    // - Other flags : We'll have to set these via F_SETFL. On linux, F_SETFL
+    //   can only set O_APPEND, O_ASYNC, O_DIRECT, O_NOATIME, and O_NONBLOCK.
+    //   In particular, it can't set O_SYNC and O_DSYNC. We'll have to test for
+    //   their presence and pass them in to open().
+    int fs_flags = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+    if (fs_flags == -1) {
+      ALOGE("Failed fcntl(%d, F_GETFL) : %s", fd, strerror(errno));
+      return NULL;
+    }
+
+    // File offset : Ignore the offset for non seekable files.
+    const off_t offset = TEMP_FAILURE_RETRY(lseek64(fd, 0, SEEK_CUR));
+
+    // We pass the flags that open accepts to open, and use F_SETFL for
+    // the rest of them.
+    static const int kOpenFlags = (O_RDONLY | O_WRONLY | O_RDWR | O_DSYNC | O_SYNC);
+    int open_flags = fs_flags & (kOpenFlags);
+    fs_flags = fs_flags & (~(kOpenFlags));
+
+    return new FileDescriptorInfo(f_stat, file_path, fd, open_flags, fd_flags, fs_flags, offset);
+  }
+
+  // Checks whether the file descriptor associated with this object
+  // refers to the same description.
+  bool Restat() const {
+    struct stat f_stat;
+    if (TEMP_FAILURE_RETRY(fstat(fd, &f_stat)) == -1) {
+      return false;
+    }
+
+    return f_stat.st_ino == stat.st_ino && f_stat.st_dev == stat.st_dev;
+  }
+
+  bool Reopen() const {
+    // Always skip over socket FDs for now.
+    if (is_sock) {
+      return true;
+    }
+
+    // NOTE: This might happen if the file was unlinked after being opened.
+    // It's a common pattern in the case of temporary files and the like but
+    // we should not allow such usage from the zygote.
+    const int new_fd = TEMP_FAILURE_RETRY(open(file_path.c_str(), open_flags));
+
+    if (new_fd == -1) {
+      ALOGE("Failed open(%s, %d) : %s", file_path.c_str(), open_flags, strerror(errno));
+      return false;
+    }
+
+    if (TEMP_FAILURE_RETRY(fcntl(new_fd, F_SETFD, fd_flags)) == -1) {
+      close(new_fd);
+      ALOGE("Failed fcntl(%d, F_SETFD, %x) : %s", new_fd, fd_flags, strerror(errno));
+      return false;
+    }
+
+    if (TEMP_FAILURE_RETRY(fcntl(new_fd, F_SETFL, fs_flags)) == -1) {
+      close(new_fd);
+      ALOGE("Failed fcntl(%d, F_SETFL, %x) : %s", new_fd, fs_flags, strerror(errno));
+      return false;
+    }
+
+    if (offset != -1 && TEMP_FAILURE_RETRY(lseek64(new_fd, offset, SEEK_SET)) == -1) {
+      close(new_fd);
+      ALOGE("Failed lseek64(%d, SEEK_SET) : %s", new_fd, strerror(errno));
+      return false;
+    }
+
+    if (TEMP_FAILURE_RETRY(dup2(new_fd, fd)) == -1) {
+      close(new_fd);
+      ALOGE("Failed dup2(%d, %d) : %s", fd, new_fd, strerror(errno));
+      return false;
+    }
+
+    if (close(new_fd) == -1) {
+      ALOGW("Failed close(%d) : %s", new_fd, strerror(errno));
+    }
+
+    return true;
+  }
+
+  const int fd;
+  const struct stat stat;
+  const std::string file_path;
+  const int open_flags;
+  const int fd_flags;
+  const int fs_flags;
+  const off_t offset;
+  const bool is_sock;
+
+ private:
+  FileDescriptorInfo(int fd) :
+    fd(fd),
+    stat(),
+    open_flags(0),
+    fd_flags(0),
+    fs_flags(0),
+    offset(0),
+    is_sock(true) {
+  }
+
+  FileDescriptorInfo(struct stat stat, const std::string& file_path, int fd, int open_flags,
+                     int fd_flags, int fs_flags, off_t offset) :
+    fd(fd),
+    stat(stat),
+    file_path(file_path),
+    open_flags(open_flags),
+    fd_flags(fd_flags),
+    fs_flags(fs_flags),
+    offset(offset),
+    is_sock(false) {
+  }
+
+  // Returns true iff. a given path is whitelisted. A path is whitelisted
+  // if it belongs to the whitelist (see kPathWhitelist) or if it's a path
+  // under /system/framework that ends with ".jar".
+  static bool IsWhitelisted(const std::string& path) {
+    for (size_t i = 0; i < (sizeof(kPathWhitelist) / sizeof(kPathWhitelist[0])); ++i) {
+      if (kPathWhitelist[i] == path) {
+        return true;
+      }
+    }
+
+    static const std::string kFrameworksPrefix = "/system/framework/";
+    static const std::string kJarSuffix = ".jar";
+    if (path.compare(0, kFrameworksPrefix.size(), kFrameworksPrefix) == 0 &&
+        path.compare(path.size() - kJarSuffix.size(), kJarSuffix.size(), kJarSuffix) == 0) {
+      return true;
+    }
+    return false;
+  }
+
+  // TODO: Call android::base::Readlink instead of copying the code here.
+  static bool Readlink(const int fd, std::string* result) {
+    char path[64];
+    snprintf(path, sizeof(path), "/proc/self/fd/%d", fd);
+
+    // Code copied from android::base::Readlink starts here :
+
+    // Annoyingly, the readlink system call returns EINVAL for a zero-sized buffer,
+    // and truncates to whatever size you do supply, so it can't be used to query.
+    // We could call lstat first, but that would introduce a race condition that
+    // we couldn't detect.
+    // ext2 and ext4 both have PAGE_SIZE limitations, so we assume that here.
+    char buf[4096];
+    ssize_t len = readlink(path, buf, sizeof(buf));
+    if (len == -1) return false;
+
+    result->assign(buf, len);
+    return true;
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(FileDescriptorInfo);
+};
+
+// A FileDescriptorTable is a collection of FileDescriptorInfo objects
+// keyed by their FDs.
+class FileDescriptorTable {
+ public:
+  // Creates a new FileDescriptorTable. This function scans
+  // /proc/self/fd for the list of open file descriptors and collects
+  // information about them. Returns NULL if an error occurs.
+  static FileDescriptorTable* Create() {
+    DIR* d = opendir(kFdPath);
+    if (d == NULL) {
+      ALOGE("Unable to open directory %s: %s", kFdPath, strerror(errno));
+      return NULL;
+    }
+    int dir_fd = dirfd(d);
+    dirent* e;
+
+    std::unordered_map<int, FileDescriptorInfo*> open_fd_map;
+    while ((e = readdir(d)) != NULL) {
+      const int fd = ParseFd(e, dir_fd);
+      if (fd == -1) {
+        continue;
+      }
+
+      FileDescriptorInfo* info = FileDescriptorInfo::createFromFd(fd);
+      if (info == NULL) {
+        if (closedir(d) == -1) {
+          ALOGE("Unable to close directory : %s", strerror(errno));
+        }
+        return NULL;
+      }
+      open_fd_map[fd] = info;
+    }
+
+    if (closedir(d) == -1) {
+      ALOGE("Unable to close directory : %s", strerror(errno));
+      return NULL;
+    }
+    return new FileDescriptorTable(open_fd_map);
+  }
+
+  bool Restat() {
+    std::set<int> open_fds;
+
+    // First get the list of open descriptors.
+    DIR* d = opendir(kFdPath);
+    if (d == NULL) {
+      ALOGE("Unable to open directory %s: %s", kFdPath, strerror(errno));
+      return false;
+    }
+
+    int dir_fd = dirfd(d);
+    dirent* e;
+    while ((e = readdir(d)) != NULL) {
+      const int fd = ParseFd(e, dir_fd);
+      if (fd == -1) {
+        continue;
+      }
+
+      open_fds.insert(fd);
+    }
+
+    if (closedir(d) == -1) {
+      ALOGE("Unable to close directory : %s", strerror(errno));
+      return false;
+    }
+
+    return RestatInternal(open_fds);
+  }
+
+  // Reopens all file descriptors that are contained in the table. Returns true
+  // if all descriptors were re-opened, and false if an error occurred.
+  bool Reopen() {
+    std::unordered_map<int, FileDescriptorInfo*>::const_iterator it;
+    for (it = open_fd_map_.begin(); it != open_fd_map_.end(); ++it) {
+      const FileDescriptorInfo* info = it->second;
+      if (info == NULL || !info->Reopen()) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+ private:
+  FileDescriptorTable(const std::unordered_map<int, FileDescriptorInfo*>& map)
+      : open_fd_map_(map) {
+  }
+
+  bool RestatInternal(std::set<int>& open_fds) {
+    bool error = false;
+
+    // Iterate through the list of file descriptors we've already recorded
+    // and check whether :
+    //
+    // (a) they continue to be open.
+    // (b) they refer to the same file.
+    std::unordered_map<int, FileDescriptorInfo*>::iterator it;
+    for (it = open_fd_map_.begin(); it != open_fd_map_.end(); ++it) {
+      std::set<int>::const_iterator element = open_fds.find(it->first);
+      if (element == open_fds.end()) {
+        // The entry from the file descriptor table is no longer in the list
+        // of open files. We warn about this condition and remove it from
+        // the list of FDs under consideration.
+        //
+        // TODO(narayan): This will be an error in a future android release.
+        // error = true;
+        ALOGW("Zygote closed file descriptor %d.", it->first);
+        open_fd_map_.erase(it);
+      } else {
+        // The entry from the file descriptor table is still open. Restat
+        // it and check whether it refers to the same file.
+        open_fds.erase(element);
+        const bool same_file = it->second->Restat();
+        if (!same_file) {
+          // The file descriptor refers to a different description. We must
+          // update our entry in the table.
+          delete it->second;
+          it->second = FileDescriptorInfo::createFromFd(*element);
+          if (it->second == NULL) {
+            // The descriptor no longer no longer refers to a whitelisted file.
+            // We flag an error and remove it from the list of files we're
+            // tracking.
+            error = true;
+            open_fd_map_.erase(it);
+          }
+        } else {
+          // It's the same file. Nothing to do here.
+        }
+      }
+    }
+
+    if (open_fds.size() > 0) {
+      // The zygote has opened new file descriptors since our last inspection.
+      // We warn about this condition and add them to our table.
+      //
+      // TODO(narayan): This will be an error in a future android release.
+      // error = true;
+      ALOGW("Zygote opened %zd new file descriptor(s).", open_fds.size());
+
+      // TODO(narayan): This code will be removed in a future android release.
+      std::set<int>::const_iterator it;
+      for (it = open_fds.begin(); it != open_fds.end(); ++it) {
+        const int fd = (*it);
+        FileDescriptorInfo* info = FileDescriptorInfo::createFromFd(fd);
+        if (info == NULL) {
+          // A newly opened file is not on the whitelist. Flag an error and
+          // continue.
+          error = true;
+        } else {
+          // Track the newly opened file.
+          open_fd_map_[fd] = info;
+        }
+      }
+    }
+
+    return !error;
+  }
+
+  static int ParseFd(dirent* e, int dir_fd) {
+    char* end;
+    const int fd = strtol(e->d_name, &end, 10);
+    if ((*end) != '\0') {
+      return -1;
+    }
+
+    // Don't bother with the standard input/output/error, they're handled
+    // specially post-fork anyway.
+    if (fd <= STDERR_FILENO || fd == dir_fd) {
+      return -1;
+    }
+
+    return fd;
+  }
+
+  // Invariant: All values in this unordered_map are non-NULL.
+  std::unordered_map<int, FileDescriptorInfo*> open_fd_map_;
+
+  DISALLOW_COPY_AND_ASSIGN(FileDescriptorTable);
+};
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index ed71fc2..8bdb55e 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -183,6 +183,7 @@
     <protected-broadcast
         android:name="android.bluetooth.pan.profile.action.CONNECTION_STATE_CHANGED" />
     <protected-broadcast android:name="android.bluetooth.pbap.intent.action.PBAP_STATE_CHANGED" />
+    <protected-broadcast android:name="android.bluetooth.sap.profile.action.CONNECTION_STATE_CHANGED" />
     <protected-broadcast android:name="android.btopp.intent.action.INCOMING_FILE_NOTIFICATION" />
     <protected-broadcast android:name="android.btopp.intent.action.USER_CONFIRMATION_TIMEOUT" />
     <protected-broadcast android:name="android.btopp.intent.action.LIST" />
@@ -199,6 +200,8 @@
     <protected-broadcast android:name="com.android.bluetooth.pbap.userconfirmtimeout" />
     <protected-broadcast android:name="com.android.bluetooth.pbap.authresponse" />
     <protected-broadcast android:name="com.android.bluetooth.pbap.authcancelled" />
+    <protected-broadcast android:name="com.android.bluetooth.sap.USER_CONFIRM_TIMEOUT" />
+    <protected-broadcast android:name="com.android.bluetooth.sap.action.DISCONNECT_ACTION" />
 
     <protected-broadcast android:name="android.hardware.display.action.WIFI_DISPLAY_STATUS_CHANGED" />
 
@@ -394,6 +397,8 @@
 
     <protected-broadcast android:name="android.bluetooth.adapter.action.BLE_STATE_CHANGED" />
     <protected-broadcast android:name="com.android.bluetooth.map.USER_CONFIRM_TIMEOUT" />
+    <protected-broadcast android:name="com.android.bluetooth.BluetoothMapContentObserver.action.MESSAGE_SENT" />
+    <protected-broadcast android:name="com.android.bluetooth.BluetoothMapContentObserver.action.MESSAGE_DELIVERY" />
     <protected-broadcast android:name="android.content.jobscheduler.JOB_DELAY_EXPIRED" />
     <protected-broadcast android:name="android.content.syncmanager.SYNC_ALARM" />
     <protected-broadcast android:name="android.media.INTERNAL_RINGER_MODE_CHANGED_ACTION" />
@@ -1308,6 +1313,7 @@
         android:protectionLevel="dangerous"
         android:description="@string/permdesc_getAccounts"
         android:label="@string/permlab_getAccounts" />
+    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
 
     <!-- @SystemApi Allows applications to call into AccountAuthenticators.
     <p>Not for use by third-party applications. -->
diff --git a/core/res/res/drawable/ic_refresh.xml b/core/res/res/drawable/ic_refresh.xml
index 1f67168..1297407 100644
--- a/core/res/res/drawable/ic_refresh.xml
+++ b/core/res/res/drawable/ic_refresh.xml
@@ -21,7 +21,4 @@
     <path
         android:fillColor="#FF000000"
         android:pathData="M17.65,6.35C16.2,4.9 14.21,4.0 12.0,4.0c-4.42,0.0 -7.99,3.58 -7.99,8.0s3.57,8.0 7.99,8.0c3.73,0.0 6.84,-2.55 7.73,-6.0l-2.08,0.0c-0.82,2.33 -3.04,4.0 -5.65,4.0 -3.31,0.0 -6.0,-2.69 -6.0,-6.0s2.69,-6.0 6.0,-6.0c1.66,0.0 3.1,0.69 4.22,1.78L13.0,11.0l7.0,0.0L20.0,4.0l-2.35,2.35z"/>
-    <path
-        android:pathData="M0 0h24v24H0z"
-        android:fillColor="#00000000"/>
 </vector>
diff --git a/core/res/res/drawable/progress_indeterminate_anim_large_material.xml b/core/res/res/drawable/progress_indeterminate_anim_large_material.xml
new file mode 100644
index 0000000..560ec5a
--- /dev/null
+++ b/core/res/res/drawable/progress_indeterminate_anim_large_material.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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.
+-->
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+                 android:drawable="@drawable/vector_drawable_progress_bar_large" >
+    <target
+            android:name="progressBar"
+            android:animation="@anim/progress_indeterminate_material" />
+
+    <target
+            android:name="root"
+            android:animation="@anim/progress_indeterminate_rotation_material" />
+</animated-vector>
+
diff --git a/core/res/res/drawable/progress_indeterminate_anim_medium_material.xml b/core/res/res/drawable/progress_indeterminate_anim_medium_material.xml
new file mode 100644
index 0000000..fbea22f
--- /dev/null
+++ b/core/res/res/drawable/progress_indeterminate_anim_medium_material.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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.
+-->
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:drawable="@drawable/vector_drawable_progress_bar_medium" >
+
+    <target
+        android:name="progressBar"
+        android:animation="@anim/progress_indeterminate_material" />
+
+    <target
+        android:name="root"
+        android:animation="@anim/progress_indeterminate_rotation_material" />
+
+</animated-vector>
\ No newline at end of file
diff --git a/core/res/res/drawable/progress_large_material.xml b/core/res/res/drawable/progress_large_material.xml
index 526f914..ee82e35 100644
--- a/core/res/res/drawable/progress_large_material.xml
+++ b/core/res/res/drawable/progress_large_material.xml
@@ -13,16 +13,8 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:drawable="@drawable/vector_drawable_progress_bar_large" >
-
-    <target
-        android:name="progressBar"
-        android:animation="@anim/progress_indeterminate_material" />
-
-    <target
-        android:name="root"
-        android:animation="@anim/progress_indeterminate_rotation_material" />
-
-</animated-vector>
+<com.android.internal.graphics.drawable.AnimationScaleListDrawable
+        xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/progress_static_material" />
+    <item android:drawable="@drawable/progress_indeterminate_anim_large_material" />
+</com.android.internal.graphics.drawable.AnimationScaleListDrawable>
diff --git a/core/res/res/drawable/progress_medium_material.xml b/core/res/res/drawable/progress_medium_material.xml
index cc35816..5c92600 100644
--- a/core/res/res/drawable/progress_medium_material.xml
+++ b/core/res/res/drawable/progress_medium_material.xml
@@ -13,15 +13,8 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:drawable="@drawable/vector_drawable_progress_bar_medium" >
-
-    <target
-        android:name="progressBar"
-        android:animation="@anim/progress_indeterminate_material" />
-
-    <target
-        android:name="root"
-        android:animation="@anim/progress_indeterminate_rotation_material" />
-
-</animated-vector>
\ No newline at end of file
+<com.android.internal.graphics.drawable.AnimationScaleListDrawable
+        xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/progress_static_material" />
+    <item android:drawable="@drawable/progress_indeterminate_anim_medium_material" />
+</com.android.internal.graphics.drawable.AnimationScaleListDrawable>
diff --git a/core/res/res/drawable/progress_small_material.xml b/core/res/res/drawable/progress_small_material.xml
index c6e4380..cec9d95 100644
--- a/core/res/res/drawable/progress_small_material.xml
+++ b/core/res/res/drawable/progress_small_material.xml
@@ -13,16 +13,17 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:drawable="@drawable/vector_drawable_progress_bar_small" >
-
-    <target
-        android:name="progressBar"
-        android:animation="@anim/progress_indeterminate_material" />
-
-    <target
-        android:name="root"
-        android:animation="@anim/progress_indeterminate_rotation_material" />
-
-</animated-vector>
+<com.android.internal.graphics.drawable.AnimationScaleListDrawable
+        xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/progress_static_material" />
+    <item>
+        <animated-vector android:drawable="@drawable/vector_drawable_progress_bar_small" >
+            <target
+                    android:name="progressBar"
+                    android:animation="@anim/progress_indeterminate_material" />
+            <target
+                    android:name="root"
+                    android:animation="@anim/progress_indeterminate_rotation_material" />
+        </animated-vector>
+    </item>
+</com.android.internal.graphics.drawable.AnimationScaleListDrawable>
diff --git a/core/res/res/drawable/progress_static_material.xml b/core/res/res/drawable/progress_static_material.xml
new file mode 100644
index 0000000..b078fa9
--- /dev/null
+++ b/core/res/res/drawable/progress_static_material.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2016 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24.0dp"
+        android:height="24.0dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        >
+    <path
+        android:fillColor="?attr/colorControlActivated"
+        android:pathData="M17.65,6.35C16.2,4.9 14.21,4.0 12.0,4.0c-4.42,0.0 -7.99,3.58 -7.99,8.0s3.57,8.0 7.99,8.0c3.73,0.0 6.84,-2.55 7.73,-6.0l-2.08,0.0c-0.82,2.33 -3.04,4.0 -5.65,4.0 -3.31,0.0 -6.0,-2.69 -6.0,-6.0s2.69,-6.0 6.0,-6.0c1.66,0.0 3.1,0.69 4.22,1.78L13.0,11.0l7.0,0.0L20.0,4.0l-2.35,2.35z"/>
+</vector>
diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml
index 8023edf..350caaa 100644
--- a/core/res/res/values-gl-rES/strings.xml
+++ b/core/res/res/values-gl-rES/strings.xml
@@ -598,7 +598,7 @@
     <string name="phoneTypeCallback" msgid="2712175203065678206">"Devolver chamada"</string>
     <string name="phoneTypeCar" msgid="8738360689616716982">"Coche"</string>
     <string name="phoneTypeCompanyMain" msgid="540434356461478916">"Empresa (ppal.)"</string>
-    <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
+    <string name="phoneTypeIsdn" msgid="8022453193171370337">"RDSI"</string>
     <string name="phoneTypeMain" msgid="6766137010628326916">"Principal"</string>
     <string name="phoneTypeOtherFax" msgid="8587657145072446565">"Outro fax"</string>
     <string name="phoneTypeRadio" msgid="4093738079908667513">"Radio"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index bebe027..10c5836 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1362,7 +1362,7 @@
     <string name="action_menu_overflow_description" msgid="2295659037509008453">"אפשרויות נוספות"</string>
     <string name="action_bar_home_description_format" msgid="7965984360903693903">"‏%1$s‏, %2$s"</string>
     <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"‏%1$s‏, %2$s‏, %3$s"</string>
-    <string name="storage_internal" msgid="3570990907910199483">"אחסון משותף פנימי"</string>
+    <string name="storage_internal" msgid="3570990907910199483">"אחסון שיתוף פנימי"</string>
     <string name="storage_sd_card" msgid="3282948861378286745">"‏כרטיס SD"</string>
     <string name="storage_sd_card_label" msgid="6347111320774379257">"‏כרטיס SD של <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
     <string name="storage_usb_drive" msgid="6261899683292244209">"‏כונן USB"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 5b446b4..8bd7160 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1310,7 +1310,7 @@
     <string name="action_menu_overflow_description" msgid="2295659037509008453">"옵션 더보기"</string>
     <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
     <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
-    <string name="storage_internal" msgid="3570990907910199483">"내부 공유 저장공간"</string>
+    <string name="storage_internal" msgid="3570990907910199483">"내부 공유 저장용량"</string>
     <string name="storage_sd_card" msgid="3282948861378286745">"SD 카드"</string>
     <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD 카드"</string>
     <string name="storage_usb_drive" msgid="6261899683292244209">"USB 드라이브"</string>
diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml
index 0f82dcb..58c2c8a 100644
--- a/core/res/res/values-ky-rKG/strings.xml
+++ b/core/res/res/values-ky-rKG/strings.xml
@@ -1197,8 +1197,7 @@
     <string name="permdesc_readInstallSessions" msgid="2049771699626019849">"Колдонмого орнотуу сеанстарын окуу мүмкүнчүлүгүн берет. Ушуну менен, ал жигердүү топтом орнотууларынын чоо-жайын көрө алат."</string>
     <string name="permlab_requestInstallPackages" msgid="5782013576218172577">"орнотуу топтомдорун суроо"</string>
     <string name="permdesc_requestInstallPackages" msgid="5740101072486783082">"Колдонмо топтомдорду орнотууга уруксат сурай алат."</string>
-    <!-- no translation found for tutorial_double_tap_to_zoom_message_short (1311810005957319690) -->
-    <skip />
+    <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Масштабдын параметрлерин өзгөртүү үчүн бул жерди эки жолу басыңыз."</string>
     <string name="gadget_host_error_inflating" msgid="4882004314906466162">"Виджетти кошуу мүмкүн болбоду."</string>
     <string name="ime_action_go" msgid="8320845651737369027">"Өтүү"</string>
     <string name="ime_action_search" msgid="658110271822807811">"Издөө"</string>
@@ -1229,10 +1228,8 @@
     <string name="notification_ranker_binding_label" msgid="774540592299064747">"Эскертмелердин маанилүүлүгүн баалоо кызматы"</string>
     <string name="vpn_title" msgid="19615213552042827">"VPN иштетилди"</string>
     <string name="vpn_title_long" msgid="6400714798049252294">"VPN <xliff:g id="APP">%s</xliff:g> аркылуу жандырылды"</string>
-    <!-- no translation found for vpn_text (1610714069627824309) -->
-    <skip />
-    <!-- no translation found for vpn_text_long (4907843483284977618) -->
-    <skip />
+    <string name="vpn_text" msgid="1610714069627824309">"Тармактын параметрлерин өзгөртүү үчүн бул жерди басыңыз."</string>
+    <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> сеансына туташуу ишке ашты. Желенин параметрлерин өзгөртүү үчүн бул жерди басыңыз."</string>
     <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Дайым иштеген VPN туташууда…"</string>
     <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Дайым иштеген VPN туташтырылды"</string>
     <string name="vpn_lockdown_error" msgid="6009249814034708175">"Дайым иштеген VPN\'де ката кетти"</string>
diff --git a/core/res/res/values-mcc001/config.xml b/core/res/res/values-mcc001/config.xml
new file mode 100644
index 0000000..93cde03
--- /dev/null
+++ b/core/res/res/values-mcc001/config.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2016, 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.
+*/
+-->
+<resources>
+    <bool name="config_use_sim_language_file">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc222-mnc10/config.xml b/core/res/res/values-mcc222-mnc10/config.xml
index cd6e8c6..c819de2 100644
--- a/core/res/res/values-mcc222-mnc10/config.xml
+++ b/core/res/res/values-mcc222-mnc10/config.xml
@@ -28,29 +28,4 @@
     <string-array translatable="false" name="config_tether_apndata">
       <item>Tethering Internet,web.omnitel.it,,,,,,,,,222,10,,DUN</item>
     </string-array>
-
-    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
-        <item>21401</item>
-        <item>21402</item>
-        <item>21403</item>
-        <item>21404</item>
-        <item>21405</item>
-        <item>21406</item>
-        <item>21407</item>
-        <item>21408</item>
-        <item>21409</item>
-        <item>21410</item>
-        <item>21411</item>
-        <item>21412</item>
-        <item>21413</item>
-        <item>21414</item>
-        <item>21415</item>
-        <item>21416</item>
-        <item>21417</item>
-        <item>21418</item>
-        <item>21419</item>
-        <item>21420</item>
-        <item>21421</item>
-    </string-array>
-
 </resources>
diff --git a/core/res/res/values-mcc232-mnc10/config.xml b/core/res/res/values-mcc232-mnc10/config.xml
new file mode 100644
index 0000000..bdf83016
--- /dev/null
+++ b/core/res/res/values-mcc232-mnc10/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ ** Copyright 2016, 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.
+ */
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>23203</item>
+        <item>23205</item>
+    </string-array>
+</resources>
diff --git a/core/res/res/values-mcc232-mnc13/config.xml b/core/res/res/values-mcc232-mnc13/config.xml
new file mode 100644
index 0000000..2c14f87
--- /dev/null
+++ b/core/res/res/values-mcc232-mnc13/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ ** Copyright 2016, 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.
+ */
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>23203</item>
+    </string-array>
+</resources>
diff --git a/core/res/res/values-mcc302-mnc500/config.xml b/core/res/res/values-mcc302-mnc500/config.xml
new file mode 100644
index 0000000..77f6419
--- /dev/null
+++ b/core/res/res/values-mcc302-mnc500/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ ** Copyright 2016, 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.
+ */
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>302</item>
+    </string-array>
+</resources>
diff --git a/core/res/res/values-mcc302-mnc510/config.xml b/core/res/res/values-mcc302-mnc510/config.xml
new file mode 100644
index 0000000..77f6419
--- /dev/null
+++ b/core/res/res/values-mcc302-mnc510/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ ** Copyright 2016, 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.
+ */
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>302</item>
+    </string-array>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc480/config.xml b/core/res/res/values-mcc311-mnc480/config.xml
index 39ea2bf..4e17e98 100755
--- a/core/res/res/values-mcc311-mnc480/config.xml
+++ b/core/res/res/values-mcc311-mnc480/config.xml
@@ -69,4 +69,12 @@
         <item>true</item>
     </string-array>
     <string translatable="false" name="prohibit_manual_network_selection_in_gobal_mode">true</string>
+
+    <!-- Network switching warnings use toasts. -->
+    <integer translatable="false" name="config_networkNotifySwitchType">2</integer>
+    <!-- Notify when switching from Wi-Fi to cellular data. -->
+    <string-array translatable="false" name="config_networkNotifySwitches">
+        <item>WIFI-CELLULAR</item>
+    </string-array>
+
 </resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index ae115d8..5a356d5 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1310,7 +1310,7 @@
     <string name="action_menu_overflow_description" msgid="2295659037509008453">"Mais opções"</string>
     <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
     <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
-    <string name="storage_internal" msgid="3570990907910199483">"Armazenamento interno partilhado"</string>
+    <string name="storage_internal" msgid="3570990907910199483">"Armazen. interno partilhado"</string>
     <string name="storage_sd_card" msgid="3282948861378286745">"Cartão SD"</string>
     <string name="storage_sd_card_label" msgid="6347111320774379257">"Cartão SD <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
     <string name="storage_usb_drive" msgid="6261899683292244209">"Unidade USB"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 0c08564..0a96ba3 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2633,10 +2633,11 @@
             <enum name="viewEnd" value="6" />
         </attr>
 
-        <!-- Controls how this View is important for accessibility which is if it fires
-             accessibility events and if it is reported to accessibility services that
-             query the screen. Note: While not recommended, an accessibility service may
-             decide to ignore this attribute and operate on all views in the view tree. -->
+        <!-- Describes whether or not this view is important for accessibility.
+             If it is important, the view fires accessibility events and is
+             reported to accessibility services that query the screen. Note:
+             While not recommended, an accessibility service may decide to
+             ignore this attribute and operate on all views in the view tree. -->
         <attr name="importantForAccessibility" format="integer">
             <!-- The system determines whether the view is important for accessibility - default
                  (recommended). -->
@@ -5312,6 +5313,21 @@
         <attr name="alpha" />
     </declare-styleable>
 
+    <!-- Drawable used to render according to the animation scale. Esp. when it is 0 due to battery
+         saver mode. It should contain one animatable drawable and one static drawable.
+         @hide -->
+    <declare-styleable name="AnimationScaleListDrawable">
+    </declare-styleable>
+
+    <!-- Attributes that can be assigned to a AnimationScaleListDrawable item.
+         @hide -->
+    <declare-styleable name="AnimationScaleListDrawableItem">
+        <!-- Reference to a drawable resource to use for the state. If not
+             given, the drawable must be defined by the first child tag. -->
+        <attr name="drawable" />
+    </declare-styleable>
+
+
     <!-- Drawable used to render a geometric shape, with a gradient or a solid color. -->
     <declare-styleable name="GradientDrawable">
         <!-- Indicates whether the drawable should intially be visible. -->
@@ -5341,7 +5357,10 @@
         <attr name="innerRadius" format="dimension" />
         <!-- Thickness of the ring. When defined, thicknessRatio is ignored. -->
         <attr name="thickness" format="dimension" />
-        <!-- Indicates whether the drawable's level affects the way the gradient is drawn. -->
+        <!-- Whether the drawable level value (see
+             {@link android.graphics.drawable.Drawable#getLevel()}) is used to scale the shape.
+             Scaling behavior depends on the shape type. For "ring", the angle is scaled from 0 to
+             360. For all other types, there is no effect. The default value is true. -->
         <attr name="useLevel" />
         <!-- If set, specifies the color to apply to the drawable as a tint. By default,
              no tint is applied. May be a color state list. -->
@@ -5375,28 +5394,37 @@
     <declare-styleable name="GradientDrawableGradient">
         <!-- Start color of the gradient. -->
         <attr name="startColor" format="color" />
-        <!-- Optional center color. For linear gradients, use centerX or centerY
-             to place the center color. -->
+        <!-- Optional center color. For linear gradients, use centerX or centerY to place the center
+             color. -->
         <attr name="centerColor" format="color" />
         <!-- End color of the gradient. -->
         <attr name="endColor" format="color" />
+        <!-- Whether the drawable level value (see
+             {@link android.graphics.drawable.Drawable#getLevel()}) is used to scale the gradient.
+             Scaling behavior varies based on gradient type. For "linear", adjusts the ending
+             position along the gradient's axis of orientation. For "radial", adjusts the outer
+             radius. For "sweep", adjusts the ending angle. The default value is false. -->
         <attr name="useLevel" format="boolean" />
-        <!-- Angle of the gradient. -->
+        <!-- Angle of the gradient, used only with linear gradient. Must be a multiple of 45 in the
+             range [0, 315]. -->
         <attr name="angle" format="float" />
         <!-- Type of gradient. The default type is linear. -->
         <attr name="type">
-            <!-- Linear gradient. -->
+            <!-- Linear gradient extending across the center point. -->
             <enum name="linear" value="0" />
-            <!-- Radial, or circular, gradient. -->
+            <!-- Radial gradient extending from the center point outward. -->
             <enum name="radial" value="1" />
-            <!-- Sweep, or angled or diamond, gradient. -->
+            <!-- Sweep (or angular) gradient sweeping counter-clockwise around the center point. -->
             <enum name="sweep"  value="2" />
         </attr>
-        <!-- X coordinate of the origin of the gradient within the shape. -->
+        <!-- X-position of the center point of the gradient within the shape as a fraction of the
+             width. The default value is 0.5. -->
         <attr name="centerX" format="float|fraction" />
-        <!-- Y coordinate of the origin of the gradient within the shape. -->
+        <!-- Y-position of the center point of the gradient within the shape as a fraction of the
+             height. The default value is 0.5. -->
         <attr name="centerY" format="float|fraction" />
-        <!-- Radius of the gradient, used only with radial gradient. -->
+        <!-- Radius of the gradient, used only with radial gradient. May be an explicit dimension
+             or a fractional value relative to the shape's minimum dimension. -->
         <attr name="gradientRadius" format="float|fraction|dimension" />
     </declare-styleable>
 
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index e21925b..55a87ee 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -268,6 +268,13 @@
     <!-- The maximum duration (in milliseconds) we expect a network transition to take -->
     <integer name="config_networkTransitionTimeout">60000</integer>
 
+    <!-- Whether/how to notify the user on network switches. See LingerMonitor.java. -->
+    <integer translatable="false" name="config_networkNotifySwitchType">0</integer>
+
+    <!-- What types of network switches to notify. See LingerMonitor.java. -->
+    <string-array translatable="false" name="config_networkNotifySwitches">
+    </string-array>
+
     <!-- List of regexpressions describing the interface (if any) that represent tetherable
          USB interfaces.  If the device doesn't want to support tethering over USB this should
          be empty.  An example would be "usb.*" -->
@@ -2146,6 +2153,11 @@
     <!-- Flag specifying whether VT is available on device -->
     <bool name="config_device_vt_available">false</bool>
 
+    <!-- Flag specifying whether the device will use the "allow_hold_in_ims_call" carrier config
+         option.  When false, the device will support holding of IMS calls, regardless of the
+         carrier config setting. -->
+    <bool name="config_device_respects_hold_carrier_config">true</bool>
+
     <!-- Flag specifying whether VT should be available for carrier: independent of
          carrier provisioning. If false: hard disabled. If true: then depends on carrier
          provisioning, availability etc -->
@@ -2288,8 +2300,8 @@
     <!-- An array of CDMA roaming indicators which means international roaming -->
     <integer-array translatable="false" name="config_cdma_international_roaming_indicators" />
 
-    <!-- set the system language as value of EF LI/EF PL -->
-    <bool name="config_use_sim_language_file">true</bool>
+    <!-- flag to indicate if EF LI/EF PL should be used for system language -->
+    <bool name="config_use_sim_language_file">false</bool>
 
     <!-- Use ERI text for network name on CDMA LTE -->
     <bool name="config_LTE_eri_for_network_name">true</bool>
@@ -2519,4 +2531,13 @@
          Note: Also update appropriate overlay files. -->
     <string-array translatable="false" name="config_defaultFirstUserRestrictions">
     </string-array>
+
+    <!-- A array of regex to treat a SMS as VVM SMS if the message body matches.
+         Each item represents an entry, which consists of two parts:
+         a comma (,) separated list of MCCMNC the regex applies to, followed by a semicolon (;), and
+         then the regex itself. -->
+    <string-array translatable="false" name="config_vvmSmsFilterRegexes">
+        <!-- Verizon requires any SMS that starts with //VZWVVM to be treated as a VVM SMS-->
+        <item>310004,310010,310012,310013,310590,310890,310910,311110,311270,311271,311272,311273,311274,311275,311276,311277,311278,311279,311280,311281,311282,311283,311284,311285,311286,311287,311288,311289,311390,311480,311481,311482,311483,311484,311485,311486,311487,311488,311489;^//VZWVVM.*</item>
+    </string-array>
 </resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 6c26165..9002ed4 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -2929,6 +2929,27 @@
     <!-- A notification is shown when the user connects to a Wi-Fi network and the system detects that that network has no Internet access. This is the notification's message. -->
     <string name="wifi_no_internet_detailed">Tap for options</string>
 
+    <!-- A notification might be shown if the device switches to another network type (e.g., cellular data) because it detects that the network it was using (e.g., Wi-Fi) has lost Internet connectivity. This is the notification's title. %1$s is the network type that the device switched to, e.g., cellular data. It is one of the strings in the network_switch_type_name array. -->
+    <string name="network_switch_metered">Switched to <xliff:g id="network_type">%1$s</xliff:g></string>
+
+    <!-- A notification might be shown if the device switches to another network type (e.g., cellular data) because it detects that the network it was using (e.g., Wi-Fi) has lost Internet connectivity. This is the notification's message. %1$s is the network that the device switched to, e.g., cellular data. %2$s is the network type the device switched from, e.g., Wi-Fi. Both are strings in the network_switch_type_name array. -->
+    <string name="network_switch_metered_detail">Device uses <xliff:g id="new_network">%1$s</xliff:g> when <xliff:g id="previous_network">%2$s</xliff:g> has no Internet access. Charges may apply.</string>
+
+    <!-- A toast might be shown if the device switches to another network type (e.g., cellular data) because it detects that the network it was using (e.g., Wi-Fi) has lost Internet connectivity. This is the text of the toast. %1$s is the network that the device switched from, e.g., Wi-Fi. %2$s is the network type the device switched from, e.g., cellular data. Both are strings in the network_switch_type_name array. -->
+    <string name="network_switch_metered_toast">Switched from <xliff:g id="previous_network">%1$s</xliff:g> to <xliff:g id="new_network">%2$s</xliff:g></string>
+
+    <!-- Network type names used in the network_switch_metered and network_switch_metered_detail strings. These must be kept in the sync with the values NetworkCapabilities.TRANSPORT_xxx values, and in the same order. -->
+    <string-array name="network_switch_type_name">
+        <item>cellular data</item>
+        <item>Wi-Fi</item>
+        <item>Bluetooth</item>
+        <item>Ethernet</item>
+        <item>VPN</item>
+    </string-array>
+
+    <!-- Network type name displayed if one of the types is not found in network_switch_type_name. -->
+    <string name="network_switch_type_name_unknown">an unknown network type</string>
+
      <!-- A notification is shown when a user's selected SSID is later disabled due to connectivity problems.  This is the notification's title / ticker. -->
      <string name="wifi_watchdog_network_disabled">Couldn\'t connect to Wi-Fi</string>
      <!-- A notification is shown when a user's selected SSID is later disabled due to connectivity problems.  The complete alert msg is: <hotspot name> + this string, i.e. "Linksys has a poor internet connection" -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index c9ed497..c687fe8 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -947,6 +947,11 @@
   <java-symbol type="string" name="wifi_available_sign_in" />
   <java-symbol type="string" name="network_available_sign_in" />
   <java-symbol type="string" name="network_available_sign_in_detailed" />
+  <java-symbol type="string" name="network_switch_metered" />
+  <java-symbol type="string" name="network_switch_metered_detail" />
+  <java-symbol type="string" name="network_switch_metered_toast" />
+  <java-symbol type="array" name="network_switch_type_name" />
+  <java-symbol type="string" name="network_switch_type_name_unknown" />
   <java-symbol type="string" name="wifi_no_internet" />
   <java-symbol type="string" name="wifi_no_internet_detailed" />
   <java-symbol type="string" name="wifi_connect_alert_title" />
@@ -1739,6 +1744,8 @@
   <java-symbol type="integer" name="config_lowBatteryWarningLevel" />
   <java-symbol type="integer" name="config_networkPolicyDefaultWarning" />
   <java-symbol type="integer" name="config_networkTransitionTimeout" />
+  <java-symbol type="integer" name="config_networkNotifySwitchType" />
+  <java-symbol type="array" name="config_networkNotifySwitches" />
   <java-symbol type="integer" name="config_notificationsBatteryFullARGB" />
   <java-symbol type="integer" name="config_notificationsBatteryLedOff" />
   <java-symbol type="integer" name="config_notificationsBatteryLedOn" />
@@ -2204,6 +2211,7 @@
   <java-symbol type="bool" name="config_carrier_volte_provisioned" />
   <java-symbol type="bool" name="config_carrier_volte_tty_supported" />
   <java-symbol type="bool" name="config_device_vt_available" />
+  <java-symbol type="bool" name="config_device_respects_hold_carrier_config" />
   <java-symbol type="bool" name="config_carrier_vt_available" />
   <java-symbol type="bool" name="config_device_wfc_ims_available" />
   <java-symbol type="bool" name="config_carrier_wfc_ims_available" />
@@ -2266,6 +2274,8 @@
   <java-symbol type="string" name="prohibit_manual_network_selection_in_gobal_mode" />
   <java-symbol type="id" name="profile_button" />
 
+  <java-symbol type="array" name="config_vvmSmsFilterRegexes" />
+
   <!-- Cascading submenus -->
   <java-symbol type="dimen" name="cascading_menus_min_smallest_width" />
 
diff --git a/core/res/res/xml/sms_short_codes.xml b/core/res/res/xml/sms_short_codes.xml
index c02a01a..b357016 100644
--- a/core/res/res/xml/sms_short_codes.xml
+++ b/core/res/res/xml/sms_short_codes.xml
@@ -78,7 +78,7 @@
     <shortcode country="cz" premium="9\\d{6,7}" free="116\\d{3}" />
 
     <!-- Germany: 4-5 digits plus 1232xxx (premium codes from http://www.vodafone.de/infofaxe/537.pdf and http://premiumdienste.eplus.de/pdf/kodex.pdf), plus EU. To keep the premium regex from being too large, it only includes payment processors that have been used by SMS malware, with the regular pattern matching the other premium short codes. -->
-    <shortcode country="de" pattern="\\d{4,5}|1232\\d{3}" premium="11(?:111|833)|1232(?:013|021|060|075|286|358)|118(?:44|80|86)|20[25]00|220(?:21|22|88|99)|221(?:14|21)|223(?:44|53|77)|224[13]0|225(?:20|59|90)|226(?:06|10|20|26|30|40|56|70)|227(?:07|33|39|66|76|78|79|88|99)|228(?:08|11|66|77)|23300|30030|3[12347]000|330(?:33|55|66)|33(?:233|331|366|533)|34(?:34|567)|37000|40(?:040|123|444|[3568]00)|41(?:010|414)|44(?:000|044|344|44[24]|544)|50005|50100|50123|50555|51000|52(?:255|783)|54(?:100|2542)|55(?:077|[24]00|222|333|55|[12369]55)|56(?:789|886)|60800|6[13]000|66(?:[12348]66|566|766|777|88|999)|68888|70(?:07|123|777)|76766|77(?:007|070|222|444|[567]77)|80(?:008|123|888)|82(?:002|[378]00|323|444|472|474|488|727)|83(?:005|[169]00|333|830)|84(?:141|300|32[34]|343|488|499|777|888)|85888|86(?:188|566|640|644|650|677|868|888)|870[24]9|871(?:23|[49]9)|872(?:1[0-8]|49|99)|87499|875(?:49|55|99)|876(?:0[1367]|1[1245678]|54|99)|877(?:00|99)|878(?:15|25|3[567]|8[12])|87999|880(?:08|44|55|77|99)|88688|888(?:03|10|8|89)|8899|90(?:009|999)|99999" free="116\\d{3}|81214|81215|47529|70296" />
+    <shortcode country="de" pattern="\\d{4,5}|1232\\d{3}" premium="11(?:111|833)|1232(?:013|021|060|075|286|358)|118(?:44|80|86)|20[25]00|220(?:21|22|88|99)|221(?:14|21)|223(?:44|53|77)|224[13]0|225(?:20|59|90)|226(?:06|10|20|26|30|40|56|70)|227(?:07|33|39|66|76|78|79|88|99)|228(?:08|11|66|77)|23300|30030|3[12347]000|330(?:33|55|66)|33(?:233|331|366|533)|34(?:34|567)|37000|40(?:040|123|444|[3568]00)|41(?:010|414)|44(?:000|044|344|44[24]|544)|50005|50100|50123|50555|51000|52(?:255|783)|54(?:100|2542)|55(?:077|[24]00|222|333|55|[12369]55)|56(?:789|886)|60800|6[13]000|66(?:[12348]66|566|766|777|88|999)|68888|70(?:07|123|777)|76766|77(?:007|070|222|444|[567]77)|80(?:008|123|888)|82(?:002|[378]00|323|444|472|474|488|727)|83(?:005|[169]00|333|830)|84(?:141|300|32[34]|343|488|499|777|888)|85888|86(?:188|566|640|644|650|677|868|888)|870[24]9|871(?:23|[49]9)|872(?:1[0-8]|49|99)|87499|875(?:49|55|99)|876(?:0[1367]|1[1245678]|54|99)|877(?:00|99)|878(?:15|25|3[567]|8[12])|87999|880(?:08|44|55|77|99)|88688|888(?:03|10|8|89)|8899|90(?:009|999)|99999" free="116\\d{3}|81214|81215|47529|70296|73240|3011" />
 
     <!-- Denmark: see http://iprs.webspacecommerce.com/Denmark-Premium-Rate-Numbers -->
     <shortcode country="dk" pattern="\\d{4,5}" premium="1\\d{3}" free="116\\d{3}|4665" />
@@ -153,6 +153,9 @@
     <!-- Latvia: 4 digits, known premium codes listed, plus EU -->
     <shortcode country="lv" pattern="\\d{4}" premium="18(?:19|63|7[1-4])" free="116\\d{3}" />
 
+    <!-- Macedonia -->
+    <shortcode country="mk" free="129005|122" />
+
     <!-- Mexico: 4-5 digits (not confirmed), known premium codes listed -->
     <shortcode country="mx" pattern="\\d{4,5}" premium="53035|7766" free="46645" />
 
diff --git a/data/sounds/alarms/material/ogg/Bounce_OG7_1ch_48k.ogg b/data/sounds/alarms/material/ogg/Bounce_OG7_1ch_48k.ogg
index 6af4d70..3d1f8ea 100755
--- a/data/sounds/alarms/material/ogg/Bounce_OG7_1ch_48k.ogg
+++ b/data/sounds/alarms/material/ogg/Bounce_OG7_1ch_48k.ogg
Binary files differ
diff --git a/docs/html-intl/intl/es/about/versions/nougat/android-7.0-testing.jd b/docs/html-intl/intl/es/about/versions/nougat/android-7.0-testing.jd
deleted file mode 100644
index 20d2d6e..0000000
--- a/docs/html-intl/intl/es/about/versions/nougat/android-7.0-testing.jd
+++ /dev/null
@@ -1,190 +0,0 @@
-page.title=Guía de prueba
-page.image=images/cards/card-n-guide_2x.png
-meta.tags="preview", "testing"
-page.tags="preview", "developer preview"
-
-@jd:body
-
-<div id="tb-wrapper">
-  <div id="tb">
-    <h2>En este documento</h2>
-      <ol>
-        <li><a href="#runtime-permissions">Prueba de los permisos</a></li>
-        <li><a href="#doze-standby">Prueba de los modos Descanso y App Standby</a></li>
-        <li><a href="#ids">Copia de seguridad automática e identificadores de dispositivos</a></li>
-      </ol>
-  </div>
-</div>
-
-<p>
-  Android N te brinda la oportunidad de garantizar que tus aplicaciones funcionen con la próxima versión de la plataforma.
- Esta versión preliminar incluye diversas API y cambios en los comportamientos que pueden
-tener impactos en tu aplicación, como se describe en las secciones <a href="{@docRoot}preview/api-overview.html">Información general de la API</a> y <a href="{@docRoot}preview/behavior-changes.html">Cambios en los comportamientos</a>.
- Al probar tu aplicación con la versión preliminar, te debes centrar en algunos cambios específicos del sistema para garantizar que los usuarios disfruten de una buena experiencia.
-
-
-</p>
-
-<p>
-  En esta guía, se describen qué y cómo probar las características preliminares con tu aplicación. Debes priorizar la prueba de estas características específicas preliminares, puesto que podrían tener un alto impacto en el comportamiento de tu aplicación:
-
-
-</p>
-
-<ul>
-  <li><a href="#runtime-permissions">Permisos</a>
-  </li>
-  <li><a href="#doze-standby">Modos Descanso y App Standby</a>
-  </li>
-  <li><a href="#ids">Copia de seguridad automática e identificadores de dispositivos</a></li>
-</ul>
-
-<p>
-  Para obtener más información sobre cómo configurar dispositivos o dispositivos virtuales con una imagen
- del sistema de la versión preliminar para realizar pruebas, consulta la sección <a href="{@docRoot}preview/setup-sdk.html">Configurar el SDK de Android N</a>.
-
-</p>
-
-
-<h2 id="runtime-permissions">Prueba de los permisos</h2>
-
-<p>
-  El nuevo modelo de <a href="{@docRoot}preview/features/runtime-permissions.html">permisos</a> cambia el modo en que el usuario asigna permisos a tu aplicación.
- En lugar de conceder todos los permisos durante el procedimiento de instalación, tu aplicación debe solicitar al usuario los permisos individuales en el tiempo de ejecución.
-
- Para los usuarios, este comportamiento ofrece más control granular sobre las actividades de cada aplicación, así como un mejor contexto para comprender por qué la aplicación está solicitando un permiso específico.
- Los usuarios pueden conceder o revocar los permisos concedidos a una aplicación de forma individual en cualquier momento.
- Es muy probable que esta característica de la versión preliminar tenga un impacto en el comportamiento de tu aplicación y puede hacer que algunas características de tu aplicación no funcionen o funcionen en un estado degradado.
-
-
-</p>
-
-<p class="caution">
-  Este cambio afecta a todas las aplicaciones que se ejecutan en la nueva plataforma, incluso a aquellas que no tienen como destino la nueva versión de la plataforma.
- La plataforma ofrece un comportamiento de compatibilidad limitada para las aplicaciones heredadas, pero debes comenzar a planificar ahora la migración de tu aplicación al nuevo modelo de permisos, con el objetivo de publicar una versión actualizada de tu aplicación cuando se lance la plataforma oficial.
-
-
-</p>
-
-
-<h3 id="permission-test-tips">Tips para pruebas</h3>
-
-<p>
-  Usa los siguientes tips para pruebas como ayuda para planificar y ejecutar las pruebas de tu aplicación con el nuevo comportamiento de permisos.
-
-</p>
-
-<ul>
-  <li>Identifica los permisos actuales de tu aplicación y las rutas de códigos relacionadas.</li>
-  <li>Prueba los flujos del usuario en los datos y servicios protegidos por permisos.</li>
-  <li>Realiza pruebas con varias combinaciones de permisos concedidos/revocados.</li>
-  <li>Usa la herramienta {@code adb} para administrar permisos desde la línea de comando:
-    <ul>
-      <li>Enumera los permisos y estados por grupo:
-        <pre>adb shell pm list permissions -d -g</pre>
-      </li>
-      <li>Concede o revoca un permiso o más permisos utilizando la siguiente sintaxis:<br>
-        <pre>adb shell pm [grant|revoke] &lt;permission.name&gt; ...</pre>
-      </li>
-    </ul>
-  </li>
-  <li>Analiza tu aplicación para detectar servicios que utilizan permisos.</li>
-</ul>
-
-<h3 id="permission-test-strategy">Estrategia de prueba</h3>
-
-<p>
-  El cambio en los permisos afecta la estructura y el diseño de tu aplicación, además de la experiencia del usuario y los flujos que proporcionas a los usuarios.
- Debes evaluar el uso de los permisos actuales de tu aplicación y comenzar a planificar los nuevos flujos que deseas ofrecer.
- La versión oficial de la plataforma proporciona un comportamiento de compatibilidad, pero debes prever la actualización de tu aplicación y no depender de estos comportamientos.
-
-
-</p>
-
-<p>
-  Identifica los permisos que tu aplicación verdaderamente necesita y utiliza, y luego busca las diversas rutas de códigos que utilizan los servicios protegidos por permisos.
- Puedes realizar esto mediante una combinación de pruebas en la plataforma nueva y análisis de códigos.
- Al realizar las pruebas, debes centrarte en
- incluir permisos de tiempo de ejecución cambiando {@code targetSdkVersion} de la aplicación a la versión preliminar. Para
- obtener más información, consulta la sección <a href="{@docRoot}preview/setup-sdk.html#">Configurar el SDK de Android N</a>.
-
-</p>
-
-<p>
-  Realiza pruebas con diversas combinaciones de permisos revocados y agregados, a fin de destacar los flujos del usuario que dependen de permisos.
- Cuando una dependencia no sea obvia ni lógica, debes considerar la opción de refactorizar o compartimentar ese flujo para eliminar la dependencia o aclarar por qué se necesita el permiso.
-
-
-</p>
-
-<p>
-  Para obtener más información sobre el comportamiento de los permisos de tiempo de ejecución, las pruebas y las mejores prácticas, consulta la página <a href="{@docRoot}preview/features/runtime-permissions.html">Permisos</a> de la versión preliminar para desarrolladores.
-
-
-</p>
-
-
-<h2 id="doze-standby">Prueba de los modos Descanso y App Standby</h2>
-
-<p>
-  Las características de ahorro de energía de los modos Descanso y App Standby limitan la cantidad de procesamiento en segundo plano que puede realizar tu aplicación cuando un dispositivo se encuentra en estado inactivo o mientras tu aplicación no está en foco.
- Entre las restricciones que el sistema puede imponer en las aplicaciones se incluyen el acceso limitado a la red o denegación de acceso, suspensión de las tareas en segundo plano, suspensión de notificaciones, y alarmas y solicitudes de reactivación ignoradas.
-
- Para garantizar que tu aplicación tenga un comportamiento correcto con estas optimizaciones de ahorro de energía, debes probar tu aplicación simulando estos estados de bajo consumo.
-
-
-</p>
-
-<h4 id="doze">Cómo probar la aplicación en modo Descanso</h4>
-
-<p>Para probar el modo Descanso con tu aplicación, realiza lo siguiente:</p>
-
-<ol>
-<li>Configura un dispositivo de hardware o un dispositivo virtual con una imagen del sistema Android N.</li>
-<li>Conecta el dispositivo a tu equipo de desarrollo e instala tu aplicación.</li>
-<li>Ejecuta tu aplicación y déjala activa.</li>
-<li>Simula la activación del modo Descanso en el dispositivo ejecutando los siguientes comandos:
-
-<pre>
-$ adb shell dumpsys battery unplug
-$ adb shell dumpsys deviceidle step
-$ adb shell dumpsys deviceidle -h
-</pre>
-
-  </li>
-  <li>Observa el comportamiento de tu aplicación cuando se reactive el dispositivo. Asegúrate de que se recupere correctamente cuando el dispositivo salga del modo Descanso.
-</li>
-</ol>
-
-
-<h4 id="standby">Cómo probar aplicaciones en modo App Standby</h4>
-
-<p>Para probar el modo App Standby con tu aplicación, realiza lo siguiente:</p>
-
-<ol>
-  <li>Configura un dispositivo de hardware o un dispositivo virtual con una imagen del sistema Android N.</li>
-  <li>Conecta el dispositivo a tu equipo de desarrollo e instala tu aplicación.</li>
-  <li>Ejecuta tu aplicación y déjala activa.</li>
-  <li>Simula la activación del modo App Standby en la aplicación ejecutando los siguientes comandos:
-
-<pre>
-$ adb shell am broadcast -a android.os.action.DISCHARGING
-$ adb shell am set-idle &lt;packageName&gt; true
-</pre>
-
-  </li>
-  <li>Simula la activación de tu aplicación con el siguiente comando:
-    <pre>$ adb shell am set-idle &lt;packageName&gt; false</pre>
-  </li>
-  <li>Observa el comportamiento de tu aplicación al reactivarse. Asegúrate de que se recupere correctamente del modo App Standby.
- En particular, debes comprobar si los trabajos en segundo plano y las notificaciones de tu aplicación continúan funcionando de la manera esperada.
-</li>
-</ol>
-
-<h2 id="ids">Copia de seguridad automática para aplicaciones e identificadores específicos del dispositivo</h2>
-
-<p>Si tu aplicación continúa teniendo algún identificador específico del dispositivo, como la Id. de registro de Google Cloud Messaging, en el almacenamiento interno, asegúrate de seguir las mejores prácticas para excluir la ubicación de almacenamiento de la copia de seguridad automática, como se describe en la sección <a href="{@docRoot}preview/backup/index.html">Copia de seguridad automática para aplicaciones</a>.
-
-
-
- </p>
diff --git a/docs/html-intl/intl/es/about/versions/nougat/index.jd b/docs/html-intl/intl/es/about/versions/nougat/index.jd
index c931270..b30cc88 100644
--- a/docs/html-intl/intl/es/about/versions/nougat/index.jd
+++ b/docs/html-intl/intl/es/about/versions/nougat/index.jd
@@ -1,6 +1,6 @@
-page.title=Android N Developer Preview
-page.tags="preview","developer"
-meta.tags="preview", "android"
+page.title=Android 7.0 Nougat
+page.tags="androidn","versions"
+meta.tags="android n", "nougat", "android 7.0"
 fullpage=true
 forcelocalnav=true
 header.hide=1
@@ -17,62 +17,56 @@
   })
 </script>
 
-<section class="dac-expand dac-hero dac-light" style="background-color:#B2DFDB">
+<section class="dac-expand dac-hero dac-light">
   <div class="wrap" style="max-width:1100px;margin-top:0">
+  <a href="{@docRoot}about/versions/nougat/android-7.0.html">
     <div class="cols dac-hero-content" style="padding-bottom:1em;">
 
-      <div class="col-7of16 col-push-9of16" style="padding-left:2em">
-        <h1 class="dac-hero-title">Android N Developer Preview</h1>
+      <div class="col-7of16 col-push-8of16" style="padding-left:2em">
+        <h1 class="dac-hero-title">Android 7.0 Nougat</h1>
         <p class="dac-hero-description">
-          ¡Prepárate para Android N!
+          ¡Prepárate para Android Nougat!
           <strong>Prueba tus aplicaciones</strong> en Nexus y en otros dispositivos. Admite comportamientos del sistema
  nuevo para <strong>ahorrar energía y memoria</strong>.
           Amplía la funcionalidad de tus aplicaciones gracias a una <strong>IU con ventanas múltiples</strong>,
  <strong>notificaciones de respuestas directas</strong> y más.
         </p>
 
-        <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+        <a class="dac-hero-cta" href="{@docRoot}about/versions/nougat/android-7.0.html">
           <span class="dac-sprite dac-auto-chevron"></span>
           Comencemos
-        </a><!--<br>
-        <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
-          Update to Android N (final SDK)
-        </a><br>-->
+        </a>
       </div>
-      <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
-        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png" srcset="{@docRoot}images/home/n-preview-hero.png 1x,
-             {@docRoot}images/home/n-preview-hero_2x.png 2x">
+      <div class="col-7of16 col-pull-6of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
+        <a  href="{@docRoot}about/versions/nougat/android-7.0.html">
+        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png"
+             srcset="{@docRoot}images/home/n-preview-hero.png 1x,
+             {@docRoot}images/home/n-preview-hero_2x.png 2x" />
+           </a>
       </div>
-    </div>
+    </div></a>
     <div class="dac-section dac-small">
       <div class="resource-widget resource-flow-layout col-16"
-           data-query="collection:preview/landing/resources"
+           data-query="collection:nougat/landing/resources"
            data-cardSizes="6x2"
-           data-maxResults="6"></div>
-    </div>
+           data-maxResults="3"></div>
+         </div>
   </div>
 </section>
 
 <div id="useUpdatedTemplates" style="display:none" class="dac-section dac-slim dac-gray dac-expand">
   <div class="wrap dac-offset-parent">
-    <a class="dac-fab dac-scroll-button" data-scroll-button href="#build-apps">
+    <a class="dac-fab dac-scroll-button" data-scroll-button href="#latest">
       <i class="dac-sprite dac-arrow-down-gray"></i>
     </a>
     <ul class="dac-actions">
       <li class="dac-action">
-        <a class="dac-action-link" href="https://developer.android.com/preview/bug">
+        <a class="dac-action-link" href="https://source.android.com/source/report-bugs.html">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
           Informa un problema
         </a>
       </li>
       <li class="dac-action">
-        <a class="dac-action-link" href="{@docRoot}preview/support.html">
-          <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
-          Consulta las notas de la versión
-        </a>
-      </li>
-      <li class="dac-action">
         <a class="dac-action-link" href="{@docRoot}preview/dev-community">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
           Únete a la comunidad de desarrolladores
@@ -113,19 +107,33 @@
     data-initial-results="3"></div>
 </div></section>
 
-<section class="dac-section dac-gray"><div class="wrap">
-  <h1 class="dac-section-title">Recursos</h1>
+<section class="dac-section dac-gray" id="videos"><div class="wrap">
+  <h1 class="dac-section-title">Videos</h1>
   <div class="dac-section-subtitle">
-    Información esencial para ayudarte a preparar tus aplicaciones para Android N.
+    New Android capabilities and the right way to use them in your apps.
   </div>
 
   <div class="resource-widget resource-flow-layout col-16"
-       data-query="collection:preview/landing/more"
+    data-query="collection:nougat/landing/videos/first,type:youtube+tag:androidn"
+    data-sortOrder="-timestamp"
+    data-cardSizes="6x6"
+    data-items-per-page="6"
+    data-maxResults="15"
+    data-initial-results="3">
+  </div>
+</div></section>
+
+<section class="dac-section dac-light" id="resources"><div class="wrap">
+  <h1 class="dac-section-title">Recursos</h1>
+  <div class="dac-section-subtitle">
+    Información esencial para ayudarte a preparar tus aplicaciones para Android Nougat.
+  </div>
+
+  <div class="resource-widget resource-flow-layout col-16"
+       data-query="collection:nougat/landing/more"
        data-cardSizes="6x6"
        data-items-per-page="6"
        data-maxResults="15"
        data-initial-results="6"></div>
-
   </div>
-</section>
-
+</section>
\ No newline at end of file
diff --git a/docs/html-intl/intl/es/index.jd b/docs/html-intl/intl/es/index.jd
index 66f9bf0..e0d80c1 100644
--- a/docs/html-intl/intl/es/index.jd
+++ b/docs/html-intl/intl/es/index.jd
@@ -15,33 +15,30 @@
   })
 </script>
 
-<section class="dac-expand dac-hero dac-invert" style="background-color:#455A64">
-  <div class="wrap" style="max-width:1100px;margin-top:0">
-    <div class="col-7of16 col-push-9of16" style="padding-left:2em;">
-      <a href="{@docRoot}preview/index.html">
-        <h1 class="dac-hero-title">Android N Developer Preview</h1>
-        <p class="dac-hero-description">
-          Get ready for the next version of Android!
-          <strong>Test your apps</strong> on Nexus and other devices. Support new system
-          behaviors to <strong>save power and memory</strong>.
+<section class="dac-expand dac-hero" style="background-color:#b2dfdb;">
+  <div class="wrap" style="max-width:1000px;margin-top:0">
+    <div class="col-7of16 col-push-8of16">
+      <a href="{@docRoot}about/versions/nougat/index.html">
+        <h1 class="dac-hero-title" style="color:#004d40">Android 7.0 Nougat!</h1>
+        <p class="dac-hero-description" style="color:#004d40">
+          <strong>Android 7.0 Nougat is here!</strong>
+          Get your apps ready for the latest version of Android, with new system
+          behaviors to <strong>save battery and memory</strong>.
           Extend your apps with <strong>multi-window UI</strong>,
           <strong>direct reply notifications</strong> and more.
         </p>
-        <a class="dac-hero-cta" href="/preview/index.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
+        <a class="dac-hero-cta" href="{@docRoot}about/versions/nougat/index.html" style="color:#004d40">
+          <span class="dac-sprite dac-auto-chevron" style="background-color:#b2dfdb"></span>
           Learn more
-        </a><!--<br>
-        <a class="dac-hero-cta" href="/preview/support.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
-          Update to Developer Preview (final SDK)
-        </a><br>-->
+        </a>
+        </a>
       </a>
     </div>
-    <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:0em;padding-right:1.5em;">
-      <a href="{@docRoot}preview/index.html">
-        <img style="" class="dac-hero-image" src="/images/home/n-preview-hero.png"
-             srcset="/images/home/n-preview-hero.png 1x,
-             /images/home/n-preview-hero_2x.png 2x">
+    <div class="col-6of16 col-pull-6of16 dac-hero-figure" style="padding-left:1em;padding-top:1em;">
+      <a href="{@docRoot}about/versions/nougat/index.html">
+        <img class="dac-hero-image" src="{@docRoot}images/home/nougat_bg.jpg"
+             srcset="{@docRoot}images/home/nougat_bg.jpg 1x,
+             {@docRoot}images/home/nougat_bg_2x.jpg 2x">
         </a>
     </div>
   </div>
diff --git a/docs/html-intl/intl/es/preview/download_mp2.jd b/docs/html-intl/intl/es/preview/download_mp2.jd
deleted file mode 100644
index d71d8fd..0000000
--- a/docs/html-intl/intl/es/preview/download_mp2.jd
+++ /dev/null
@@ -1,360 +0,0 @@
-page.title=Descargas
-page.image=images/cards/card-download_16-9_2x.png
-
-@jd:body
-
-<div style="position:relative; min-height:600px">
-
-  <div class="wrap" id="tos" style="position:absolute;display:none;width:inherit;">
-
-    <p class="sdk-terms-intro">Antes de descargar e instalar los componentes del SDK de la versión preliminar de Android, debe aceptar los términos y las condiciones que se describen a continuación.
-</p>
-
-    <h2 class="norule">Términos y condiciones</h2>
-
-    <div class="sdk-terms" onfocus="this.blur()" style="width:678px">
-Este es el Contrato de licencia de la versión preliminar del SDK de Android (el “Contrato de licencia”). 1.
-
- Introducción 1.1 Se le otorga la licencia de la versión preliminar del SDK de Android (denominada “Versión preliminar” en este Contrato de licencia y que incluye específicamente los archivos de sistema de Android, las API agrupadas y los archivos de biblioteca de la Versión preliminar, si se encuentran disponibles), sujeto a los términos del Contrato de licencia.
-
- El Contrato de licencia establece una relación legal vinculante entre usted y Google en relación con el uso que usted realice de la Versión preliminar. 1.2 “Android” hace referencia al conjunto de soluciones Android para dispositivos, según se encuentre disponible en el Proyecto de código abierto de Android (Android Open Source Project), que se encuentra en la siguiente URL: http://source.android.com/, y según se actualiza periódicamente. 1.3 “Google” hace referencia a Google Inc., una corporación de Delaware, con sede principal en 1600 Amphitheatre Parkway, Mountain View, CA 94043, Estados Unidos. 2.
-
-
-
-
-
- Aceptación del Contrato de licencia 2.1 Para poder utilizar la Versión preliminar, primero debe aceptar el Contrato de licencia.
-
- Si no acepta el Contrato de licencia, no podrá utilizar la Versión preliminar. 2.2 Al hacer clic para aceptar o utilizar la Versión preliminar, por medio del presente, usted acepta los términos del Contrato de licencia. 2.3 Usted no puede utilizar la Versión preliminar ni aceptar el Contrato de licencia si tiene prohibido recibir la Versión preliminar en virtud de las leyes de los Estados Unidos o de otros países, lo que incluye el país donde es residente o desde el que utilizará la Versión preliminar. 2.4 Si usted utilizará la Versión preliminar de forma interna, dentro de su compañía u organización, usted acepta quedar sujeto al Contrato de licencia en representación de su empleador u otra entidad, y expresa y garantiza que tiene plena autoridad legal para vincular a su empleador o a dicha entidad al Contrato de licencia.
-
-
-
-
-
- Si no posee la autoridad exigida, no podrá aceptar el Contrato de licencia ni usar la Versión preliminar en representación de su empleador u otra entidad. 3.
-
- Licencia de la Versión preliminar de Google 3.1 Sujeto a los términos del Contrato de licencia, Google le otorga una licencia libre de regalías, no asignable, no exclusiva, no transferible a terceros, limitada y revocable para utilizar la Versión preliminar, de forma personal o interna dentro de su compañía u organización, únicamente para desarrollar aplicaciones para ejecutar en la plataforma de Android. 3.2 Usted acepta que Google u otros terceros poseen todos los derechos legales, títulos e intereses en relación con la Versión preliminar, incluidos los Derechos de propiedad intelectual que existan en la Versión preliminar.
-
-
-
- Los “Derechos de propiedad intelectual” hacen referencia a todos y cada uno de los derechos en virtud de las leyes de patentes, derechos de autor, secreto comercial y marca comercial, y todos los demás derechos de propiedad. Google se reserva todos los derechos que no se le otorguen expresamente. 3.3 No podrá utilizar la Versión preliminar para ningún otro propósito que no esté expresamente permitido en el Contrato de licencia.
-
- Excepto en la medida que lo exijan las licencias correspondientes de terceros, no podrá: (a) copiar (excepto con fines de copia de seguridad), modificar, adaptar, redistribuir, descompilar, utilizar técnicas de ingeniería inversa, desarmar ni crear trabajos derivados de la Versión preliminar ni de ninguna de sus partes; ni (b) cargar ninguna parte de la Versión preliminar en un teléfono móvil ni en ningún otro dispositivo de hardware (a excepción de una computadora personal), ni podrá combinar ninguna parte de la Versión preliminar con otro software, ni distribuir algún software o dispositivo que incorpore alguna parte de la Versión preliminar. 3.4 Usted acepta que no tomará medidas que pudieran provocar la fragmentación de Android, incluidas, entre otras, la distribución y la participación en la creación o la promoción de un kit de desarrollo de software derivado de la Versión preliminar. 3.5 El uso, la reproducción y la distribución de los componentes de la Versión preliminar con licencia de software de código abierto están regidos exclusivamente por los términos de la licencia de ese software de código abierto y no de este Contrato de licencia.
-
-
-
- Usted acepta mantener la licencia en buenas condiciones con respecto a dichas licencias de software de código abierto en virtud de todos los derechos otorgados y acepta abstenerse de realizar alguna acción que pueda poner fin, suspender o violar dichos derechos. 3.6 Usted acepta que la forma y la naturaleza de la Versión preliminar que proporciona Google pueden cambiar sin brindarle aviso previo y que las versiones futuras de la Versión preliminar pueden ser incompatibles con las aplicaciones desarrolladas en versiones anteriores de la Versión preliminar.
-
- Usted acepta que Google puede (de forma permanente o temporal) dejar de proporcionarles la Versión preliminar (o cualquiera de las características incluidas en ella) a usted o a los usuarios, generalmente, a criterio exclusivo de Google, sin brindarle aviso previo. 3.7 Ninguna declaración de este Contrato de licencia le otorga el derecho de utilizar alguno de los nombres comerciales, las marcas comerciales, las marcas de servicio, los logotipos, los nombres de dominio ni otras características distintivas de marca de Google. 3.8 Usted acepta que no eliminará, ocultará ni alterará ninguno de los avisos de derechos de propiedad (lo que incluye los avisos de marca comercial y derechos de autor) que pudieran estar anexados o incluidos en la Versión preliminar. 4.
-
-
-
-
-
- Uso que usted realiza de la Versión preliminar 4.1 Google acepta que ninguna declaración del Contrato de licencia le concede a Google derecho, título o interés alguno de su parte (o de parte de sus licenciantes), en virtud del Contrato de licencia, con respecto a las aplicaciones de software que usted desarrolle mediante el uso de la Versión preliminar, lo que incluye los derechos de propiedad intelectual que conlleven esas aplicaciones. 4.2 Usted acepta utilizar la Versión preliminar y escribir aplicaciones únicamente conforme a lo que permite (a) este Contrato de licencia y (b) las leyes, regulaciones, o prácticas y pautas generalmente aceptadas pertinentes en las jurisdicciones relevantes (lo que incluye las leyes sobre la exportación de datos o software hacia los Estados Unidos u otros países relevantes y desde ellos). 4.3 Usted acepta que si utiliza la Versión preliminar para desarrollar aplicaciones, protegerá la privacidad y los derechos legales de los usuarios.
-
-
-
-
-
- Si los usuarios le proporcionan sus nombres de usuario, contraseñas u otra información de inicio de sesión o información personal, debe comunicarles a los usuarios que la información se encontrará disponible para su aplicación, y debe proporcionarles a dichos usuarios un aviso de privacidad con protección y validez legal. Si su aplicación almacena información personal o confidencial proporcionada por los usuarios, lo debe hacer de forma segura. Si los usuarios le proporcionan información sobre la cuenta de Google, su aplicación solo puede usar esa información para acceder a la cuenta de Google del usuario siempre que este le haya otorgado permiso para hacerlo y con los fines para los que se lo haya otorgado. 4.4 Usted acepta que no participará en ninguna actividad con la Versión preliminar (lo que incluye el desarrollo o la distribución de una aplicación) que interfiera, interrumpa, dañe o acceda sin autorización a servidores, redes u otras propiedades o servicios de Google o de algún tercero. 4.5 Usted acepta que es el único responsable (y que Google no asume responsabilidades hacia usted ni terceros) de los datos, el contenido o los recursos que usted cree, transmita o muestre a través de Android o las aplicaciones para Android, y de las consecuencias de sus acciones (lo que incluye la pérdida o el daño que Google pudiera sufrir) al hacerlo. 4.6 Usted acepta que es el único responsable (y que Google no asume responsabilidades hacia usted ni terceros) de cualquier incumplimiento de sus obligaciones en virtud de este Contrato de licencia, los contratos aplicables de terceros o los términos del servicio, o cualquier ley o regulación pertinentes, y de las consecuencias (lo que incluye las pérdidas o los daños que pudieran sufrir Google o algún tercero) de dichos incumplimientos. 4.7 La Versión preliminar se encuentra en desarrollo, y sus pruebas y comentarios son una parte importante del proceso de desarrollo.
-
-
-
-
-
-
-
- Al utilizar la Versión preliminar, usted reconoce que la implementación de algunas características aún se encuentra en desarrollo y que no debe confiar en que la Versión preliminar contará con todas las funcionalidades de una versión estable. Usted acepta no distribuir públicamente ni enviar ninguna aplicación que utilice esta Versión preliminar, ya que esta Versión preliminar ya no se admitirá tras el lanzamiento del SDK oficial de Android. 5.
-
- Sus credenciales de desarrollador 5.1 Usted acepta que es responsable de mantener la confidencialidad de toda credencial de desarrollador que Google pudiera otorgarle o que usted pudiera escoger, y que será el único responsable de todas las aplicaciones que se desarrollen con sus credenciales de desarrollador. 6.
-
-
-
- Privacidad e información 6.1 A fin de poder innovar y mejorar de forma continua la Versión preliminar, Google podría recopilar ciertas estadísticas de uso del software, lo que incluye, entre otras características, un identificador único, la dirección IP asociada, el número de versión del software e información sobre las herramientas o los servicios de la Versión preliminar que se estén utilizando y la manera en que se estén utilizando.
-
- Antes de que se recopile esta información, la Versión preliminar se lo notificará y le solicitará su permiso. Si no otorga su permiso, no se recopilará la información. 6.2 Los datos recopilados se analizan en el agregado para mejorar la Versión preliminar y se conservan de acuerdo con la política de privacidad de Google que se encuentra en el sitio http://www.google.com/policies/privacy/. 7.
-
-
-
- Aplicaciones de terceros 7.1 Si utiliza la Versión preliminar para ejecutar aplicaciones desarrolladas por un tercero o que accedan a datos, contenido o recursos proporcionados por un tercero, usted acepta que Google no es responsable de esas aplicaciones, datos, contenido ni recursos.
-
- Usted comprende que todos los datos, contenidos o recursos a los que podría acceder a través de esas aplicaciones de terceros son exclusiva responsabilidad de la persona que los origina y que Google no es responsable de las pérdidas ni los daños que usted pudiera experimentar como consecuencia del uso o acceso de cualquiera de esas aplicaciones, datos, contenido o recursos de terceros. 7.2 Usted debe saber que los datos, el contenido y los recursos que se le presentan a través de esa aplicación de un tercero pueden estar protegidos por derechos de propiedad intelectual que les pertenecen a sus proveedores (o a otras personas o compañías en representación de estos).
-
- No puede modificar, alquilar, arrendar, prestar, vender, distribuir ni crear obras derivadas basadas en esos datos, contenidos o recursos (en su totalidad o en parte), a menos que los propietarios pertinentes le hayan otorgado permiso específicamente para hacerlo. 7.3 Usted acepta que el uso que haga de las aplicaciones, los datos, el contenido o los recursos de ese tercero puede estar sujeto a términos independientes entre usted y el tercero correspondiente. 8.
-
-
-
- Uso de las API de Google 8.1 API de Google 8.1.1 Si utiliza alguna API para recuperar datos de Google, usted acepta que los datos pueden estar protegidos por derechos de propiedad intelectual que le pertenecen a Google o a las partes que proporcionan esos datos (o a otras personas o empresas en representación de estos).
-
-
-
- El uso que realice de cualquiera de esas API puede estar sujeto a términos de servicio adicionales. No puede modificar, alquilar, arrendar, prestar, vender, distribuir ni crear obras derivadas basadas en esos datos (en su totalidad o en parte), a menos que los términos de servicio correspondientes lo permitan. 8.1.2 Si utiliza alguna API para recuperar datos de un usuario de Google, usted acepta y acuerda que solo podrá recuperar datos con el consentimiento explícito del usuario y solo con los fines limitados para los que el usuario le haya otorgado permiso para hacerlo. 9.
-
-
-
- Finalización del Contrato de licencia 9.1 Este Contrato de licencia tendrá vigencia hasta que lo revoquen usted o Google, como se indica a continuación. 9.2 Si desea rescindir el Contrato de licencia, puede hacerlo al interrumpir el uso que realiza de la Versión preliminar y de las credenciales de desarrollador pertinentes. 9.3 Google puede, en cualquier momento, rescindir el Contrato de licencia, con causa o sin ella, después de notificárselo a usted. 9.4 El Contrato de licencia finalizará automáticamente, sin previo aviso ni acción alguna, tras la primera de las siguientes situaciones: (A) cuando Google deje de proporcionar la Versión preliminar o ciertas partes de esta a los usuarios en el país donde usted reside o desde el que utiliza el servicio; y (B) cuando Google emita una versión final del SDK de Android. 9.5 Si el Contrato de licencia se rescinde, se revocará la licencia que usted recibió en virtud de dicho contrato; usted deberá suspender inmediatamente todo uso de la Versión preliminar y las disposiciones de los párrafos 10, 11, 12 y 14 seguirán vigentes indefinidamente. 10.
-
-
-
-
-
-
-
-
-
-
-
-
-
- EXENCIONES DE RESPONSABILIDAD 10.1 USTED COMPRENDE Y ACEPTA EXPRESAMENTE QUE EL USO QUE REALICE DE LA VERSIÓN PRELIMINAR ES BAJO SU PROPIO RIESGO Y QUE LA VERSIÓN PRELIMINAR SE PROPORCIONA “EN LAS CONDICIONES EN LAS QUE SE ENCUENTRA” Y “SUJETA A DISPONIBILIDAD” SIN GARANTÍAS DE NINGÚN TIPO POR PARTE DE GOOGLE. 10.2 EL USO QUE USTED REALICE DE LA VERSIÓN PRELIMINAR Y DE TODO MATERIAL DESCARGADO U OBTENIDO DE ALGUNA OTRA MANERA MEDIANTE EL USO DE LA VERSIÓN PRELIMINAR ES A SU ENTERO RIESGO Y DISCRECIÓN, Y USTED ES EL ÚNICO RESPONSABLE DE CUALQUIER DAÑO QUE PUDIERA SUFRIR SU SISTEMA INFORMÁTICO U OTRO DISPOSITIVO, O DE LA PÉRDIDA DE DATOS COMO CONSECUENCIA DE DICHO USO.
-
-
-
- SIN PERJUICIO DE LO MENCIONADO ANTERIORMENTE, USTED COMPRENDE QUE LA VERSIÓN PRELIMINAR NO ES UNA VERSIÓN ESTABLE, Y PUEDE CONTENER ERRORES, DEFECTOS Y VULNERABILIDADES DE SEGURIDAD QUE PUEDEN PROVOCAR DAÑOS SIGNIFICATIVOS, LO QUE INCLUYE LA PÉRDIDA COMPLETA E IRRECUPERABLE DEL USO DE SU SISTEMA INFORMÁTICO U OTRO DISPOSITIVO. 10.3 GOOGLE TAMBIÉN RECHAZA TODAS LAS GARANTÍAS Y CONDICIONES DE CUALQUIER TIPO, EXPRESAS O IMPLÍCITAS, INCLUIDAS, ENTRE OTRAS, LAS GARANTÍAS Y CONDICIONES DE COMERCIABILIDAD, IDONEIDAD PARA UN FIN DETERMINADO Y NO VIOLACIÓN. 11.
-
-
-
- LIMITACIÓN DE RESPONSABILIDADES 11.1 USTED COMPRENDE Y ACEPTA EXPRESAMENTE QUE GOOGLE, SUS SUBSIDIARIAS Y FILIALES, Y SUS LICENCIANTES NO SERÁN RESPONSABLES ANTE USTED, EN VIRTUD DE NINGUNA TEORÍA DE RESPONSABILIDAD, POR NINGÚN DAÑO DIRECTO, INDIRECTO, INCIDENTAL, ESPECIAL, RESULTANTE NI PUNITIVO EN EL QUE PODRÍA HABER INCURRIDO, LO QUE INCLUYE LA PÉRDIDA DE DATOS, YA SEA QUE SE LE HAYA NOTIFICADO O NO A GOOGLE O A SUS REPRESENTANTES, O SOBRE CUYA POSIBILIDAD ESTOS DEBERÍAN HABER SABIDO. 12.
-
-
-
- Indemnización 12.1 Hasta el grado máximo que permita la ley, usted acepta defender, indemnizar y eximir de responsabilidades a Google, sus filiales y sus respectivos directores, funcionarios, empleados y agentes, de todo tipo de reclamo, acción legal y proceso judicial, así como de las pérdidas, responsabilidades, daños, costos y gastos (incluidos los honorarios razonables de abogados) que surjan o se acumulen (a) del uso que usted realiza de la Versión preliminar, (b) de cualquier aplicación que desarrolle en la Versión preliminar que infrinja algún derecho de propiedad intelectual de cualquier persona, o que difame a cualquier persona o viole sus derechos de publicidad o privacidad, y (c) del incumplimiento por su parte del Contrato de licencia. 13.
-
-
-
- Cambios en el Contrato de licencia 13.1 Google puede realizar cambios en el Contrato de licencia a medida que distribuye nuevas versiones de la Versión preliminar.
-
- Cuando se realicen esos cambios, Google emitirá una nueva versión del Contrato de licencia, que estará disponible en el sitio web donde se ponga a la venta la Versión preliminar. 14.
-
- Términos legales generales 14.1 El Contrato de licencia constituye el contrato legal integral entre usted y Google, y rige el uso que usted realice de la Versión preliminar (a excepción de los servicios que Google pueda proporcionarle en virtud de un contrato por escrito independiente), y reemplaza totalmente cualquier contrato anterior entre usted y Google en relación con la Versión preliminar. 14.2 Usted acepta que, si Google no ejerce ni impone un derecho o recurso legal especificados en el Contrato de licencia (o sobre el que Google tenga beneficios conforme a cualquier ley aplicable), esto no se considerará una renuncia formal a los derechos por parte de Google y Google aún seguirá recibiendo los beneficios de esos derechos o recursos legales. 14.3 Si algún tribunal judicial con jurisdicción para decidir sobre este asunto determina que alguna de las disposiciones de este Contrato de licencia no es válida, se eliminará esa disposición del Contrato de licencia sin que eso afecte la validez del resto del contrato.
-
-
-
-
-
- Las disposiciones restantes del Contrato de licencia continuarán siendo válidas y aplicables. 14.4 Usted reconoce y acepta que cada miembro del grupo de compañías de las que Google es la compañía central serán terceros beneficiarios del Contrato de licencia, y que esas otras empresas tendrán el derecho de imponer directamente cualquier disposición y ampararse en las disposiciones de este Contrato de licencia que les confieran un beneficio (o que confieran derechos a su favor).
-
- Además de esto, ninguna otra persona o compañía serán terceros beneficiarios del Contrato de licencia. 14.5 RESTRICCIONES DE EXPORTACIÓN.
-
- LA VERSIÓN PRELIMINAR ESTÁ SUJETA A LAS LEYES Y REGULACIONES DE EXPORTACIÓN DE LOS ESTADOS UNIDOS. DEBE CUMPLIR CON TODAS LAS LEYES Y REGULACIONES DE EXPORTACIÓN NACIONALES E INTERNACIONALES QUE SE APLIQUEN A LA VERSIÓN PRELIMINAR. ESTAS LEYES INCLUYEN RESTRICCIONES EN RELACIÓN CON LOS DESTINOS, USUARIOS FINALES Y USO FINAL. 14.6 Usted no puede asignar ni transferir el Contrato de licencia sin la aprobación previa por escrito de Google y todo intento de asignación sin dicha aprobación no tendrá validez.
-
- No podrá delegar sus responsabilidades u obligaciones otorgados en virtud del Contrato de licencia sin la aprobación previa por escrito de Google. 14.7 El Contrato de licencia y su relación con Google conforme al Contrato de licencia se regirán por las leyes del estado de California, independientemente de los principios de conflictos entre leyes.
-
- Usted y Google aceptan presentarse ante la jurisdicción exclusiva de los tribunales del condado de Santa Clara, California, para resolver cualquier asunto legal que pudiera surgir del Contrato de licencia. Sin perjuicio de esto, usted acepta que Google aún podrá aplicar reparaciones conforme a mandato judicial (o a un tipo equivalente de desagravio legal) en cualquier jurisdicción.
-  </div><!-- sdk terms -->
-
-
-
-    <div id="sdk-terms-form">
-      <p>
-        <input id="agree" type="checkbox" name="agree" value="1" onclick="onAgreeChecked()" />
-        <label id="agreeLabel" for="agree">He leído y acepto los términos y las condiciones anteriores.</label>
-      </p>
-      <p><a href="" class="button disabled" id="downloadForRealz" onclick="return onDownloadForRealz(this);"></a></p>
-    </div>
-
-
-  </div><!-- end TOS -->
-
-
-  <div id="landing">
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>Contenido del documento</h2>
-      <ol>
-        <li><a href="#sdk">SDK de la versión preliminar</a></li>
-        <li><a href="#docs">Documentación para desarrolladores</a></li>
-        <li><a href="#images">Imágenes del sistema de hardware</a></li>
-      </ol>
-
-      <h2>Legacy downloads</h2>
-        <ol>
-           <li><a href="{@docRoot}preview/download_mp1.html">Developer Preview Archive</a></li>
-        </ol>
-  </div>
-</div>
-
-
-<p>
-  El SDK de la versión preliminar de Android M incluye herramientas de desarrollo, archivos de sistema de Android y archivos de biblioteca que lo ayudarán a probar su aplicación y las nuevas API que se incluirán en la próxima versión de la plataforma.
- En este documento, se describe la manera de obtener los componentes que se pueden descargar de la versión preliminar para probar su aplicación.
-
-</p>
-
-
-<h2 id="sdk">SDK de la versión preliminar</h2>
-
-<p>
-  El SDK de la versión preliminar se encuentra disponible para descargarlo a través del <a href="{@docRoot}tools/help/sdk-manager.html">Administrador de SDK de Android</a>. Para obtener más información sobre cómo descargar y configurar el SDK de la versión preliminar, consulte la sección <a href="{@docRoot}preview/setup-sdk.html#downloadSdk">Configurar el SDK de la versión preliminar</a>.
-
-</p>
-
-
-<h2 id="docs">Documentación para desarrolladores</h2>
-
-<p>
-  El paquete de descarga de documentación para desarrolladores brinda información detallada de referencia sobre las API y un informe de diferencias de las API para la versión preliminar.
-</p>
-
-<table>
-  <tr>
-    <th scope="col">Description</th>
-    <th scope="col">Download / Checksums</th>
-  </tr>
-  <tr id="docs-dl">
-    <td>Android M Preview 2<br>Developer Docs</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >m-preview-2-developer-docs.zip</a><br>
-      MD5: 1db6fff9c722b0339757e1cdf43663a8<br>
-      SHA-1: 5a4ae88d644e63824d21b0e18f8e3977a7665157
-    </td>
-  </tr>
-</table>
-
-
-<h2 id="images">Imágenes del sistema de hardware</h2>
-
-<p>
-  Estas imágenes del sistema le permiten instalar una versión preliminar de la plataforma en un dispositivo físico para realizar pruebas.
- Al configurar un dispositivo con una de estas imágenes, puede instalar y probar su aplicación para ver cómo funciona en la próxima versión de la plataforma.
- El proceso de instalación de una imagen del sistema en un dispositivo <em>elimina todos los datos del dispositivo</em>, por lo que debe hacer una copia de seguridad de los datos antes de instalar una imagen del sistema.
-
-
-</p>
-
-<p class="warning">
-  <b>Advertencia:</b> Las siguientes imágenes del sistema de Android son versiones preliminares y están sujetas a cambios. El uso que haga de estas imágenes del sistema se rige por el Contrato de licencia de la versión preliminar del SDK de Android.
- Las imágenes del sistema de la versión preliminar de Android no son versiones estables y pueden contener errores y defectos que pueden generar daños en sus sistemas informáticos, dispositivos y datos.
-
- Las imágenes del sistema de la versión preliminar de Android no se someten a las mismas pruebas que el OS de fábrica y podrían hacer que el teléfono, y las aplicaciones y los servicios instalados dejen de funcionar.
-
-
-</p>
-
-<table>
-  <tr>
-    <th scope="col">Device</th>
-    <th scope="col">Download / Checksums</th>
-  </tr>
-  <tr id="hammerhead">
-    <td>Nexus 5 (GSM/LTE) <br>"hammerhead"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >hammerhead-MPZ79M-preview-b1f4bde4.tgz</a><br>
-      MD5: 2ca9f18bf47a061b339bab52647ceb0d<br>
-      SHA-1: b1f4bde447eccbf8ce5d9b8b8ba954e3eac8e939
-    </td>
-  </tr>
-  <tr id="shamu">
-    <td>Nexus 6 <br>"shamu"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >shamu-MPZ79M-preview-e1024040.tgz</a><br>
-      MD5: 24a2118da340b9afedfbdfc026f6ff81<br>
-      SHA-1: e10240408859d5188c4aae140e1c539130ba614b
-    </td>
-  </tr>
-  <tr id="volantis">
-    <td>Nexus 9 <br>"volantis"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >volantis-MPZ79M-preview-9f305342.tgz</a><br>
-      MD5: 9edabf0a4c61b247f1cbb9dfdc0a899e<br>
-      SHA-1: 9f30534216f10899a6a75495fc7e92408ea333a7
-    </td>
-  </tr>
-
-  <tr id="fugu">
-    <td>Nexus Player <br>"fugu"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >fugu-MPZ79N-preview-fb63af98.tgz</a><br>
-      MD5: e8d081137a20b66df595ee69523314b5<br>
-      SHA-1: fb63af98302dd97be8de9313734d389ccdcce250
-    </td>
-  </tr>
-
-</table>
-
-<h3 id="install-image">Instalar una imagen en un dispositivo</h3>
-
-<p>
-  Si desea utilizar una imagen del dispositivo para realizar pruebas, debe instalarla en un dispositivo compatible. Siga las instrucciones que se ofrecen a continuación para instalar una imagen del sistema:
-
-</p>
-
-<ol>
-  <li>Descargue y descomprima uno de los paquetes de imágenes del sistema que se enumeran aquí.</li>
-  <li>Realice una copia de seguridad de los datos del dispositivo que desee conservar.</li>
-  <li>Siga las instrucciones que se describen en el sitio <a href="https://developers.google.com/android/nexus/images#instructions">developers.google.com/android</a>
- para actualizar la imagen en su dispositivo.
-</li>
-</ol>
-
-<p class="note">
-  <strong>Nota:</strong> Cuando haya actualizado un dispositivo de desarrollo con la imagen del sistema de la versión preliminar, se actualizará automáticamente con la próxima versión preliminar a través de actualizaciones OTA.
-
-</p>
-
-<h3 id="revertDevice">Restablecer las especificaciones de fábrica en un dispositivo</h3>
-
-<p>
-  Si desea desinstalar la versión preliminar y restablecer las especificaciones de fábrica en un dispositivo, visite el sitio <a href="http://developers.google.com/android/nexus/images">developers.google.com/android</a> y descargue la imagen con la que desea actualizar su dispositivo.
-
- Siga las instrucciones que se describen en esa página para actualizar la imagen en su dispositivo.
-
-</p>
-
-  </div><!-- landing -->
-
-</div><!-- relative wrapper -->
-
-
-
-<script>
-  var urlRoot = "http://storage.googleapis.com/androiddevelopers/shareables/preview/";
-  function onDownload(link) {
-
-    $("#downloadForRealz").html("Download " + $(link).text());
-    $("#downloadForRealz").attr('href', urlRoot + $(link).text());
-
-    $("#tos").fadeIn('fast');
-    $("#landing").fadeOut('fast');
-
-    return true;
-  }
-
-
-  function onAgreeChecked() {
-    /* verify that the TOS is agreed */
-    if ($("input#agree").is(":checked")) {
-      /* reveal the download button */
-      $("a#downloadForRealz").removeClass('disabled');
-    } else {
-      $("a#downloadForRealz").addClass('disabled');
-    }
-  }
-
-  function onDownloadForRealz(link) {
-    if ($("input#agree").is(':checked')) {
-    /*
-      $("#tos").fadeOut('fast');
-      $("#landing").fadeIn('fast');
-    */
-
-      ga('send', 'event', 'M Preview', 'System Image', $("#downloadForRealz").html());
-
-    /*
-      location.hash = "";
-    */
-      return true;
-    } else {
-      return false;
-    }
-  }
-
-  $(window).hashchange( function(){
-    if (location.hash == "") {
-      location.reload();
-    }
-  });
-
-</script>
diff --git a/docs/html-intl/intl/es/preview/features/background-optimization.jd b/docs/html-intl/intl/es/preview/features/background-optimization.jd
deleted file mode 100644
index c061a09..0000000
--- a/docs/html-intl/intl/es/preview/features/background-optimization.jd
+++ /dev/null
@@ -1,391 +0,0 @@
-page.title=Optimizaciones en segundo plano
-page.metaDescription=Nuevas restricciones para transmisiones implícitas.
-page.keywords="android N", "implicit broadcasts", "job scheduler"
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>
-      En este documento
-    </h2>
-
-    <ol>
-      <li>
-        <a href="#connectivity-action">Restricciones en CONNECTIVITY_ACTION</a>
-      </li>
-
-      <li>
-        <a href="#sched-jobs">Programación de trabajos en red en conexiones
-        sin medición de uso</a>
-      </li>
-
-      <li>
-        <a href="#monitor-conn">Control de la conectividad de la red mientras la aplicación
-        se está ejecutando</a>
-      </li>
-
-      <li>
-        <a href="#media-broadcasts">Restricciones en NEW_PICTURE y
-        NEW_VIDEO</a>
-      </li>
-
-      <li>
-        <a href="#new-jobinfo">Nuevos métodos de JobInfo</a>
-      </li>
-
-      <li>
-        <a href="#new-jobparam">Nuevos métodos de JobParameter</a>
-      </li>
-
-      <li>
-        <a href="#further-optimization">Cómo optimizar aún más tu aplicación</a>
-      </li>
-    </ol>
-  </div>
-</div>
-
-<p>
-  Los procesos en segundo plano pueden consumir mucha memoria y batería. Por ejemplo, una
-  transmisión implícita puede iniciar muchos procesos en segundo plano registrados para
-  escucharla, aunque esos procesos quizá no desempeñen un trabajo considerable. Esto puede
- afectar de forma significativa tanto el rendimiento del dispositivo como la experiencia de usuario.
-</p>
-
-<p>
-  Para corregir este problema, en Android N se aplican las siguientes
- restricciones:
-</p>
-
-<ul>
-  <li>Las aplicaciones orientadas a la Preview no reciben transmisiones {@link
-  android.net.ConnectivityManager#CONNECTIVITY_ACTION} si
- en su manifiesto registran que las reciben. Las aplicaciones que se ejecutan aún pueden
- escuchar {@code CONNECTIVITY_CHANGE} en su subproceso principal mediante el registro de un
- {@link android.content.BroadcastReceiver} con {@link
-  android.content.Context#registerReceiver Context.registerReceiver()}.
-  </li>
-
-  <li>Las aplicaciones no pueden enviar ni recibir transmisiones {@link
-  android.hardware.Camera#ACTION_NEW_PICTURE} ni {@link
-  android.hardware.Camera#ACTION_NEW_VIDEO}. Esta optimización
- afecta a todas las aplicaciones, no solo a aquellas orientadas a la Preview.
-  </li>
-</ul>
-
-<p>
-  Si la aplicación utiliza cualquiera de estas intents, debes quitar las dependencias en
- ellas lo antes posible a fin de poder orientar los dispositivos Android N correctamente.
-  El framework de Android ofrece varias soluciones para mitigar la necesidad de
-  estas transmisiones implícitas. Por ejemplo, {@link android.app.job.JobScheduler}
-  y <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-  {@code GcmNetworkManager}</a> proporcionan mecanismos sólidos para programar operaciones
-  de red cuando se cumplen las condiciones especificadas, como una conexión a una
-  red de uso no medido. Ahora también puedes usar {@link android.app.job.JobScheduler}
-  para reaccionar a cambios en relación con los proveedores de contenido. Los objetos {@link android.app.job.JobInfo}
-  encapsulan los parámetros que usa {@link android.app.job.JobScheduler}
-  para programar el trabajo. Cuando se cumplen las condiciones del trabajo, el sistema
-  ejecuta ese trabajo en el {@link android.app.job.JobService} de tu aplicación.
-</p>
-
-<p>
-  En este documento, aprenderemos cómo usar métodos alternativos, como
-  {@link android.app.job.JobScheduler}, para adaptar tu aplicación a esas nuevas
-  restricciones.
-</p>
-
-<h2 id="connectivity-action">
-  Restricciones en CONNECTIVITY_ACTION
-</h2>
-
-<p>
-  Las aplicaciones orientadas a Android N no reciben transmisiones {@link
-  android.net.ConnectivityManager#CONNECTIVITY_ACTION} si en su manifiesto
- registran que las reciben, y los procesos que dependan de esta
- transmisión no se iniciarán. Esto podría ser un problema para aplicaciones que buscan
- escuchar los cambios en la red o realizar múltiples actividades en red cuando el
- dispositivo se conecta a una red sin medición de uso. Ya existen varias soluciones
-  en relación con esta restricción en el framework de Android, pero elegir
-  la correcta depende de lo que quieras lograr con tu aplicación.
-</p>
-
-<p class="note">
-  <strong>Nota:</strong> Un {@link android.content.BroadcastReceiver} registrado con
- {@link android.content.Context#registerReceiver Context.registerReceiver()}
- continúa recibiendo estas transmisiones mientras se ejecuta la aplicación.
-</p>
-
-<h3 id="sched-jobs">
-  Programación de trabajos en red en conexiones sin medición de uso
-</h3>
-
-<p>
-  Cuando uses la clase {@link android.app.job.JobInfo.Builder JobInfo.Builder}
-  para crear tu objeto {@link android.app.job.JobInfo}, aplica el método {@link
-  android.app.job.JobInfo.Builder#setRequiredNetworkType
-  setRequiredNetworkType()} y pasa {@link android.app.job.JobInfo
-  JobInfo.NETWORK_TYPE_UNMETERED} como parámetro de trabajo. El siguiente ejemplo de código
-  programa la ejecución de un servicio cuando el dispositivo se conecta a una red sin
-  medición de uso y se está cargando:
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-      (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo job = new JobInfo.Builder(
-    MY_BACKGROUND_JOB,
-    new ComponentName(context, MyJobService.class))
-      .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
-      .setRequiresCharging(true)
-      .build();
-  js.schedule(job);
-}
-</pre>
-
-<p>
-  Cuando se cumplan las condiciones para tu trabajo, tu aplicación recibirá un callback para ejecutar
-  el método {@link android.app.job.JobService#onStartJob onStartJob()} en la
-   {@code JobService.class} especificada. Para ver más ejemplos de la implementación de {@link
-  android.app.job.JobScheduler}, consulta la <a href="{@docRoot}samples/JobScheduler/index.html">aplicación de ejemplo JobScheduler</a>.
-</p>
-
-<p>
-  Las aplicaciones que usan servicios de GMSCore y están orientadas a Android 5.0 (API nivel 21)
-  o anterior, pueden usar <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-  {@code GcmNetworkManager}</a> y especificar {@code Task.NETWORK_STATE_UNMETERED}.
-</p>
-
-<h3 id="monitor-conn">
-  Control de la conectividad de la red mientras la aplicación se está ejecutando
-</h3>
-
-<p>
-  Las aplicaciones que se ejecutan aún pueden escuchar {@code CONNECTIVITY_CHANGE} con un
- {@link android.content.BroadcastReceiver} registrado. No obstante, la API {@link
-  android.net.ConnectivityManager} ofrece un método más robusto para solicitar
- un callback solo cuando se cumplen las condiciones de red especificadas.
-</p>
-
-<p>
-  Los objetos {@link android.net.NetworkRequest} definen los parámetros del
-  callback de la red en términos de {@link android.net.NetworkCapabilities}. Creas
-  objetos {@link android.net.NetworkRequest} con la clase {@link
-  android.net.NetworkRequest.Builder NetworkRequest.Builder}. {@link
-  android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,
-  android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()}
-  y luego pasa el objeto {@link android.net.NetworkRequest} al sistema. Cuando
-  se cumplen las condiciones de la red, la aplicación recibe un callback para ejecutar el método
-  {@link android.net.ConnectivityManager.NetworkCallback#onAvailable
-  onAvailable()} definido en su clase {@link
-  android.net.ConnectivityManager.NetworkCallback}.
-</p>
-
-<p>
-  La aplicación continuará recibiendo callbacks hasta que la aplicación salga o llame a
-  {@link android.net.ConnectivityManager#unregisterNetworkCallback
-  unregisterNetworkCallback()}.
-</p>
-
-<h2 id="media-broadcasts">
-  Restricciones en NEW_PICTURE y NEW_VIDEO
-</h2>
-
-<p>
-  En Android N, las aplicaciones no pueden enviar ni recibir transmisiones {@link
-  android.hardware.Camera#ACTION_NEW_PICTURE} ni {@link
-  android.hardware.Camera#ACTION_NEW_VIDEO}. Esta restricción ayuda a
- aliviar el impacto en el rendimiento y la experiencia de usuario cuando varias aplicaciones deben
- activarse para procesar una nueva imagen o video. Android N
- extiende {@link android.app.job.JobInfo} y {@link
-  android.app.job.JobParameters} para proporcionar una solución alternativa.
-</p>
-
-<h3 id="new-jobinfo">
-  Nuevos métodos de JobInfo
-</h3>
-
-<p>
-  Para activar trabajos en los cambios del URI de contenido, Android N extiende
- la API {@link android.app.job.JobInfo} con los siguientes métodos:
-</p>
-
-<dl>
-  <dt>
-    {@code JobInfo.TriggerContentUri()}
-  </dt>
-
-  <dd>
-    Encapsula parámetros necesarios para activar un trabajo en cambios del URI de contenido.
-  </dd>
-
-  <dt>
-    {@code JobInfo.Builder.addTriggerContentUri()}
-  </dt>
-
-  <dd>
-    Pasa un objeto {@code TriggerContentUri} a {@link
-    android.app.job.JobInfo}. Un {@link android.database.ContentObserver}
-    controla el URI de contenido encapsulado. Si hay múltiples objetos {@code
-    TriggerContentUri} asociados a un trabajo, el sistema proporciona un
-    callback aunque se informe un cambio en un solo URI de contenido.
-  </dd>
-
-  <dd>
-    Si cambia algún desencadenante del URI determinado, agrega el marcador {@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS} para
-    activar el trabajo. Este marcador
-    corresponde al parámetro {@code notifyForDescendants} pasado a {@link
-    android.content.ContentResolver#registerContentObserver
-    registerContentObserver()}.
-  </dd>
-</dl>
-
-<p class="note">
-  <strong>Nota:</strong> No se puede usar {@code TriggerContentUri()} junto
-  con {@link android.app.job.JobInfo.Builder#setPeriodic
-  setPeriodic()} ni {@link android.app.job.JobInfo.Builder#setPersisted
-  setPersisted()}. Para controlar de forma constante la presencia de cambios en el contenido, programa un nuevo
-  {@link android.app.job.JobInfo} antes de que el {@link
-  android.app.job.JobService} de la aplicación termine de administrar la callback más reciente.
-</p>
-
-<p>
-  El siguiente código de ejemplo programa la activación de un trabajo cuando el sistema informe
-  un cambio en el URI de contenido, {@code MEDIA_URI}:
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-          (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo.Builder builder = new JobInfo.Builder(
-          MY_BACKGROUND_JOB,
-          new ComponentName(context, MediaContentJob.class));
-  builder.addTriggerContentUri(
-          new JobInfo.TriggerContentUri(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
-          JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
-  js.schedule(builder.build());
-}
-</pre>
-<p>
-  Cuando el sistema informa un cambio en el(los) URI de contenido especificado(s), tu aplicación
-  recibe un callback y se pasa un objeto {@link android.app.job.JobParameters}
-  al método {@link android.app.job.JobService#onStartJob onStartJob()}
-  en {@code MediaContentJob.class}.
-</p>
-
-<h3 id="new-jobparam">
-  Nuevos métodos de JobParameter
-</h3>
-
-<p>
-  Android N también amplía {@link android.app.job.JobParameters} para
- permitir que tu aplicación reciba información útil sobre qué autoridades de contenido
- y URI activaron el trabajo:
-</p>
-
-<dl>
-  <dt>
-    {@code Uri[] getTriggeredContentUris()}
-  </dt>
-
-  <dd>
-    Devuelve el arreglo de los URI que activaron el trabajo. Ese arreglo será {@code
-    null} si ningún URI activó el trabajo (por ejemplo, el trabajo
-    se activó debido al cumplimiento de un plazo o por otro motivo), o la cantidad de URI
-    modificados es superior a 50.
-  </dd>
-
-  <dt>
-    {@code String[] getTriggeredContentAuthorities()}
-  </dt>
-
-  <dd>
-    Devuelve el arreglo de cadenas de autoridades de contenido que activaron el trabajo.
-    Si el arreglo devuelto no es {@code null}, usa {@code getTriggeredContentUris()}
-    para recuperar los detalles de los URI que se modificaron.
-  </dd>
-</dl>
-
-<p>
-  El siguiente código de ejemplo anula el método {@link
-  android.app.job.JobService#onStartJob JobService.onStartJob()} y
-  registra las autoridades de contenido y los URI que activaron el trabajo:
-</p>
-
-<pre>
-&#64;Override
-public boolean onStartJob(JobParameters params) {
-  StringBuilder sb = new StringBuilder();
-  sb.append("Media content has changed:\n");
-  if (params.getTriggeredContentAuthorities() != null) {
-      sb.append("Authorities: ");
-      boolean first = true;
-      for (String auth :
-          params.getTriggeredContentAuthorities()) {
-          if (first) {
-              first = false;
-          } else {
-             sb.append(", ");
-          }
-           sb.append(auth);
-      }
-      if (params.getTriggeredContentUris() != null) {
-          for (Uri uri : params.getTriggeredContentUris()) {
-              sb.append("\n");
-              sb.append(uri);
-          }
-      }
-  } else {
-      sb.append("(No content)");
-  }
-  Log.i(TAG, sb.toString());
-  return true;
-}
-</pre>
-
-<h2 id="further-optimization">
-  Cómo optimizar aún más tu aplicación
-</h2>
-
-<p>
-  Optimizar tus aplicaciones para que se ejecuten en dispositivos con poca memoria o en condiciones de niveles bajos
-  de memoria puede mejorar el rendimiento y la experiencia del usuario. Eliminar
- dependencias en servicios en segundo plano y receptores de transmisiones implícitas
- registrados estadísticamente puede ayudar a que tu aplicación se ejecute mejor en esos dispositivos. Si bien
- Android N toma medidas para reducir algunos de estos problemas, te
- recomendamos que optimices tu aplicación para que pueda ejecutarse sin utilizar esos
- procesos en segundo plano.
-</p>
-
-<p>
-  Android N presenta algunos comandos adicionales de <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge (ADB)</a> que
- puedes usar para probar el comportamiento de la aplicación con esos procesos en segundo plano deshabilitados:
-</p>
-
-<ul>
-  <li>Para simular condiciones en las que no hay transmisiones implícitas ni servicios en segundo plano
- disponibles, ingresa el siguiente comando:
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set &lt;package&gt; RUN_IN_BACKGROUND ignore}
-</pre>
-  </li>
-
-  <li>Para volver a habilitar las transmisiones implícitas y los servicios en segundo plano, ingresa el
-  siguiente comando:
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set &lt;package&gt; RUN_IN_BACKGROUND allow}
-</pre>
-  </li>
-</ul>
diff --git a/docs/html-intl/intl/es/preview/features/icu4j-framework.jd b/docs/html-intl/intl/es/preview/features/icu4j-framework.jd
deleted file mode 100644
index e87c4dd..0000000
--- a/docs/html-intl/intl/es/preview/features/icu4j-framework.jd
+++ /dev/null
@@ -1,159 +0,0 @@
-page.title=API de ICU4J en el framework de Android
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>En este documento:</h2>
-<ol>
-    <li><a href="#relation">Relación con ICU4J</a></li>
-    <li><a href="#migration">Migración hacia API de android.icu desde ICU4J</a></li>
-    <li><a href="#licence">Licencias</a></li>
-</ol>
-
-<h2>Consulta también</h2>
-<ol>
-  <li>
-    <a class="external-link" href="http://userguide.icu-project.org">Documentación para ICU4J</a>
-  </li>
-
-  <li>
-    <a class="external-link" href="http://site.icu-project.org/#TOC-What-is-ICU-">Últimos estándares compatibles
- con ICU4J</a>
-  </li>
-</ol>
-</div>
-</div>
-
-<p>
-  ICU4J es un conjunto de bibliotecas de Java de código abierto y amplio uso que brinda soporte de Unicode
- y de globalización para aplicaciones de software. Android N
- expone un subconjunto de las API de ICU4J en el framework de Android para que los desarrolladores de aplicaciones
- lo usen debajo del paquete {@code android.icu}. Estas API usan
- datos de ubicación que están presentes en el dispositivo. Como resultado, puedes reducir la superficie de APK
- evitando la compilación de las bibliotecas de ICU4J en APK. En lugar de esto, puedes
- llamarlas en el framework. (En este caso, posiblemente debas brindar
- <a href="{@docRoot}google/play/publishing/multiple-apks.html">versiones múltiples
- del APK</a>, de modo que los usuarios que usan versiones de Android inferiores a Android N
- puedan descargar una versión de la aplicación que incluya las bibliotecas de ICU4J).
-</p>
-
-<p>
-  Al principio de este documento, encontrarás información básica sobre el mínimo de niveles de Android API
- necesarios para soportar estas bibliotecas. Más adelante, encontrarás explicaciones sobre qué
- necesitas saber acerca de la implementación de ICU4J específica para Android. Por último,
- encontrarás explicaciones sobre cómo usar las API de ICU4J en el framework de Android.
-</p>
-
-<h2 id="relation">Relación con ICU4J</h2>
-
-<p>
-  Android N expone un subconjunto de las API de ICU4J mediante el
- paquete <code>android.icu</code>, en lugar de <code>com.ibm.icu</code>. El
-framework de Android puede elegir no
- exponer las API de ICU4J por varias razones; por ejemplo, Android N no expone
- algunas API obsoletas o algunas que el equipo de ICU aún no ha declarado como
- estables. A medida que el equipo de ICU deje de usar API en el futuro, Android también las marcará
- como obsoletas, pero las seguirá incluyendo.
-</p>
-
-<p class="table-caption"><strong>Tabla 1.</strong> Versiones de ICU y CLDR usadas
- en Android N.</p>
-<table>
-<tr>
-<th>Nivel de Android API</th>
-<th>Versión de ICU</th>
-<th>Versión de CLDR</th>
-</tr>
-<tr>
-<td>Android N</td>
-<td>56</td>
-<td>28</td>
-</tr>
-</table>
-
-<p>Debes tener en cuenta lo siguiente:</p>
-
-<ul>
-<li>Las API de ICU4J del framework de Android no incluyen todas las API de ICU4J.</li>
-<li>Los desarrolladores de NDK deben saber que ICU4C de Android no es compatible.</li>
-<li>Las API del framework de Android no reemplazan la compatibilidad de Android para
-<a href="{@docRoot}guide/topics/resources/localization.html">localizar con
-recursos</a>.</li>
-</ul>
-
-<h2 id="migration">Migración hacia el paquete android.icu desde com.ibm.icu</h2>
-
-<p>
-  Si ya estás usando las API de ICU4J en tu aplicación y las
- API de <code>android.icu</code> cumplen con tus requisitos, migrar hacia las
- API del framework implicará que cambies tus importaciones de Java
- de <code>com.ibm.icu</code> a <code>android.icu</code>. Luego, puedes
- quitar tu propia copia de los archivos de ICU4J del APK.
-</p>
-
-<p class="note">
-  <b>Nota</b>: Las API del framework de ICU4J usan el espacio de nombres {@code android.icu}
- en lugar de {@code com.ibm.icu}. El motivo de esto es evitar conflictos de espacio de nombres
- en APK que contienen sus propias bibliotecas de {@code com.ibm.icu}.
-</p>
-
-<h3 id="migrate-from-android">
-  Migración hacia API de android.icu desde otras Android SDK API
-</h3>
-
-<p>
-  Algunas clases de los paquetes de <code>java</code> y de <code>android</code> son
- equivalentes a las clases de ICU4J. Sin embargo, ICU4J a menudo brinda una compatibilidad
- más amplia para estándares e idiomas.
-</p>
-<p>Aquí tienes algunos ejemplos para comenzar:</p>
-<table>
-<tr>
-<th>Clase</th>
-<th>Alternativa</th>
-</tr>
-<tr>
-<td><code>java.lang.Character</code> </td>
-<td><code>android.icu.lang.UCharacter</code> </td>
-</tr>
-<tr>
-<td><code>java.text.BreakIterator</code> </td>
-<td><code>android.icu.text.BreakIterator</code> </td>
-</tr>
-<tr>
-<td><code>java.text.DecimalFormat</code> </td>
-<td><code>android.icu.text.DecimalFormat</code> </td>
-</tr>
-<tr>
-<td><code>java.util.Calendar</code></td>
-<td>
-<code>android.icu.util.Calendar</code></td>
-</tr>
-<tr>
-<td><code>android.text.BidiFormatter</code>
- </td>
-<td><code>android.icu.text.Bidi</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateFormat</code>
- </td>
-<td><code>android.icu.text.DateFormat</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateUtils</code> </td>
-<td><code>android.icu.text.DateFormat</code>
-<code>android.icu.text.RelativeDateTimeFormatter</code>
-</td>
-</tr>
-</table>
-
-<h2 id="licence">Licencias</h2>
-
-<p>
-  ICU4J se presenta bajo la licencia de ICU. Para obtener información más detallada, consulta la <a class="external-link" href="http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-">Guía de usuario
- de ICU.</a>
-</p>
diff --git a/docs/html-intl/intl/es/preview/features/multilingual-support.jd b/docs/html-intl/intl/es/preview/features/multilingual-support.jd
deleted file mode 100644
index b03777c..0000000
--- a/docs/html-intl/intl/es/preview/features/multilingual-support.jd
+++ /dev/null
@@ -1,221 +0,0 @@
-page.title=Idioma y configuración regional
-page.tags=androidn
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>En este documento:</h2>
-<ol>
-	  <li><a href="#preN">Desafíos para la resolución de recursos de idioma</a></li>
-    <li><a href="#postN">Mejoras de la estrategia de resolución de recursos</a></li>
-    <li><a href="#design">Diseño de la aplicación para permitir configuraciones regionales
- adicionales</a></li>
-
-</ol>
-
-</div>
-</div>
-
-<p>Android N brinda un soporte mejorado para los usuarios de diferentes idiomas
-y les permite seleccionar múltiples configuraciones regionales en la configuración. Android N
-brinda esta capacidad expandiendo ampliamente la cantidad de configuraciones regionales compatibles
-y cambiando la forma en que el sistema resuelve los recursos. El nuevo método de resolución
-de recursos es más robusto y está diseñado para ser compatible con APK existentes, pero
-debes tener especial cuidado para detectar cualquier comportamiento inesperado. Por ejemplo, debes
-realizar pruebas para asegurarte de que tu aplicación muestre el idioma esperado de forma predeterminada. Además,
-si tu aplicación permite múltiples idiomas, debes asegurarte de que esta compatibilidad funcione
-como debería. Por último, debes tratar de asegurarte de que tu aplicación administre con facilidad
-los idiomas para los cuales no diseñaste explícitamente la aplicación.</p>
-
-<p>Al inicio de este documento, encontrarás una explicación sobre la estrategia de resolución de recursos anterior a
-Android N. Luego, encontrarás una descripción de la estrategia de resolución de recursos
-mejorada de Android N. Por último, encontrarás una explicación sobre cómo aprovechar
-la cantidad expandida de configuraciones regionales para permitir acceso a más usuarios de diferentes idiomas.</p>
-
-<h2 id="preN">Desafíos para la resolución de recursos de idioma</h2>
-
-<p>Antes de Android N, Android no siempre podía
- hacer coincidir correctamente las configuraciones regionales de la aplicación y del sistema.</p>
-
- <p>Por ejemplo, imagina que tienes la siguiente situación:</p>
- <ul>
- <li>El idioma predeterminado de la aplicación es {@code en_US} (inglés de EE. UU.), y también tiene
- cadenas en español localizadas en archivos de recursos {@code es_ES}
-.</li>
- <li> Se configura un dispositivo en {@code es_MX}. </li>
-
-<p>Cuando el código Java hace referencia a cadenas, el sistema carga
- las cadenas del archivo de recursos ({@code en_US}) predeterminado, incluso si la aplicación tiene
- recursos en español localizados en {@code es_ES}. Esto se debe a que, cuando el sistema
- no puede encontrar una coincidencia exacta, continúa buscando recursos y se quita el
- código del país de la configuración regional. Finalmente, si no se encuentra una coincidencia, el sistema regresa
- a la configuración predeterminada, que es {@code en_US}. </p>
-
-
-<p>El sistema también usaba {@code en_US} de forma predeterminada si el usuario elegía un idioma que
- no era compatible con la aplicación, como el francés. Por ejemplo:</p>
-
-<p class="table-caption" id="t-resource-res">
-<strong>Tabla 1.</strong> Resolución de recursos sin una coincidencia de configuración regional exacta.
-</p>
-<table>
-<tbody>
-<tr>
-<th>Configuración del usuario</th>
-<th>Recursos de la aplicación</th>
-<th>Resolución de recursos</th>
-</tr>
-<tr>
-<td>fr_CH</td>
-<td>
-Predeterminado (en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
- <td>
-Intentar fr_CH =&gt; Error<br>
-Intentar fr =&gt; Error<br>
-Usar predeterminado (en)
-</td>
- </tr>
- </tbody>
-</table>
-
-
-<p>En este ejemplo, el sistema muestra las cadenas en inglés sin
-saber si el usuario comprende este idioma. Este comportamiento es muy común
-hoy en día. Android N debería reducir sustancialmente la frecuencia
-de resultados como este.</p>
-
-<h2 id="postN">Mejoras de la estrategia de resolución de recursos</h2>
-<p>Android N brinda una resolución de recursos más robusta y
-encuentra mejores recursos de forma automática. Sin embargo, para acelerar la resolución y mejorar la
-facilidad de mantenimiento, debes almacenar los recursos en el dialecto primario.
- Por ejemplo, si antes almacenabas los recursos en español en el directorio {@code es-US}
-, pásalos al directorio {@code es-419}, que contiene la variante de Latinoamérica.
- De forma similar, si tienes cadenas de recursos en una carpeta llamada {@code en-GB}, cámbiale
- el nombre a {@code en-001} (inglés internacional), ya que el dialecto primario más común
- para las cadenas en <code>en-GB</code> es {@code en-001}.
- Los siguientes ejemplos explican por qué estas prácticas mejoran el desempeño
- y la confiabilidad de la resolución de recursos.</p>
-
-<h3>Ejemplos de resolución de recursos</h3>
-
-<p>Con Android N, el caso descrito en la <strong>Tabla 1</strong> se resuelve
-de otra forma:</p>
-
-<p class="table-caption" id="t-improved-res">
-<strong>Tabla 2.</strong> Una estrategia de resolución mejorada para los casos en que no
-hay una coincidencia de configuración regional exacta.</p>
-<table>
-<tr>
-<th>Configuración del usuario</th>
-<th>Recursos de la aplicación</th>
-<th>Resolución de recursos</th>
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-</ol>
-</td>
-<td>
-Predeterminado (en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
-<td>
-Intentar fr_CH =&gt; Error<br>
-Intentar fr =&gt; Error<br>
-Intentar secundario de fr =&gt; fr_FR<br>
-Usar fr_FR
-</td>
-</tr>
-
-</table>
-
-
-<p>Así, los recursos se muestran en francés en lugar de en inglés. Este ejemplo también muestra
- por qué deberías almacenar las cadenas en francés en {@code fr} en lugar de en {@code fr_FR}
- para Android N. Aquí, el procedimiento se basa en hacer coincidir el dialecto primario más cercano,
- lo cual hace que la resolución sea más rápida y más predecible.</p>
-
-<p>Además de esta lógica de resolución mejorada, Android ofrece ahora más
- idiomas de usuario de entre los cuales elegir. Volvamos a ver el ejemplo anterior con el idioma italiano
- especificado como un idioma de usuario adicional, pero sin compatibilidad de la aplicación con el idioma francés.  </p>
-
-<p class="table-caption" id="t-2d-choice">
-<strong>Tabla 3.</strong> Resolución de recursos cuando la aplicación solo hace coincidir la
-configuración regional de segunda preferencia del usuario.</p>
-<table>
-<tr>
-<th>Configuración del usuario</th>
-<th>Recursos de la aplicación</th>
-<th>Resolución de recursos</th>
-
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-<li> it_CH</li>
-</ol>
-</td>
-<td>
-Predeterminado (en)<br>
-de_DE<br>
-es_ES<br>
-it_IT<br>
-</td>
-<td>
-Intentar fr_CH =&gt; Error<br>
-Intentar fr =&gt; Error<br>
-Intentar secundario de fr =&gt; Error<br>
-Intentar it_CH =&gt; Error<br>
-Intentar it =&gt; Error<br>
-Intentar secundario de it =&gt; it_IT<br>
-Usar it_IT
-</td>
-
-</tr>
-
-</table>
-<p>El usuario recibe la información en un idioma que comprende, si bien la aplicación no
-es compatible con el idioma francés.</p>
-
-
-<h2 id="design">Diseño de la aplicación para permitir configuraciones regionales adicionales</h2>
-<h3>API LocaleList</h3>
-
-<p>Android N incorpora una nueva API, {@code LocaleList.getDefault()},
-que les permite a las aplicaciones consultar directamente la lista de idiomas que ha especificado el usuario. Esta API
- te permite crear un comportamiento de la aplicación
- más sofisticado y una presentación de contenido más optimizada. Por ejemplo, las búsquedas
- pueden mostrar resultados en múltiples idiomas según la configuración del usuario.  Las aplicaciones de navegadores
- pueden evitar ofrecer la traducción de páginas que están en un idioma que el usuario comprende,
- y las aplicaciones de teclado pueden habilitar automáticamente todos los diseños correctos. </p>
-
-<h3>Formateadores</h3>
-
-<p>Hasta Android 6.0 (API nivel 23), Android solo permitía una o dos
- configuraciones regionales para muchos idiomas comunes
- (en, es, ar, fr, ru). Debido a que había solo unas pocas variantes para cada idioma,
-las aplicaciones podían almacenar algunos números y fechas como cadenas preprogramadas
-en los archivos de recursos.  Sin embargo, con el conjunto ampliado de configuraciones regionales
-compatibles de Android, puede haber diferencias importantes
-en los formatos de fecha, hora, moneda e
-información similar, incluso dentro de una sola configuración regional. Preprogramar los formatos puede generar
-una experiencia confusa para los usuarios.  Por lo tanto, cuando desarrolles aplicaciones para Android,
-asegúrate de usar formateadores en lugar de preprogramar las cadenas de números y fechas.</p>
-
-<p>Un muy buen ejemplo es el árabe. Android N expandió su compatibilidad de
-una configuración regional, {@code ar_EG}, a 27 configuraciones regionales. Estas configuraciones regionales pueden compartir la mayoría de los recursos,
-pero algunas prefieren dígitos ASCII, mientras que otras prefieren dígitos nativos. Por ejemplo,
-cuando desees crear una oración con una variable de dígito, como
-"Elige un PIN de 4 dígitos", usa formateadores como se muestra a continuación:</p>
-
-<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>
diff --git a/docs/html-intl/intl/es/preview/features/notification-updates.jd b/docs/html-intl/intl/es/preview/features/notification-updates.jd
deleted file mode 100644
index ff0635e..0000000
--- a/docs/html-intl/intl/es/preview/features/notification-updates.jd
+++ /dev/null
@@ -1,393 +0,0 @@
-page.title=Notificaciones
-page.tags=notifications
-helpoutsWidget=true
-page.image=/preview/images/notifications-card.png
-
-trainingnavtop=true
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-
-<!-- table of contents -->
-<h2>Este documento incluye lo siguiente:</h2>
-<ol>
-  <li><a href="#direct">Respuesta directa</a></li>
-  <li><a href="#bundle">Notificaciones integradas</a></li>
-  <li><a href="#custom">Vistas personalizadas</a></li>
-  <li><a href="#style">Estilo de mensajería</a></li>
-</ol>
-
-</div>
-</div>
-
-<p>Android N presenta varias API nuevas que permiten a las aplicaciones publicar
-notificaciones altamente visibles e interactivas.</p>
-
-<p>Android N amplía la API de notificación existente {@link android.support.v4.app.RemoteInput}
-para admitir respuestas en línea en teléfonos celulares. Esta función permite a los usuarios
- responder rápidamente desde el panel de notificaciones sin tener que visitar tu aplicación.</p>
-
-<p>
-  Android N también te permite agrupar notificaciones similares para que
-  aparezcan como una sola notificación. Para que esto sea posible, Android N usa el método existente {@link
-  android.support.v4.app.NotificationCompat.Builder#setGroup
-  NotificationCompat.Builder.setGroup()}. Los usuarios pueden expandir cada una de las
-  notificaciones y realizar acciones como responder e ignorar en cada una
-  de ellas, de forma individual desde el panel de notificaciones.
-</p>
-
-<p>Por último, Android N también suma nuevas API que te permiten aprovechar las decoraciones
-del sistema en las vistas de notificación personalizadas de tu aplicación. Estas API ayudan a
-garantizar que las vistas de notificaciones compartan una presentación acorde a las
-plantillas estándar.</p>
-
-<p>En este documento se destacan algunos de los cambios clave que puedes tener en cuenta
- al usar las nuevas funciones de notificación en tus aplicaciones.</p>
-
-<h2 id="direct">Respuesta directa</h2>
-
-<p>Con la función de respuesta directa en Android N, los usuarios pueden responder
-rápidamente mensajes de texto o actualizar listas de tareas directamente dentro de la interfaz de
-notificación. En un dispositivo portátil, la acción de respuesta en línea aparece como un botón adicional
- anexado a la notificación. Cuando un usuario responde mediante el teclado, el sistema adjunta
- la respuesta de texto a la intent
- que especificaste para la acción de notificación y envía la intención a tu
- aplicación para dispositivos portátiles.
-
-
-<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
-  {@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
-<p class="img-caption">
-  <strong>Figura 1.</strong> Android N agrega el botón de acción <strong>Reply</strong>
-.
-</p>
-
-<h3>Adición de acciones de respuesta en línea</h3>
-
-<p>Para crear una acción de notificación que admita respuesta directa:
-</p>
-
-<ol>
-<li>Crea una instancia de {@link android.support.v4.app.RemoteInput.Builder}
-  que puedas agregar a tu acción de
-notificación. El constructor de esta clase acepta una cadena que el sistema usa como clave
- para la inserción de texto. Luego, tu aplicación para dispositivos portátiles usará esa clave para recuperar el texto
-  de la entrada.
-
-<pre>
-// Key for the string that's delivered in the action's intent.
-private static final String KEY_TEXT_REPLY = "key_text_reply";
-String replyLabel = getResources().getString(R.string.reply_label);
-RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
-        .setLabel(replyLabel)
-        .build();
-</pre>
-</li>
-<li>Adjunta el objeto {@link android.support.v4.app.RemoteInput}
- a una acción usando <code>addRemoteInput()</code>.
-
-<pre>
-// Create the reply action and add the remote input.
-Notification.Action action =
-        new Notification.Action.Builder(R.drawable.ic_reply_icon,
-                getString(R.string.label), replyPendingIntent)
-                .addRemoteInput(remoteInput)
-                .build();
-</pre>
-</li>
-
-<li>Aplica la acción a una notificación y emite la notificación.
-
-<pre>
-// Build the notification and add the action.
-Notification newMessageNotification =
-        new Notification.Builder(mContext)
-                .setSmallIcon(R.drawable.ic_message)
-                .setContentTitle(getString(R.string.title))
-                .setContentText(getString(R.string.content))
-                .addAction(action))
-                .build();
-
-// Issue the notification.
-NotificationManager notificationManager =
-        NotificationManager.from(mContext);
-notificationManager.notify(notificationId, newMessageNotification);
-
-</pre>
-</li>
-
-</ol>
-
-
-<p> Cuando se active la acción de notificación,
-el sistema le solicitará al usuario que ingrese una respuesta. </p>
-
-<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
-    {@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>Figura 2.</strong> El usuario ingresa texto desde el panel de notificaciones.
-</p>
-
-<h3>
-  Recuperación de entradas del usuario a partir de la respuesta en línea
-</h3>
-
-<p>
-  Para recibir entradas del usuario de la interfaz de notificación a la actividad que
- declaraste en la intent de la acción de respuesta:
-</p>
-
-<ol>
-  <li>Llama a {@link android.support.v4.app.RemoteInput#getResultsFromIntent
-  getResultsFromIntent()} pasando la intent de la acción de notificación como
- el parámetro de entrada. Este método devuelve un {@link android.os.Bundle} que
- contiene la respuesta de texto.
-
-    <pre>
-Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-</pre>
-  </li>
-
-  <li>Consulta el paquete con la clave de resultado (proporcionada al constructor {@link
-  android.support.v4.app.RemoteInput.Builder}). Puedes completar
- este proceso y recuperar el texto de entrada mediante la creación de un método, como en el
- siguiente fragmento de código:
-
-    <pre>
-// Obtain the intent that started this activity by calling
-// Activity.getIntent() and pass it into this method to
-// get the associated string.
-
-private CharSequence getMessageText(Intent intent) {
-    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-    if (remoteInput != null) {
-        return remoteInput.getCharSequence(KEY_TEXT_REPLY);
-    }
-    return null;
- }
-</pre>
-  </li>
-
-  <li>Crea y emite otra notificación, utilizando la misma ID de notificación que
- proporcionaste para la notificación anterior. El indicador de progreso
- desaparece de la interfaz de notificación para informarles a los usuarios que la respuesta
- fue exitosa. Al trabajar con esta nueva notificación, usa el contexto que se
- pasa al método {@code onReceive()} del receptor.
-
-    <pre>
-// Build a new notification, which informs the user that the system
-// handled their interaction with the previous notification.
-Notification repliedNotification =
-        new Notification.Builder(context)
-                .setSmallIcon(R.drawable.ic_message)
-                .setContentText(getString(R.string.replied))
-                .build();
-
-// Issue the new notification.
-NotificationManager notificationManager =
-        NotificationManager.from(context);
-notificationManager.notify(notificationId, repliedNotification);
-</pre>
-  </li>
-</ol>
-
-<p>
-  En el caso de las aplicaciones interactivas, como los chats, podría ser útil incluir
- contexto adicional cuando se administra texto recuperado. Por ejemplo, en estas aplicaciones, se podrían mostrar
- múltiples líneas de historial de chat. Cuando el usuario responde a través de {@link
-  android.support.v4.app.RemoteInput}, puedes actualizar el historial de respuestas
- por medio del método {@code setRemoteInputHistory()}.
-</p>
-
-<p>
-  La notificación se debe actualizar o cancelar luego de que la aplicación haya
- recibido entradas remotas. Cuando el usuario responde a una actualización remota
- por medio de la respuesta directa,
- no canceles la notificación. En cambio, actualiza la notificación para mostrar la respuesta del usuario.
-En el caso de las notificaciones que utilizan {@code MessagingStyle}, debes agregar
-la respuesta como el mensaje más reciente. Cuando se utilizan otras plantillas, puedes
-agregar la respuesta del usuario al historial de entradas remotas.
-</p>
-
-<h2 id="bundle">Notificaciones integradas</h2>
-
-<p>Android N ofrece a los desarrolladores una nueva manera de representar
- una cola de notificaciones: <i>notificaciones integradas</i>. Esto es similar a la función
-  <a href="{@docRoot}training/wearables/notifications/stacks.html">Pilas de
-  notificaciones</a> en Android Wear. Por ejemplo, si tu aplicación crea notificaciones
-  para los mensajes recibidos, cuando se recibe más de un mensaje, agrupa las
- notificaciones en un solo paquete. Puedes
- usar el método existente {@link android.support.v4.app.NotificationCompat.Builder#setGroup
-Builder.setGroup()} para agrupar notificaciones similares.</p>
-
-<p>
-  El grupo de notificaciones impone una jerarquía en las notificaciones que lo integran.
-  En la parte superior de esa jerarquía se encuentra una notificación principal que muestra información
-  resumida para el grupo. El usuario puede expandir
-  progresivamente el grupo de notificaciones, y el sistema muestra más información a medida que el
-  usuario continúa indagando. Cuando el usuario expande el paquete, el sistema revela más
-  información para todas sus notificaciones secundarias; cuando el usuario
-  expande una de esas notificaciones, el sistema revela todo su contenido.
-</p>
-
-<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
-          {@docRoot}preview/images/bundles_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>Figura 3.</strong> El usuario puede expandir progresivamente el grupo de
- notificaciones.
-</p>
-
-<p class="note">
-  <strong>Nota:</strong> Si la misma aplicación envía cuatro o más notificaciones
- y no se especifica un grupo, el
- sistema las agrupa automáticamente.
-</p>
-
-<p>Para obtener información acerca de cómo agregar notificaciones a un grupo, consulta
-<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">Agregar
-cada notificación a un grupo</a>.</p>
-
-
-<h3 id="best-practices">Prácticas recomendadas para las notificaciones integradas</h3>
-<p>Esta sección proporciona pautas acerca de cuándo usar grupos de notificaciones en lugar
-de las notificaciones {@link android.app.Notification.InboxStyle InboxStyle}
-que estaban disponibles en versiones anteriores de la
-plataforma Android.</p>
-
-<h3>Cuándo usar notificaciones integradas</h3>
-
-<p>Solo debes usar grupos de notificaciones si se cumplen todas las siguientes condiciones
-para tu caso de uso:</p>
-
-<ul>
-  <li>Las notificaciones secundarias son notificaciones completas y se pueden mostrar
-   individualmente sin la necesidad de un resumen del grupo.</li>
-  <li>El aislamiento de notificaciones secundarias de forma individual tiene un beneficio. Por
-  ejemplo:
-  </li>
-  <ul>
-    <li>Son interactivas, con acciones específicas para cada notificación secundaria.</li>
-    <li>Hay más información sobre la notificación secundaria que el usuario quiere leer.</li>
-  </ul>
-</ul>
-
-<p>Algunos ejemplos de buenos casos de uso para grupos de notificaciones incluyen: una aplicación de mensajería
-que exhiba una lista de mensajes entrantes, o una aplicación de correo electrónico que exhiba una lista de
-correos electrónicos recibidos.</p>
-
-<p>
-Algunos ejemplos de casos en los que se prefiere una sola notificación
- incluyen mensajes individuales de una sola persona, o una lista de
- elementos de texto de una sola línea. Para lograr esto, puedes usar
-({@link android.app.Notification.InboxStyle InboxStyle} o
-{@link android.app.Notification.BigTextStyle BigTextStyle})
-.
-</p>
-
-<h3 id ="post">Visualización de notificaciones integradas</h3>
-
-<p>
-  La aplicación siempre debe publicar un resumen del grupo, aún si el grupo contiene una sola
- notificación secundaria. Si contiene una sola notificación, el sistema suprimirá el resumen y mostrará directamente la
-  notificación secundaria. Esto garantiza
-  que el sistema pueda proporcionar una experiencia uniforme cuando el usuario quita con un gesto de "deslizar" notificaciones
-  secundarias de un grupo.
-</p>
-
-<p class="note">
-  <strong>Nota:</strong> Esta versión de Android N aún no
-  suprime el resumen para los grupos de notificaciones que contienen una sola notificación secundaria. Esta
-  funcionalidad se agregará en una versión posterior de Android N.
-</p>
-
-<h3>Inspección de notificaciones</h3>
-
-<p>Si bien el sistema generalmente muestra las notificaciones secundarias como un grupo, puedes configurarlas
- para que aparezcan temporalmente como
- <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">
- notificaciones emergentes</a>. Esta función es especialmente útil porque permite
-  el acceso inmediato a la notificación secundaria más reciente y a las acciones asociadas a ella.
-</p>
-
-
-<h3>Compatibilidad con versiones anteriores</h3>
-
-<p>
-  Tanto los grupos de notificaciones como las entradas remotas han formado parte de la API {@link
-  android.app.Notification} desde Android 5.0 (API nivel 21) para soportar dispositivos
-  con Android Wear. Si ya compilaste notificaciones con esas API,
-  lo único que debes hacer es verificar que el comportamiento de la aplicación concuerde
-  las pautas antes descritas y considerar la implementación de {@code
-  setRemoteInputHistory()}.
-</p>
-
-<p>
-  Para poder ser compatible con versiones anteriores, están disponibles las mismas API con
-  la clase {@link android.support.v4.app.NotificationCompat}
-  de la biblioteca de soporte, que te permite crear notificaciones que funcionan en versiones de Android
-  anteriores. En dispositivos portátiles y tablets, los usuarios solo ven la notificación de resumen
-  de modo que una aplicación aún debe tener un estilo de bandeja de entrada o una notificación equivalente
-  que represente todo el contenido del grupo. Dado que los dispositivos con Android
-  Wear permiten a los usuarios ver todas las notificaciones secundarias incluso en
-  niveles anteriores de la plataforma, debes crear notificaciones secundarias independientemente del nivel de
-  API.
-</p>
-
-<h2 id="custom"> Vistas personalizadas</h2>
-<p>A partir de la versión Android N, puedes personalizar vistas de notificaciones y
-aún obtener decoraciones del sistema, como encabezados de notificaciones, acciones y diseños
-expandibles.</p>
-
-<p>Para habilitar esta característica, Android N suma las siguientes API para que puedas diseñar tu
-  vista personalizada:</p>
-
-<dl>
-<dt>
-{@code DecoratedCustomViewStyle()}</dt>
-<dd> Permite diseñar notificaciones que no sean notificaciones
-de medios.</dd>
-<dt>
-{@code DecoratedMediaCustomViewStyle()}</dt>
-<dd> Permite diseñar notificaciones de medios.</dd>
-</dl>
-
-<p>Para usar esta nueva API, llama al método {@code setStyle()} y pásale
-el estilo de la vista personalizada que hayas elegido.</p>
-
-<p>Este fragmento muestra cómo crear un objeto de notificación personalizada con el método
-{@code DecoratedCustomViewStyle()}.</p>
-
-<pre>
-Notification notification = new Notification.Builder()
-           .setSmallIcon(R.drawable.ic_stat_player)
-           .setLargeIcon(albumArtBitmap))
-           .setCustomContentView(contentView);
-           .setStyle(new Notification.DecoratedCustomViewStyle())
-           .build();
-
-</pre>
-
-<h2 id="style">Estilo de mensajería</h2>
-<p>
-  Android N presenta una nueva API para personalizar el estilo de una notificación.
-  Por medio de la clase <code>MessageStyle</code>, puedes modificar varias de las
- etiquetas que aparecen en la notificación, incluidos el título de la conversación,
- mensajes adicionales y la vista de contenido para la notificación.
-</p>
-
-<p>
-  El siguiente fragmento de código demuestra cómo personalizar el estilo
- de una notificación mediante la clase <code>MessageStyle</code>.
-</p>
-
-<pre>
-  Notification notification = new Notification.Builder()
-             .setStyle(new Notification.MessagingStyle("Me")
-                 .setConversationTitle("Team lunch")
-                 .addMessage("Hi", timestamp1, null) // Pass in null for user.
-                 .addMessage("What's up?", timestamp2, "Coworker")
-                 .addMessage("Not much", timestamp3, null)
-                 .addMessage("How about lunch?", timestamp4, "Coworker"));
-</pre>
diff --git a/docs/html-intl/intl/in/about/versions/nougat/android-7.0-testing.jd b/docs/html-intl/intl/in/about/versions/nougat/android-7.0-testing.jd
deleted file mode 100644
index 94bc74c..0000000
--- a/docs/html-intl/intl/in/about/versions/nougat/android-7.0-testing.jd
+++ /dev/null
@@ -1,190 +0,0 @@
-page.title=Panduan Pengujian
-page.image=images/cards/card-n-guide_2x.png
-meta.tags="preview", "testing"
-page.tags="preview", "developer preview"
-
-@jd:body
-
-<div id="tb-wrapper">
-  <div id="tb">
-    <h2>Dalam dokumen ini</h2>
-      <ol>
-        <li><a href="#runtime-permissions">Izin Pengujian</a></li>
-        <li><a href="#doze-standby">Menguji Istirahatkan dan Aplikasi Siaga</a></li>
-        <li><a href="#ids">Pencadangan Otomatis dan Identifier Perangkat</a></li>
-      </ol>
-  </div>
-</div>
-
-<p>
-  Android N memberi Anda kesempatan untuk memastikan aplikasi bekerja pada
-  platform versi berikutnya. Pratinjau ini berisi beberapa API dan perubahan perilaku yang bisa
-  memengaruhi aplikasi Anda, sebagaimana dijelaskan dalam <a href="{@docRoot}preview/api-overview.html">Ringkasan
-  API</a> dan <a href="{@docRoot}preview/behavior-changes.html">Perubahan Perilaku</a>. Dalam menguji
-  aplikasi dengan pratinjau, ada beberapa perubahan sistem spesifik yang harus Anda fokuskan untuk
-  memastikan pengguna mendapatkan pengalaman yang bagus.
-</p>
-
-<p>
-  Panduan ini menjelaskan apa dan bagaimana menguji fitur pratinjau dengan aplikasi Anda. Anda harus
-  mengutamakan pengujian fitur pratinjau spesifik ini, dikarenakan pengaruhnya yang besar pada
-  perilaku aplikasi Anda:
-</p>
-
-<ul>
-  <li><a href="#runtime-permissions">Izin</a>
-  </li>
-  <li><a href="#doze-standby">Istirahatkan dan Aplikasi Siaga</a>
-  </li>
-  <li><a href="#ids">Pencadangan Otomatis dan Identifier Perangkat</a></li>
-</ul>
-
-<p>
-  Untuk informasi selengkapnya tentang cara menyiapkan perangkat atau perangkat maya dengan citra sistem pratinjau
-  untuk pengujian, lihat <a href="{@docRoot}preview/setup-sdk.html">Menyiapkan
-Android N SDK</a>.
-</p>
-
-
-<h2 id="runtime-permissions">Izin Pengujian</h2>
-
-<p>
-  Model <a href="{@docRoot}preview/features/runtime-permissions.html">Izin</a> yang baru
-  mengubah cara alokasi izin untuk aplikasi Anda oleh pengguna. Sebagai ganti memberi semua
-  izin selama prosedur pemasangan, aplikasi Anda harus meminta izin kepada pengguna secara individual
- pada waktu proses. Bagi pengguna, perilaku ini memberi kontrol yang lebih detail atas setiap aktivitas aplikasi, dan
-  juga konteks yang lebih untuk memahami sebab aplikasi meminta izin tertentu. Pengguna
-  bisa memberi atau mencabut izin yang diberikan pada suatu aplikasi secara individual kapan saja. Fitur
-  pratinjau ini kemungkinan besar memengaruhi perilaku aplikasi Anda dan mungkin menghambat fungsi beberapa
-  fitur aplikasi Anda, atau mengurangi kualitas kerjanya.
-</p>
-
-<p class="caution">
-  Perubahan ini memengaruhi semua aplikasi yang berjalan di platform baru, bahkan aplikasi yang tidak menargetkan versi
-  platform baru. Platform ini memberikan perilaku kompatibilitas terbatas untuk aplikasi lawas, namun Anda
-  harus mulai merencanakan migrasi aplikasi ke model izin baru sekarang juga, dengan tujuan
-  mempublikasikan versi terbaru aplikasi Anda saat peluncuran platform secara resmi.
-</p>
-
-
-<h3 id="permission-test-tips">Tip pengujian</h3>
-
-<p>
-  Gunakan tip berikut untuk membantu Anda merencanakan dan menjalankan pengujian aplikasi dengan
-  perilaku izin yang baru.
-</p>
-
-<ul>
-  <li>Identifikasi izin aplikasi Anda saat ini dan jalur kode terkait.</li>
-  <li>Uji alur pengguna pada semua layanan dan data yang dilindungi izin.</li>
-  <li>Uji dengan berbagai kombinasi izin yang diberikan/dicabut.</li>
-  <li>Gunakan alat bantu {@code adb} untuk mengelola izin dari baris perintah:
-    <ul>
-      <li>Cantumkan daftar izin dan status berdasarkan kelompok:
-        <pre>adb shell pm list permissions -d -g</pre>
-      </li>
-      <li>Beri atau cabut satu atau beberapa izin menggunakan sintaks berikut:<br>
-        <pre>adb shell pm [grant|revoke] &lt;permission.name&gt; ...</pre>
-      </li>
-    </ul>
-  </li>
-  <li>Analisis aplikasi Anda untuk layanan yang menggunakan izin.</li>
-</ul>
-
-<h3 id="permission-test-strategy">Strategi pengujian</h3>
-
-<p>
-  Perubahan izin memengaruhi struktur dan desain aplikasi Anda, begitu juga
-  pengalaman pengguna dan alur yang Anda sediakan untuk pengguna. Anda harus menilai penggunaan izin
-  aplikasi saat ini dan mulai merencanakan alur baru yang ingin ditawarkan. Rilis platform
-  resmi menyediakan perilaku kompatibilitas, namun Anda harus merencanakan pembaruan aplikasi dan tidak
-  bergantung pada perilaku ini.
-</p>
-
-<p>
-  Identifikasi izin yang sebenarnya diperlukan dan digunakan aplikasi Anda, kemudian temukan berbagai
-  jalur kode yang menggunakan layanan yang dilindungi izin. Anda bisa melakukan ini melalui kombinasi
-  pengujian pada platform baru dan analisis kode. Dalam pengujian, Anda harus fokus pada pemilihan
- izin waktu proses dengan mengubah {@code targetSdkVersion} aplikasi ke versi pratinjau. Untuk
-  informasi selengkapnya, lihat <a href="{@docRoot}preview/setup-sdk.html#">Menyiapkan
-Android N SDK</a>.
-</p>
-
-<p>
-  Uji dengan berbagai kombinasi izin yang dicabut dan ditambahkan, untuk menyoroti alur pengguna yang
-  bergantung pada izin. Jika dependensi tidak jelas atau logis, Anda harus mempertimbangkan
-optimalisasi atau kompartementalisasi alur tersebut untuk mengeliminasi dependensi atau menjelaskan alasan
-  diperlukannya izin.
-</p>
-
-<p>
-  Untuk informasi selengkapnya tentang perilaku izin waktu proses, pengujian, dan praktik terbaik, lihat
-  halaman pratinjau <a href="{@docRoot}preview/features/runtime-permissions.html">Izin</a>
-  pengembang.
-</p>
-
-
-<h2 id="doze-standby">Menguji Istirahatkan dan Aplikasi Siaga</h2>
-
-<p>
-  Fitur penghematan daya Istirahatkan dan Aplikasi Siaga membatasi jumlah pemrosesan latar belakang yang
-  bisa dikerjakan aplikasi Anda saat perangkat dalam keadaan diam atau saat aplikasi Anda sedang tidak fokus. Pembatasan
-  yang dapat diberlakukan oleh sistem pada aplikasi termasuk akses jaringan terbatas atau tidak ada,
-  tugas latar belakang yang ditangguhkan, Pemberitahuan yang ditangguhkan, permintaan membangunkan yang diabaikan, serta alarm. Untuk memastikan
-  aplikasi Anda berperilaku dengan benar pada optimalisasi penghematan daya ini, Anda harus menguji aplikasi dengan
- menyimulasikan keadaan baterai yang sedang tinggal sedikit ini.
-</p>
-
-<h4 id="doze">Menguji aplikasi Anda dengan Istirahatkan</h4>
-
-<p>Untuk menguji Istirahatkan dengan aplikasi Anda:</p>
-
-<ol>
-<li>Konfigurasikan perangkat keras atau perangkat maya dengan citra sistem Android N.</li>
-<li>Hubungkan perangkat dengan mesin pengembangan dan pasang aplikasi Anda.</li>
-<li>Jalankan aplikasi Anda dan biarkan aktif.</li>
-<li>Simulasikan perangkat yang sedang masuk ke dalam mode Istirahatkan dengan menjalankan perintah berikut:
-
-<pre>
-$ adb shell dumpsys battery unplug
-$ adb shell dumpsys deviceidle step
-$ adb shell dumpsys deviceidle -h
-</pre>
-
-  </li>
-  <li>Amati perilaku aplikasi Anda saat perangkat diaktifkan kembali. Pastikan aplikasi
-    pulih dengan baik saat perangkat keluar dari Istirahatkan.</li>
-</ol>
-
-
-<h4 id="standby">Menguji aplikasi dengan Aplikasi Siaga</h4>
-
-<p>Untuk menguji mode Aplikasi Siaga dengan aplikasi Anda:</p>
-
-<ol>
-  <li>Konfigurasikan perangkat keras atau perangkat maya dengan citra sistem Android N.</li>
-  <li>Hubungkan perangkat dengan mesin pengembangan dan pasang aplikasi Anda.</li>
-  <li>Jalankan aplikasi Anda dan biarkan aktif.</li>
-  <li>Simulasikan aplikasi yang sedang masuk ke dalam mode siaga dengan menjalankan perintah berikut:
-
-<pre>
-$ adb shell am broadcast -a android.os.action.DISCHARGING
-$ adb shell am set-idle &lt;packageName&gt; true
-</pre>
-
-  </li>
-  <li>Simulasikan membangunkan aplikasi Anda menggunakan perintah berikut:
-    <pre>$ adb shell am set-idle &lt;packageName&gt; false</pre>
-  </li>
-  <li>Amati perilaku aplikasi Anda saat dibangunkan. Pastikan aplikasi pulih dengan baik
-   dari mode siaga. Secara khusus, Anda harus memeriksa apakah Pemberitahuan aplikasi dan pekerjaan latar belakang
-   tetap berjalan sebagaimana yang diharapkan.</li>
-</ol>
-
-<h2 id="ids">Auto Backup for Apps dan Identifier Perangkat Spesifik</h2>
-
-<p>Jika aplikasi Anda mempertahankan identifier perangkat spesifik, seperti ID pendaftaran Google
-Cloud Messaging, dalam penyimpanan internal,
-pastikan Anda mengikuti praktik terbaik untuk mengecualikan lokasi
-penyimpanan dari pencadangan otomatis, seperti dijelaskan dalam <a href="{@docRoot}preview/backup/index.html">Auto
-Backup for Apps</a>. </p>
diff --git a/docs/html-intl/intl/in/about/versions/nougat/index.jd b/docs/html-intl/intl/in/about/versions/nougat/index.jd
index a8f61eb..5234f91 100644
--- a/docs/html-intl/intl/in/about/versions/nougat/index.jd
+++ b/docs/html-intl/intl/in/about/versions/nougat/index.jd
@@ -1,6 +1,6 @@
-page.title=Android N Developer Preview
-page.tags="preview","developer"
-meta.tags="preview", "android"
+page.title=Android 7.0 Nougat
+page.tags="androidn","versions"
+meta.tags="android n", "nougat", "android 7.0"
 fullpage=true
 forcelocalnav=true
 header.hide=1
@@ -17,66 +17,61 @@
   })
 </script>
 
-<section class="dac-expand dac-hero dac-light" style="background-color:#B2DFDB">
+<section class="dac-expand dac-hero dac-light">
   <div class="wrap" style="max-width:1100px;margin-top:0">
+  <a href="{@docRoot}about/versions/nougat/android-7.0.html">
     <div class="cols dac-hero-content" style="padding-bottom:1em;">
 
-      <div class="col-7of16 col-push-9of16" style="padding-left:2em">
-        <h1 class="dac-hero-title">Android N Developer Preview</h1>
+      <div class="col-7of16 col-push-8of16" style="padding-left:2em">
+        <h1 class="dac-hero-title">Android 7.0 Nougat</h1>
         <p class="dac-hero-description">
-          Bersiaplah menyambut Android N!
+          Bersiaplah menyambut Android Nougat!
           <strong>Uji aplikasi Anda</strong> pada perangkat Nexus dan perangkat lainnya. Dukung perilaku sistem
           baru untuk <strong>menghemat daya dan memori</strong>.
           Tambah aplikasi Anda dengan <strong>UI multi-jendela</strong>,
           <strong>pemberitahuan balasan langsung</strong> dan lainnya.
         </p>
 
-        <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+        <a class="dac-hero-cta" href="{@docRoot}about/versions/nougat/android-7.0.html">
           <span class="dac-sprite dac-auto-chevron"></span>
           Mulai
-        </a><!--<br>
-        <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
-          Update to Android N (final SDK)
-        </a><br>-->
+        </a>
       </div>
-      <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
-        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png" srcset="{@docRoot}images/home/n-preview-hero.png 1x,
-             {@docRoot}images/home/n-preview-hero_2x.png 2x">
+      <div class="col-7of16 col-pull-6of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
+        <a  href="{@docRoot}about/versions/nougat/android-7.0.html">
+        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png"
+             srcset="{@docRoot}images/home/n-preview-hero.png 1x,
+             {@docRoot}images/home/n-preview-hero_2x.png 2x" />
+           </a>
       </div>
-    </div>
+    </div></a>
     <div class="dac-section dac-small">
       <div class="resource-widget resource-flow-layout col-16"
-           data-query="collection:preview/landing/resources"
+           data-query="collection:nougat/landing/resources"
            data-cardSizes="6x2"
-           data-maxResults="6"></div>
-    </div>
+           data-maxResults="3"></div>
+         </div>
   </div>
 </section>
 
+
 <div id="useUpdatedTemplates" style="display:none" class="dac-section dac-slim dac-gray dac-expand">
   <div class="wrap dac-offset-parent">
-    <a class="dac-fab dac-scroll-button" data-scroll-button="" href="#build-apps">
+    <a class="dac-fab dac-scroll-button" data-scroll-button href="#latest">
       <i class="dac-sprite dac-arrow-down-gray"></i>
     </a>
     <ul class="dac-actions">
       <li class="dac-action">
-        <a class="dac-action-link" href="https://developer.android.com/preview/bug">
+        <a class="dac-action-link" href="https://source.android.com/source/report-bugs.html">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
           Laporkan masalah
-          </a>
-      </li>
-      <li class="dac-action">
-        <a class="dac-action-link" href="{@docRoot}preview/support.html">
-          <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
-          Lihat catatan rilis
-          </a>
+        </a>
       </li>
       <li class="dac-action">
         <a class="dac-action-link" href="{@docRoot}preview/dev-community">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
           Bergabunglah dengan komunitas pengembang
-          </a>
+        </a>
       </li>
     </ul>
   </div><!-- end .wrap -->
@@ -113,19 +108,33 @@
     data-initial-results="3"></div>
 </div></section>
 
-<section class="dac-section dac-gray"><div class="wrap">
-  <h1 class="dac-section-title">Sumber Daya</h1>
+<section class="dac-section dac-gray" id="videos"><div class="wrap">
+  <h1 class="dac-section-title">Videos</h1>
   <div class="dac-section-subtitle">
-    Informasi penting guna membantu mempersiapkan aplikasi untuk Android N.
+    New Android capabilities and the right way to use them in your apps.
   </div>
 
   <div class="resource-widget resource-flow-layout col-16"
-       data-query="collection:preview/landing/more"
+    data-query="collection:nougat/landing/videos/first,type:youtube+tag:androidn"
+    data-sortOrder="-timestamp"
+    data-cardSizes="6x6"
+    data-items-per-page="6"
+    data-maxResults="15"
+    data-initial-results="3">
+  </div>
+</div></section>
+
+<section class="dac-section dac-light" id="resources"><div class="wrap">
+  <h1 class="dac-section-title">Sumber Daya</h1>
+  <div class="dac-section-subtitle">
+    Informasi penting guna membantu mempersiapkan aplikasi untuk Android Nougat.
+  </div>
+
+  <div class="resource-widget resource-flow-layout col-16"
+       data-query="collection:nougat/landing/more"
        data-cardSizes="6x6"
        data-items-per-page="6"
        data-maxResults="15"
        data-initial-results="6"></div>
-
   </div>
-</section>
-
+</section>
\ No newline at end of file
diff --git a/docs/html-intl/intl/in/preview/features/background-optimization.jd b/docs/html-intl/intl/in/preview/features/background-optimization.jd
deleted file mode 100644
index c6bf175..0000000
--- a/docs/html-intl/intl/in/preview/features/background-optimization.jd
+++ /dev/null
@@ -1,391 +0,0 @@
-page.title=Optimalisasi Latar Belakang
-page.metaDescription=Pembatasan baru pada siaran implisit.
-page.keywords="android N", "implicit broadcasts", "job scheduler"
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>
-      Dalam dokumen ini
-    </h2>
-
-    <ol>
-      <li>
-        <a href="#connectivity-action">Pembatasan pada CONNECTIVITY_ACTION</a>
-      </li>
-
-      <li>
-        <a href="#sched-jobs">Menjadwalkan Pekerjaan Jaringan pada Koneksi
-        Berbiaya Tetap</a>
-      </li>
-
-      <li>
-        <a href="#monitor-conn">Memantau Konektivitas Jaringan Saat Aplikasi
-        Dijalankan</a>
-      </li>
-
-      <li>
-        <a href="#media-broadcasts">Pembatasan pada NEW_PICTURE dan
-        NEW_VIDEO</a>
-      </li>
-
-      <li>
-        <a href="#new-jobinfo">Metode JobInfo Baru</a>
-      </li>
-
-      <li>
-        <a href="#new-jobparam">Metode JobParameter Baru</a>
-      </li>
-
-      <li>
-        <a href="#further-optimization">Mengoptimalkan Aplikasi Anda Lebih Jauh</a>
-      </li>
-    </ol>
-  </div>
-</div>
-
-<p>
-  Proses latar belakang bisa menguras memori dan baterai. Misalnya, sebuah
-  siaran implisit dapat memulai banyak proses latar belakang yang telah didaftarkan
-  untuk mendengarkannya, sekalipun proses-proses itu mungkin tidak melakukan banyak pekerjaan. Hal ini bisa
-  berdampak besar pada kinerja perangkat dan pengalaman pengguna.
-</p>
-
-<p>
-  Untuk meringankan masalah ini, Android N menerapkan pembatasan
-  berikut:
-</p>
-
-<ul>
-  <li>Aplikasi yang menargetkan Pratinjau tidak menerima siaran {@link
-  android.net.ConnectivityManager#CONNECTIVITY_ACTION} jika mereka
-  mendaftar untuk menerimanya dalam manifes mereka. Aplikasi yang berjalan tetap
-  bisa mendengarkan {@code CONNECTIVITY_CHANGE} pada thread utama mereka dengan mendaftarkan
-  {@link android.content.BroadcastReceiver} pada {@link
-  android.content.Context#registerReceiver Context.registerReceiver()}.
-  </li>
-
-  <li>Aplikasi tidak bisa mengirim atau menerima siaran {@link
-  android.hardware.Camera#ACTION_NEW_PICTURE} atau {@link
-  android.hardware.Camera#ACTION_NEW_VIDEO}. Optimalisasi ini
-  memengaruhi semua aplikasi, tidak hanya aplikasi yang menargetkan Pratinjau.
-  </li>
-</ul>
-
-<p>
-  Jika aplikasi Anda menggunakan intent ini, Anda harus membuang dependensi padanya
-  secepat mungkin agar Anda bisa menargetkan perangkat Android N dengan benar.
-  Kerangka kerja Android menyediakan beberapa solusi untuk mengurangi kebutuhan akan
-  siaran implisit ini. Misalnya, {@link android.app.job.JobScheduler}
-  dan<a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-  {@code GcmNetworkManager}</a> menyediakan mekanisme yang tangguh untuk menjadwalkan operasi
-  jaringan bila kondisi yang ditetapkan, seperti koneksi ke jaringan
-  berbiaya tetap, terpenuhi. Anda sekarang juga bisa menggunakan {@link android.app.job.JobScheduler}
-  untuk bereaksi terhadap perubahan penyedia materi. Objek {@link android.app.job.JobInfo}
-  membungkus parameter yang digunakan {@link android.app.job.JobScheduler}
-  untuk menjadwalkan pekerjaan Anda. Bila syarat-syarat pekerjaan sudah terpenuhi, sistem
-  akan mengeksekusi pekerjaan ini pada {@link android.app.job.JobService} aplikasi Anda.
-</p>
-
-<p>
-  Dalam dokumen ini, kita akan mempelajari cara menggunakan metode alternatif, seperti
-  {@link android.app.job.JobScheduler}, untuk menyesuaikan aplikasi Anda dengan pembatasan
-  yang baru.
-</p>
-
-<h2 id="connectivity-action">
-  Pembatasan pada CONNECTIVITY_ACTION
-</h2>
-
-<p>
-  Aplikasi yang menargetkan Android N tidak menerima siaran {@link
-  android.net.ConnectivityManager#CONNECTIVITY_ACTION} jika mereka
-  mendaftar untuk menerimanya dalam manifes mereka, dan proses yang bergantung pada siaran
-  ini tidak akan dimulai. Hal ini bisa menimbulkan masalah bagi aplikasi yang ingin
-  memantau perubahan jaringan atau melakukan aktivitas jaringan dalam jumlah besar bila perangkat
-  menghubungkan ke jaringan berbiaya tetap. Beberapa solusi untuk menyiasati pembatasan
-  ini sudah ada dalam kerangka kerja Android, namun pemilihan solusi
-  yang tepat bergantung pada apa yang ingin dicapai oleh aplikasi Anda.
-</p>
-
-<p class="note">
-  <strong>Catatan:</strong> Sebuah {@link android.content.BroadcastReceiver} yang mendaftar pada
-  {@link android.content.Context#registerReceiver Context.registerReceiver()}
-  akan terus menerima siaran ini saat aplikasi berjalan.
-</p>
-
-<h3 id="sched-jobs">
-  Menjadwalkan Pekerjaan Jaringan pada Koneksi Berbiaya Tetap
-</h3>
-
-<p>
-  Saat menggunakan kelas {@link android.app.job.JobInfo.Builder JobInfo.Builder}
-  untuk membangun objek {@link android.app.job.JobInfo} Anda, terapkan metode {@link
-  android.app.job.JobInfo.Builder#setRequiredNetworkType
-  setRequiredNetworkType()} dan teruskan {@link android.app.job.JobInfo
-  JobInfo.NETWORK_TYPE_UNMETERED} sebagai parameter pekerjaan. Contoh kode berikut
-  menjadwalkan layanan yang akan dijalankan ketika perangkat terhubung ke jaringan
-  berbiaya tetap dan dikenai biaya:
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-      (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo job = new JobInfo.Builder(
-    MY_BACKGROUND_JOB,
-    new ComponentName(context, MyJobService.class))
-      .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
-      .setRequiresCharging(true)
-      .build();
-  js.schedule(job);
-}
-</pre>
-
-<p>
-  Bila syarat untuk pekerjaan Anda terpenuhi, aplikasi Anda akan menerima callback untuk menjalankan
-  metode {@link android.app.job.JobService#onStartJob onStartJob()} dalam
-  {@code JobService.class} yang ditetapkan. Untuk melihat contoh selengkapnya mengenai implementasi {@link
-  android.app.job.JobScheduler}, lihat <a href="{@docRoot}samples/JobScheduler/index.html">aplikasi contoh JobScheduler</a>.
-</p>
-
-<p>
-  Aplikasi yang menggunakan layanan GMSCore, dan menargetkan Android 5.0 (API level 21)
-  atau yang lebih rendah, bisa menggunakan <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-  {@code GcmNetworkManager}</a> dan menetapkan {@code Task.NETWORK_STATE_UNMETERED}.
-</p>
-
-<h3 id="monitor-conn">
-  Memantau Konektivitas Jaringan Saat Aplikasi Dijalankan
-</h3>
-
-<p>
-  Aplikasi yang berjalan tetap bisa memantau {@code CONNECTIVITY_CHANGE} dengan
-  {@link android.content.BroadcastReceiver} yang telah didaftarkan. Akan tetapi, {@link
-  android.net.ConnectivityManager} API menyediakan metode yang lebih tangguh untuk meminta
-  callback hanya bila persyaratan jaringan yang ditetapkan terpenuhi.
-</p>
-
-<p>
-  Objek {@link android.net.NetworkRequest} mendefinisikan parameter
-  callback jaringan dari segi {@link android.net.NetworkCapabilities}. Anda
-  membuat objek {@link android.net.NetworkRequest} dengan kelas {@link
-  android.net.NetworkRequest.Builder NetworkRequest.Builder}. {@link
-  android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,
-  android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()}
-  kemudian meneruskan objek {@link android.net.NetworkRequest} ke sistem. Bila
-  syarat jaringan terpenuhi, aplikasi akan menerima callback untuk mengeksekusi
-  metode {@link android.net.ConnectivityManager.NetworkCallback#onAvailable
-  onAvailable()} yang didefinisikan dalam kelas {@link
-  android.net.ConnectivityManager.NetworkCallback}.
-</p>
-
-<p>
-  Aplikasi akan terus menerima callback hingga aplikasi keluar atau memanggil
-  {@link android.net.ConnectivityManager#unregisterNetworkCallback
-  unregisterNetworkCallback()}.
-</p>
-
-<h2 id="media-broadcasts">
-  Pembatasan pada NEW_PICTURE dan NEW_VIDEO
-</h2>
-
-<p>
-  Di Android N, aplikasi tidak bisa mengirim atau menerima siaran {@link
-  android.hardware.Camera#ACTION_NEW_PICTURE} atau {@link
-  android.hardware.Camera#ACTION_NEW_VIDEO}. Pembatasan ini membantu
-  meringankan dampak terhadap kinerja dan pengalaman pengguna bila beberapa aplikasi harus
-  aktif untuk memproses gambar atau video baru. Android N
-  memperluas {@link android.app.job.JobInfo} dan {@link
-  android.app.job.JobParameters} untuk menyediakan solusi alternatif.
-</p>
-
-<h3 id="new-jobinfo">
-  Metode JobInfo baru
-</h3>
-
-<p>
-  Untuk memicu pekerjaan saat perubahan URI materi, Android N memperluas
-  {@link android.app.job.JobInfo} API dengan metode berikut:
-</p>
-
-<dl>
-  <dt>
-    {@code JobInfo.TriggerContentUri()}
-  </dt>
-
-  <dd>
-    Membungkus parameter yang diperlukan untuk memicu pekerjaan saat perubahan URI materi.
-  </dd>
-
-  <dt>
-    {@code JobInfo.Builder.addTriggerContentUri()}
-  </dt>
-
-  <dd>
-    Meneruskan objek {@code TriggerContentUri} ke {@link
-    android.app.job.JobInfo}. Sebuah {@link android.database.ContentObserver}
-    akan memantau URI materi yang dibungkus. Jika terdapat beberapa objek {@code
-    TriggerContentUri} yang berhubungan dengan pekerjaan, sistem memberikan sebuah
-    callback bahkan jika itu hanya melaporkan perubahan pada salah satu URI materi.
-  </dd>
-
-  <dd>
-    Tambahkan flag {@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS} untuk
-    memicu pekerjaan jika ada turunan dari perubahan URI yang diberikan. Flag ini
-    berkaitan dengan parameter {@code notifyForDescendants} yang diteruskan ke {@link
-    android.content.ContentResolver#registerContentObserver
-    registerContentObserver()}.
-  </dd>
-</dl>
-
-<p class="note">
-  <strong>Catatan:</strong> {@code TriggerContentUri()} tidak bisa digunakan
-  bersama-sama dengan {@link android.app.job.JobInfo.Builder#setPeriodic
-  setPeriodic()} atau {@link android.app.job.JobInfo.Builder#setPersisted
-  setPersisted()}. Untuk terus memantau perubahan materi, jadwalkan
-  {@link android.app.job.JobInfo} baru sebelum {@link
-  android.app.job.JobService} aplikasi selesai menangani callback terbaru.
-</p>
-
-<p>
-  Kode contoh berikut menjadwalkan pekerjaan yang akan dipicu bila sistem melaporkan
-  perubahan ke URI materi, {@code MEDIA_URI}:
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-          (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo.Builder builder = new JobInfo.Builder(
-          MY_BACKGROUND_JOB,
-          new ComponentName(context, MediaContentJob.class));
-  builder.addTriggerContentUri(
-          new JobInfo.TriggerContentUri(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
-          JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
-  js.schedule(builder.build());
-}
-</pre>
-<p>
-  Bila sistem melaporkan perubahan dalam URI materi yang ditetapkan, aplikasi Anda
-  akan menerima callback dan objek {@link android.app.job.JobParameters}
-  akan diteruskan ke metode {@link android.app.job.JobService#onStartJob onStartJob()}
-  dalam {@code MediaContentJob.class}.
-</p>
-
-<h3 id="new-jobparam">
-  Metode JobParameter Baru
-</h3>
-
-<p>
-  Android N juga memperluas {@link android.app.job.JobParameters} untuk
-  memungkinkan aplikasi Anda menerima informasi yang berguna tentang otoritas materi
-  dan URI yang memicu pekerjaan:
-</p>
-
-<dl>
-  <dt>
-    {@code Uri[] getTriggeredContentUris()}
-  </dt>
-
-  <dd>
-    Mengembalikan larik URL yang telah memicu pekerjaan. Ini akan berupa {@code
-    null} jika tidak ada URI yang memicu pekerjaan (misalnya, pekerjaan
-    dipicu karena batas waktu atau alasan lainnya), atau jumlah
-    URI yang berubah lebih dari 50.
-  </dd>
-
-  <dt>
-    {@code String[] getTriggeredContentAuthorities()}
-  </dt>
-
-  <dd>
-    Mengembalikan larik string otoritas materi yang telah memicu pekerjaan.
-    Jika larik yang dikembalikan bukan {@code null}, gunakan {@code getTriggeredContentUris()}
-    untuk mengambil detail URI yang telah berubah.
-  </dd>
-</dl>
-
-<p>
-  Kode contoh berikut mengganti metode {@link
-  android.app.job.JobService#onStartJob JobService.onStartJob()} dan
-  mencatat otoritas materi serta URI yang telah memicu pekerjaan:
-</p>
-
-<pre>
-&#64;Override
-public boolean onStartJob(JobParameters params) {
-  StringBuilder sb = new StringBuilder();
-  sb.append("Media content has changed:\n");
-  if (params.getTriggeredContentAuthorities() != null) {
-      sb.append("Authorities: ");
-      boolean first = true;
-      for (String auth :
-          params.getTriggeredContentAuthorities()) {
-          if (first) {
-              first = false;
-          } else {
-             sb.append(", ");
-          }
-           sb.append(auth);
-      }
-      if (params.getTriggeredContentUris() != null) {
-          for (Uri uri : params.getTriggeredContentUris()) {
-              sb.append("\n");
-              sb.append(uri);
-          }
-      }
-  } else {
-      sb.append("(No content)");
-  }
-  Log.i(TAG, sb.toString());
-  return true;
-}
-</pre>
-
-<h2 id="further-optimization">
-  Mengoptimalkan Aplikasi Anda Lebih Jauh
-</h2>
-
-<p>
-  Mengoptimalkan aplikasi Anda untuk berjalan pada perangkat yang mempunyai memori rendah, atau dalam kondisi
-  memori rendah, dapat meningkatkan kinerja dan pengalaman pengguna. Membuang
-  dependensi pada layanan latar belakang dan penerima siaran
-  implisit yang terdaftar secara statis bisa membantu aplikasi Anda berjalan lebih baik pada perangkat demikian. Meskipun
-  Android N telah mengambil langkah-langkah untuk mengurangi sebagian masalah ini, Anda disarankan
-  agar mengoptimalkan aplikasi untuk berjalan tanpa menggunakan
-  proses latar belakang ini sama sekali.
-</p>
-
-<p>
-  Android N memperkenalkan beberapa tambahan perintah <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge (ADB)</a> yang
-  bisa Anda gunakan untuk menguji perilaku aplikasi dengan proses latar belakang dinonaktifkan:
-</p>
-
-<ul>
-  <li>Untuk mensimulasikan kondisi saat siaran implisit dan layanan latar belakang
-  tidak tersedia, masukkan perintah berikut:
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set &lt;package&gt; RUN_IN_BACKGROUND ignore}
-</pre>
-  </li>
-
-  <li>Untuk mengaktifkan kembali siaran implisit dan layanan latar belakang, masukkan
-  perintah berikut:
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set &lt;package&gt; RUN_IN_BACKGROUND allow}
-</pre>
-  </li>
-</ul>
diff --git a/docs/html-intl/intl/in/preview/features/icu4j-framework.jd b/docs/html-intl/intl/in/preview/features/icu4j-framework.jd
deleted file mode 100644
index 1d97623..0000000
--- a/docs/html-intl/intl/in/preview/features/icu4j-framework.jd
+++ /dev/null
@@ -1,159 +0,0 @@
-page.title=ICU4J Android Framework API
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>Dalam dokumen ini:</h2>
-<ol>
-    <li><a href="#relation">Hubungan dengan ICU4J</a></li>
-    <li><a href="#migration">Migrasi ke android.icu API dari ICU4J </a></li>
-    <li><a href="#licence">Lisensi</a></li>
-</ol>
-
-<h2>Lihat Juga</h2>
-<ol>
-  <li>
-    <a class="external-link" href="http://userguide.icu-project.org">Dokumentasi untuk ICU4J</a>
-  </li>
-
-  <li>
-    <a class="external-link" href="http://site.icu-project.org/#TOC-What-is-ICU-">Standar terbaru yang didukung
-    oleh ICU4J</a>
-  </li>
-</ol>
-</div>
-</div>
-
-<p>
-  ICU4J merupakan serangkaian pustaka Java sumber terbuka yang banyak digunakan dan menyediakan Unicode
-  serta dukungan globalisasi untuk aplikasi perangkat lunak. Android N
-  mengekspos subset ICU4J API dalam kerangka kerja Android bagi pengembang aplikasi
-  untuk digunakan pada paket {@code android.icu}. API ini menggunakan
-  data pelokalan yang ada pada perangkat. Hasilnya, Anda bisa mengurangi footprint
-  APK dengan tidak mengompilasi pustaka ICU4J ke APK Anda; sebagai gantinya,
-  cukup memanggilnya dalam kerangka kerja. (Dalam hal ini, Anda mungkin perlu menyediakan
-  <a href="{@docRoot}google/play/publishing/multiple-apks.html">beberapa versi
-  APK Anda</a>, sehingga pengguna yang menjalankan versi Android lebih rendah dari Android N
-  bisa mengunduh versi aplikasi yang berisi pustaka ICU4J.)
-</p>
-
-<p>
-  Dokumen ini diawali dengan menyediakan beberapa informasi dasar tentang level Android API
-  minimum yang diperlukan untuk mendukung pustaka-pustaka ini. Kemudian dijelaskan tentang apa
-  yang perlu Anda ketahui tentang implementasi ICU4J spesifik Android. Terakhir,
-  Anda akan diberi tahu cara menggunakan ICU4J API dalam kerangka kerja Android.
-</p>
-
-<h2 id="relation">Hubungan dengan ICU4J</h2>
-
-<p>
-  Android N mengekspos subset ICU4J API lewat
-  paket <code>android.icu</code>, bukannya <code>com.ibm.icu</code>. Kerangka kerja
-  Android dapat memilih untuk tidak
-  mengekspos ICU4J API karena berbagai alasan; misalnya, Android N tidak mengekspos
-  beberapa API yang tidak digunakan lagi atau yang dinyatakan belum
-  stabil oleh tim ICU. Karena tim ICU tidak lagi menggunakan API di masa mendatang, Android juga akan menandainya
-  sebagai tidak digunakan lagi namun akan terus menyertakannya.
-</p>
-
-<p class="table-caption"><strong>Tabel 1.</strong> Versi ICU dan CLDR yang digunakan
-  di Android N.</p>
-<table>
-<tr>
-<th>Level Android API</th>
-<th>Versi ICU</th>
-<th>Versi CLDR</th>
-</tr>
-<tr>
-<td>Android N</td>
-<td>56</td>
-<td>28</td>
-</tr>
-</table>
-
-<p>Inilah beberapa hal penting yang harus diperhatikan:</p>
-
-<ul>
-<li>ICU4J Android Framework API tidak menyertakan semua ICU4J API.</li>
-<li>Pengembang NDK harus mengetahui bahwa Android ICU4C tidak didukung.</li>
-<li>API dalam kerangka kerja Android tidak menggantikan dukungan Android untuk
-<a href="{@docRoot}guide/topics/resources/localization.html">melokalkan dengan
-sumber daya</a>.</li>
-</ul>
-
-<h2 id="migration">Migrasi ke paket android.icu dari com.ibm.icu</h2>
-
-<p>
-  Jika Anda sudah menggunakan ICU4J API dalam aplikasi, dan
-  <code>android.icu</code> API memenuhi persyaratan Anda, maka migrasi ke
-  API kerangka kerja mengharuskan Anda untuk mengubah impor Java
-  dari <code>com.ibm.icu</code> ke <code>android.icu</code>. Kemudian Anda bisa
-  membuang salinan file ICU4J dari APK.
-</p>
-
-<p class="note">
-  <b>Catatan</b>: API kerangka kerja ICU4J menggunakan ruang nama {@code android.icu}
-  sebagai ganti {@code com.ibm.icu}. Hal ini untuk menghindari konflik
-  ruang nama di APK yang berisi pustaka {@code com.ibm.icu} sendiri.
-</p>
-
-<h3 id="migrate-from-android">
-  Migrasi ke API android.icu dari Android SDK API lainnya
-</h3>
-
-<p>
-  Beberapa kelas dalam paket <code>java</code> dan <code>android</code> memiliki
-  padanannya dengan yang ditemukan di ICU4J. Akan tetapi, ICU4J seringkali menyediakan dukungan
-  yang lebih luas untuk standar dan bahasa.
-</p>
-<p>Inilah beberapa contoh untuk membantu Anda memulai:</p>
-<table>
-<tr>
-<th>Kelas</th>
-<th>Alternatif</th>
-</tr>
-<tr>
-<td><code>java.lang.Character</code> </td>
-<td><code>android.icu.lang.UCharacter</code> </td>
-</tr>
-<tr>
-<td><code>java.text.BreakIterator</code> </td>
-<td><code>android.icu.text.BreakIterator</code> </td>
-</tr>
-<tr>
-<td><code>java.text.DecimalFormat</code> </td>
-<td><code>android.icu.text.DecimalFormat</code> </td>
-</tr>
-<tr>
-<td><code>java.util.Calendar</code></td>
-<td>
-<code>android.icu.util.Calendar</code></td>
-</tr>
-<tr>
-<td><code>android.text.BidiFormatter</code>
- </td>
-<td><code>android.icu.text.Bidi</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateFormat</code>
- </td>
-<td><code>android.icu.text.DateFormat</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateUtils</code> </td>
-<td><code>android.icu.text.DateFormat</code>
-<code>android.icu.text.RelativeDateTimeFormatter</code>
-</td>
-</tr>
-</table>
-
-<h2 id="licence">Lisensi</h2>
-
-<p>
-  ICU4J dirilis dengan lisensi ICU. Untuk detailnya, lihat <a class="external-link" href="http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-">Panduan Pengguna
-  ICU.</a>
-</p>
diff --git a/docs/html-intl/intl/in/preview/features/multilingual-support.jd b/docs/html-intl/intl/in/preview/features/multilingual-support.jd
deleted file mode 100644
index 29104cb..0000000
--- a/docs/html-intl/intl/in/preview/features/multilingual-support.jd
+++ /dev/null
@@ -1,221 +0,0 @@
-page.title=Bahasa dan Lokal
-page.tags=androidn
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>Dalam dokumen ini:</h2>
-<ol>
-	  <li><a href="#preN">Tantangan dalam Mengatasi Masalah Sumber Daya Bahasa</a></li>
-    <li><a href="#postN">Peningkatan pada Strategi Resolusi Sumber Daya</a></li>
-    <li><a href="#design">Mendesain Aplikasi Anda untuk Mendukung Lokal
-      Tambahan</a></li>
-
-</ol>
-
-</div>
-</div>
-
-<p>Android N memberikan dukungan yang disempurnakan untuk pengguna multibahasa,
-yang memungkinkan mereka memilih beberapa lokal dalam setelan. Android N
-menyediakan kemampuan ini dengan memperbanyak jumlah lokal yang didukung
-dan mengubah cara sistem mengatasi masalah sumber daya. Metode baru mengatasi
-masalah sumber daya ini lebih tangguh dan didesain agar kompatibel dengan APK yang ada, namun
-Anda harus ekstra hati-hati terhadap perilaku tak terduga. Misalnya, Anda
-harus menguji untuk memastikan aplikasi Anda secara default diatur ke bahasa yang diinginkan. Juga,
-jika aplikasi Anda mendukung beberapa bahasa, Anda harus memastikan dukungan ini berfungsi
-sebagaimana diinginkan. Terakhir, Anda harus mencoba memastikan aplikasi Anda dengan lancar menangani
-bahasa yang tidak secara eksplisit Anda dukung dalam desain.</p>
-
-<p>Dokumen ini diawali dengan menjelaskan strategi resolusi sumber daya sebelum
-Android N. Berikutnya, akan dijelaskan strategi
-resolusi sumber daya Android N yang telah ditingkatkan. Terakhir, akan djelaskan cara memanfaatkan
-jumlah lokal yang telah diperbanyak untuk mendukung lebih banyak pengguna multibahasa.</p>
-
-<h2 id="preN">Tantangan dalam Mengatasi Masalah Sumber Daya Bahasa</h2>
-
-<p>Sebelum Android N, Android tidak selalu
- berhasil mencocokkan lokal aplikasi dan lokal sistem.</p>
-
- <p>Misalnya, anggaplah Anda menghadapi situasi berikut:</p>
- <ul>
- <li>Bahasa default aplikasi Anda adalah {@code en_US} (US English), dan aplikasi juga
-  berisi string bahasa Spanyol yang telah dilokalkan di file sumber daya {@code es_ES}.
-</li>
- <li> Perangkat telah disetel ke {@code es_MX} </li>
-
-<p>Bila kode Java Anda merujuk ke string, sistem akan memuat
-string dari file sumber daya default ({@code en_US}), sekalipun aplikasi memiliki
-sumber daya bahasa Spanyol yang dilokalkan pada {@code es_ES}. Hal ini karena bila sistem
-  tidak bisa menemukan hasil yang persis, sistem akan terus mencari sumber daya dengan menghilangkan
-  kode negara dari lokal tersebut. Akhirnya, jika tidak ada hasil yang ditemukan, sistem akan mengembalikan
- ke default, yakni {@code en_US}. </p>
-
-
-<p>Sistem juga akan default ke {@code en_US} jika pengguna memilih
-bahasa yang sama sekali tidak didukung oleh aplikasi, seperti bahasa Prancis. Misalnya:</p>
-
-<p class="table-caption" id="t-resource-res">
-<strong>Tabel 1.</strong> Resolusi sumber daya tanpa lokal yang persis sama.
-</p>
-<table>
-<tbody>
-<tr>
-<th>Setelan Pengguna</th>
-<th>Sumber Daya Aplikasi</th>
-<th>Resolusi Sumber Daya</th>
-</tr>
-<tr>
-<td>fr_CH</td>
-<td>
-default (en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
- <td>
-Coba fr_CH =&gt; Gagal<br>
-Coba fr =&gt; Gagal<br>
-Gunakan default (en)
-</td>
- </tr>
- </tbody>
-</table>
-
-
-<p>Dalam contoh ini, sistem menampilkan string bahasa Inggris
-tanpa mengetahui apakah pengguna memahami bahasa Inggris. Perilaku ini sudah sangat umum
-sekarang. Android N harus mengurangi frekuensi
-hasil seperti ini secara substansial.</p>
-
-<h2 id="postN">Peningkatan pada Strategi Resolusi Sumber Daya</h2>
-<p>Android N menghadirkan resolusi sumber daya yang lebih handal, dan
-secara otomatis menemukan solusi yang lebih baik. Akan tetapi, untuk mempercepat resolusi dan meningkatkan
-kemudahan pemeliharaan, Anda harus menyimpan sumber daya dalam dialek induk yang paling umum.
- Misalnya, jika sebelumnya Anda telah menyimpan sumber daya bahasa Spanyol di direktori {@code es-US}
-, pindahkan ke direktori {@code es-419}, yang berisi bahasa Spanyol Amerika Latin.
- Demikian pula, jika Anda memiliki string sumber daya dalam folder bernama {@code en-GB}, ganti nama
- folder itu menjadi {@code en-001} (bahasa Inggris internasional), karena induk yang paling umum
- untuk string <code>en-GB</code> adalah {@code en-001}.
- Contoh berikut menjelaskan mengapa praktik-praktik ini meningkatkan kinerja dan
-reliabilitas resolusi sumber daya.</p>
-
-<h3>Contoh resolusi sumber daya</h3>
-
-<p>Dengan Android N, kasus yang dijelaskan dalam <strong>Tabel 1</strong> diatasi
-secara berbeda:</p>
-
-<p class="table-caption" id="t-improved-res">
-<strong>Tabel 2.</strong> Strategi resolusi yang ditingkatkan bila tidak ada
-lokal yang sama persis.</p>
-<table>
-<tr>
-<th>Setelan Pengguna</th>
-<th>Sumber Daya Aplikasi</th>
-<th>Resolusi Sumber Daya</th>
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-</ol>
-</td>
-<td>
-default (en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
-<td>
-Coba fr_CH =&gt; Gagal<br>
-Coba fr =&gt; Gagal<br>
-Coba anak dari fr =&gt; fr_FR<br>
-Gunakan fr_FR
-</td>
-</tr>
-
-</table>
-
-
-<p>Sekarang pengguna mendapatkan sumber daya bahasa Prancis sebagai ganti bahasa Inggris. Contoh ini juga menunjukkan
- mengapa Anda harus menyimpan string bahasa Prancis di {@code fr} bukan pada {@code fr_FR}
- untuk Android N. Arah aksi di sini adalah untuk mencocokkan dengan induk dialek terdekat,
- membuat resolusi lebih cepat dan lebih dapat diprediksi.</p>
-
-<p>Selain logika resolusi yang diperbaiki ini, Android sekarang menawarkan lebih banyak
-pilihan bahasa untuk pengguna. Mari kita coba lagi contoh di atas dengan menetapkan bahasa Italia
- sebagai bahasa pengguna tambahan, tetapi tanpa dukungan aplikasi untuk bahasa Prancis.  </p>
-
-<p class="table-caption" id="t-2d-choice">
-<strong>Tabel 3.</strong> Resolusi sumber daya bila aplikasi hanya mencocokkan
-setelan lokal yang disukai kedua oleh pengguna.</p>
-<table>
-<tr>
-<th>Setelan Pengguna</th>
-<th>Sumber Daya Aplikasi</th>
-<th>Resolusi Sumber Daya</th>
-
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-<li> it_CH</li>
-</ol>
-</td>
-<td>
-default (en)<br>
-de_DE<br>
-es_ES<br>
-it_IT<br>
-</td>
-<td>
-Coba fr_CH =&gt; Gagal<br>
-Coba fr =&gt; Gagal<br>
-Coba anak dari fr =&gt; Gagal<br>
-Coba it_CH =&gt; Gagal<br>
-Coba it =&gt; Gagal<br>
-Coba anak dari it =&gt; it_IT<br>
-Gunakan it_IT
-</td>
-
-</tr>
-
-</table>
-<p>Pengguna tetap mendapatkan bahasa yang mereka pahami, meskipun aplikasi tidak
-mendukung bahasa Prancis.</p>
-
-
-<h2 id="design">Mendesain Aplikasi Anda untuk Mendukung Lokal Tambahan</h2>
-<h3>LocaleList API</h3>
-
-<p>Android N menambahkan API baru {@code LocaleList.getDefault()}
-yang memungkinkan aplikasi langsung kueri daftar bahasa yang telah ditetapkan pengguna. API ini
-memungkinkan Anda membuat
- perilaku aplikasi yang lebih canggih dan tampilan materi yang lebih optimal. Misalnya, Telusur
-  bisa menampilkan hasil dalam beberapa bahasa berdasarkan setelan pengguna.  Aplikasi browser
-  bisa menghindari penawaran menerjemahkan halaman dalam bahasa yang sudah diketahui pengguna,
-  dan aplikasi keyboard bisa mengaktifkan otomatis semua layout yang sesuai. </p>
-
-<h3>Formatter</h3>
-
-<p>Hingga Android 6.0 (API level 23), Android hanya mendukung satu atau dua lokal
- untuk banyak bahasa umum
-(en, es, ar, fr, ru). Karena hanya ada beberapa varian dari setiap bahasa,
-aplikasi bisa menghindar dengan menyimpan beberapa nomor dan tanggal sebagai string hard-code
-dalam file sumber daya.  Akan tetapi, dengan perluasan set lokal yang didukung Android,
-maka akan ada
-perbedaan format yang signifikan untuk tanggal, waktu, mata uang, dan informasi
-serupa bahkan dalam lokal tunggal. Menjadikan format Anda sebagai hard-code bisa menghasilkan
-pengalaman yang membingungkan bagi pengguna akhir.  Karena itu, saat mengembangkan untuk Android N
-pastikan menggunakan formatter sebagai ganti menjadikan string angka dan tanggal sebagai hard-code.</p>
-
-<p>Contoh terbaik adalah bahasa Arab, yang mendukung Android N berkembang dari
-satu {@code ar_EG} menjadi 27 lokal bahasa Arab. Bahasa lokal ini bisa berbagi hampir semua sumber daya,
-namun sebagian lebih memilih digit ASCII, sementara yang lain memilih digit asli. Misalnya,
-bila Anda ingin membuat kalimat dengan variabel digit, seperti
-"Pilih PIN 4 digit", gunakan formatter seperti yang ditampilkan di bawah ini:</p>
-
-<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>
diff --git a/docs/html-intl/intl/in/preview/features/notification-updates.jd b/docs/html-intl/intl/in/preview/features/notification-updates.jd
deleted file mode 100644
index 0ad2770..0000000
--- a/docs/html-intl/intl/in/preview/features/notification-updates.jd
+++ /dev/null
@@ -1,393 +0,0 @@
-page.title=Pemberitahuan
-page.tags=pemberitahuan
-helpoutsWidget=true
-page.image=/preview/images/notifications-card.png
-
-trainingnavtop=true
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-
-<!-- table of contents -->
-<h2>Dokumen ini berisi</h2>
-<ol>
-  <li><a href="#direct">Balasan Langsung</a></li>
-  <li><a href="#bundle">Bundel Pemberitahuan</a></li>
-  <li><a href="#custom">Tampilan Khusus</a></li>
-  <li><a href="#style">Gaya Pesan</a></li>
-</ol>
-
-</div>
-</div>
-
-<p>Android N memperkenalkan beberapa API baru yang memungkinkan aplikasi untuk mengeposkan
-pemberitahuan yang sangat mudah terlihat dan interaktif.</p>
-
-<p>Android N menambahkan API pemberitahuan{@link android.support.v4.app.RemoteInput}
-yang ada untuk mendukung balasan inline pada handset. Fitur ini memungkinkan pengguna
- merespons dengan cepat dari bayangan pemberitahuan tanpa mengunjungi aplikasi Anda.</p>
-
-<p>
-  Android N juga memungkinkan Anda menggabungkan pemberitahuan yang serupa agar
-  muncul sebagai satu pemberitahuan. Untuk memungkinkan hal ini, Android N menggunakan metode {@link
-  android.support.v4.app.NotificationCompat.Builder#setGroup
-  NotificationCompat.Builder.setGroup()} yang sudah ada. Pengguna bisa memperluas setiap
-  pemberitahuan, dan melakukan tindakan seperti membalas dan menutup setiap
-  pemberitahuan, satu per satu dari bayangan pemberitahuan.
-</p>
-
-<p>Terakhir, Android N juga menambahkan API baru yang memungkinkan Anda untuk memanfaatkan dekorasi
-sistem dalam tampilan pemberitahuan yang disesuaikan untuk aplikasi Anda. API ini membantu
-memastikan semua tampilan pemberitahuan sama-sama menggunakan penyajian yang konsisten dengan
-template standar.</p>
-
-<p>Dokumen ini menyoroti beberapa perubahan penting yang harus Anda
- perhitungkan saat menggunakan fitur pemberitahuan baru dalam aplikasi Anda.</p>
-
-<h2 id="direct">Balasan Langsung</h2>
-
-<p>Dengan fitur Balasan Langsung di Android N, pengguna bisa dengan cepat
-merespons pesan teks atau memperbarui daftar tugas secara langsung dalam antarmuka
-pemberitahuan. Pada perangkat genggam, tindakan balasan inline muncul sebagai tombol tambahan
- yang dilampirkan pada pemberitahuan. Bila pengguna membalas lewat keyboard, sistem akan melampirkan
- respons teks ke intent
-    yang telah Anda tetapkan untuk tindakan pemberitahuan dan mengirimkan intent ke
-     aplikasi perangkat genggam Anda.
-
-
-<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
-  {@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
-<p class="img-caption">
-  <strong>Gambar 1.</strong> Android N menambahkan tombol tindakan <strong>Reply</strong>.
-
-</p>
-
-<h3>Menambahkan tindakan balasan inline</h3>
-
-<p>Untuk membuat tindakan pemberitahuan yang mendukung balasan langsung:
-</p>
-
-<ol>
-<li>Buat instance {@link android.support.v4.app.RemoteInput.Builder}
- yang bisa Anda tambahkan ke tindakan
-pemberitahuan. Konstruktor kelas ini akan menerima string bahwa sistem menggunakannya sebagai kunci
- untuk masukan teks. Kemudian, aplikasi perangkat genggam Anda akan menggunakan kunci itu untuk mengambil teks
-  masukan tersebut.
-
-<pre>
-// Key for the string that's delivered in the action's intent.
-private static final String KEY_TEXT_REPLY = "key_text_reply";
-String replyLabel = getResources().getString(R.string.reply_label);
-RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
-        .setLabel(replyLabel)
-        .build();
-</pre>
-</li>
-<li>Lampirkan objek {@link android.support.v4.app.RemoteInput}
- pada tindakan dengan menggunakan <code>addRemoteInput()</code>.
-
-<pre>
-// Create the reply action and add the remote input.
-Notification.Action action =
-        new Notification.Action.Builder(R.drawable.ic_reply_icon,
-                getString(R.string.label), replyPendingIntent)
-                .addRemoteInput(remoteInput)
-                .build();
-</pre>
-</li>
-
-<li>Terapkan tindakan pada pemberitahuan dan keluarkan pemberitahuan.
-
-<pre>
-// Build the notification and add the action.
-Notification newMessageNotification =
-        new Notification.Builder(mContext)
-                .setSmallIcon(R.drawable.ic_message)
-                .setContentTitle(getString(R.string.title))
-                .setContentText(getString(R.string.content))
-                .addAction(action))
-                .build();
-
-// Issue the notification.
-NotificationManager notificationManager =
-        NotificationManager.from(mContext);
-notificationManager.notify(notificationId, newMessageNotification);
-
-</pre>
-</li>
-
-</ol>
-
-
-<p> Sistem akan meminta pengguna memasukkan respons bila mereka memicu
-tindakan pemberitahuan. </p>
-
-<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
-    {@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>Gambar 2.</strong> Pengguna memasukkan teks dari bayangan pemberitahuan.
-</p>
-
-<h3>
-  Mengambil masukan pengguna dari balasan inline
-</h3>
-
-<p>
-  Untuk menerima masukan pengguna dari antarmuka pemberitahuan ke aktivitas yang Anda
-deklarasikan dalam intent tindakan balasan:
-</p>
-
-<ol>
-  <li>Panggil {@link android.support.v4.app.RemoteInput#getResultsFromIntent
-  getResultsFromIntent()} dengan meneruskan intent tindakan pemberitahuan sebagai
-  parameter masukan. Metode ini mengembalikan {@link android.os.Bundle} yang
-  berisi respons teks.
-
-    <pre>
-Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-</pre>
-  </li>
-
-  <li>Lakukan kueri pada bundel menggunakan kunci hasil (diberikan ke konstruktor {@link
-  android.support.v4.app.RemoteInput.Builder}). Anda bisa menyelesaikan
-  proses ini dan mengambil teks masukan dengan membuat sebuah metode, seperti dalam
-  cuplikan kode berikut:
-
-    <pre>
-// Obtain the intent that started this activity by calling
-// Activity.getIntent() and pass it into this method to
-// get the associated string.
-
-private CharSequence getMessageText(Intent intent) {
-    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-    if (remoteInput != null) {
-        return remoteInput.getCharSequence(KEY_TEXT_REPLY);
-    }
-    return null;
- }
-</pre>
-  </li>
-
-  <li>Kompilasilah dan keluarkan pemberitahuan lain, menggunakan ID pemberitahuan yang sama dengan
-  yang Anda berikan untuk pemberitahuan sebelumnya. Indikator kemajuan
-    menghilang dari antarmuka pemberitahuan untuk memberi tahu pengguna mengenai balasan
-    yang berhasil. Saat menangani pemberitahuan baru ini, gunakan konteks yang
-    diteruskan ke metode {@code onReceive()} penerima.
-
-    <pre>
-// Build a new notification, which informs the user that the system
-// handled their interaction with the previous notification.
-Notification repliedNotification =
-        new Notification.Builder(context)
-                .setSmallIcon(R.drawable.ic_message)
-                .setContentText(getString(R.string.replied))
-                .build();
-
-// Issue the new notification.
-NotificationManager notificationManager =
-        NotificationManager.from(context);
-notificationManager.notify(notificationId, repliedNotification);
-</pre>
-  </li>
-</ol>
-
-<p>
-  Untuk aplikasi interaktif, seperti chat, akan berguna bila menyertakan
-  konteks tambahan saat menangani teks yang diambil. Misalnya, aplikasi ini bisa menampilkan
-  beberapa baris riwayat chat sekaligus. Bila pengguna merespons melalui {@link
-  android.support.v4.app.RemoteInput}, Anda bisa memperbarui riwayat balasan
-  menggunakan metode {@code setRemoteInputHistory()}.
-</p>
-
-<p>
-  Pemberitahuan harus diperbarui atau dibatalkan setelah aplikasi
- menerima masukan jarak jauh. Bila pengguna membalas ke pembaruan jarak jauh
-  menggunakan Balasan Langsung,
-  jangan batalkan pemberitahuan. Melainkan, perbarui pemberitahuan untuk menampilkan balasan pengguna.
-Untuk pemberitahuan yang menggunakan {@code MessagingStyle}, Anda harus menambahkan
-balasannya sebagai pesan terbaru. Saat menggunakan template lain, Anda bisa
-menambahkan balasan pengguna ke riwayat masukan jarak jauh.
-</p>
-
-<h2 id="bundle">Bundel Pemberitahuan</h2>
-
-<p>Android N membekali pengembang dengan sebuah cara baru untuk menyatakan
- antrean pemberitahuan: <i>bundel pemberitahuan</i>. Ini mirip dengan fitur
-  <a href="{@docRoot}training/wearables/notifications/stacks.html">Tumpukan
-  Pemberitahuan</a> dalam Android Wear. Misalnya, jika aplikasi Anda membuat pemberitahuan
-  untuk pesan yang diterima, bila lebih dari satu pesan diterima, pemberitahuan tersebut akan
- dibundel sebagai satu grup. Anda bisa
- menggunakan metode {@link android.support.v4.app.NotificationCompat.Builder#setGroup
-Builder.setGroup()} yang ada untuk membundel pemberitahuan yang sama.</p>
-
-<p>
-  Grup pemberitahuan menerapkan hierarki pada pemberitahuan yang ada di dalamnya.
-  Di bagian teratas hierarki adalah pemberitahuan induk yang menampilkan informasi
-  rangkuman untuk grup tersebut. Pengguna secara bertahap bisa
-  memperbesar grup pemberitahuan, dan sistem akan menampilkan informasi lebih banyak saat
-  pengguna menggali lebih dalam. Bila pengguna memperbesar bundel, sistem akan memperlihatkan informasi lebih
-  banyak untuk semua pemberitahuan anak; bila pengguna
-  memperbesar salah satu pemberitahuan tersebut, sistem akan memperlihatkan seluruh isinya.
-</p>
-
-<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
-          {@docRoot}preview/images/bundles_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>Gambar 3.</strong> Pengguna secara bertahap bisa memperluas grup
-  pemberitahuan.
-</p>
-
-<p class="note">
-  <strong>Catatan:</strong> Jika aplikasi yang sama mengirim empat atau beberapa pemberitahuan
-  dan tidak menetapkan pengelompokan,
-  sistem secara otomatis akan mengelompokannya.
-</p>
-
-<p>Untuk mengetahui cara menambahkan pemberitahuan ke grup, lihat
-<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">Menambahkan
-Setiap Pemberitahuan ke Grup</a>.</p>
-
-
-<h3 id="best-practices">Praktik terbaik untuk bundel pemberitahuan</h3>
-<p>Bagian ini memberikan panduan tentang kapan menggunakan grup pemberitahuan sebagai ganti
-pemberitahuan {@link android.app.Notification.InboxStyle InboxStyle}
-yang telah tersedia di
-platform Android versi sebelumnya.</p>
-
-<h3>Kapan menggunakan bundel pemberitahuan</h3>
-
-<p>Anda harus menggunakan grup pemberitahuan hanya jika semua kondisi berikut ini
-bernilai benar untuk kasus penggunaan Anda:</p>
-
-<ul>
-  <li>Pemberitahuan anak adalah pemberitahuan lengkap dan bisa ditampilkan
-   masing-masing tanpa perlu rangkuman grup.</li>
-  <li>Ada untungnya memunculkan pemberitahuan anak satu per satu. Misalnya:
-
-  </li>
-  <ul>
-    <li>Mereka dapat diaplikasikan, dengan tindakan khusus untuk masing-masing anak.</li>
-    <li>Ada lebih banyak informasi pada anak yang ingin dibaca oleh pengguna.</li>
-  </ul>
-</ul>
-
-<p>Contoh kasus penggunaan yang baik untuk grup pemberitahuan antara lain: aplikasi perpesanan
-yang menampilkan daftar pesan yang masuk, atau aplikasi email yang menampilkan daftar email
-yang diterima.</p>
-
-<p>
-Contoh kasus penggunaan saat pemberitahuan tunggal lebih disukai
- meliputi pesan pribadi dari satu orang, atau representasi daftar dari
- item teks baris tunggal. Anda bisa menggunakan
-({@link android.app.Notification.InboxStyle InboxStyle} atau
-{@link android.app.Notification.BigTextStyle BigTextStyle}) untuk mencapai
-hal ini.
-</p>
-
-<h3 id ="post">Menampilkan bundel pemberitahuan</h3>
-
-<p>
-  Aplikasi ini harus selalu mengeposkan rangkuman grup, sekalipun grup hanya berisi
-  satu anak. Sistem akan menyembunyikan rangkuman dan langsung menampilkan
-  pemberitahuan anak jika hanya berisi pemberitahuan tunggal. Hal ini akan memastikan
-  sistem bisa memberikan pengalaman yang konsisten saat pengguna menggeser
-  anak grup.
-</p>
-
-<p class="note">
-  <strong>Catatan:</strong> Versi Android N ini tidak menyembunyikan
-  rangkuman untuk grup pemberitahuan yang berisi satu anak. Fungsionalitas
-  ini akan ditambahkan dalam Android N versi berikutnya.
-</p>
-
-<h3>Mengintip pemberitahuan</h3>
-
-<p>Walaupun sistem biasanya menampilkan pemberitahuan anak sebagai sebuah grup, Anda bisa menyetelnya
- agar muncul untuk sementara muncul sebagai
- <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">
- pemberitahuan pendahuluan</a>. Fitur ini khususnya berguna karena memungkinkan
-  akses langsung ke pemberitahuan anak terbaru dan tindakan yang dikaitkan dengannya.
-</p>
-
-
-<h3>Kompatibilitas mundur</h3>
-
-<p>
-  Baik grup pemberitahuan maupun masukan jauh telah menjadi bagian dari {@link
-  android.app.Notification} API sejak Android 5.0 (API level 21) untuk mendukung
-  perangkat Android Wear. Jika Anda sudah membuat pemberitahuan dengan API ini,
-  satu-satunya tindakan yang harus Anda ambil adalah memverifikasi apakah perilaku aplikasi sesuai dengan panduan yang
-  dijelaskan di atas, dan mempertimbangkan implementasi {@code
-  setRemoteInputHistory()}.
-</p>
-
-<p>
-  Untuk mendukung kompatibilitas mundur, tersedia API yang sama bersama
-  kelas {@link android.support.v4.app.NotificationCompat}
-  pustaka dukungan, yang memungkinkan Anda untuk membuat pemberitahuan yang bekerja pada versi Android
-  sebelumnya. Pada perangkat genggam dan tablet, pengguna hanya melihat pemberitahuan rangkuman,
-  sehingga aplikasi masih memiliki model inbox atau pemberitahuan sama yang
-  mewakili seluruh materi informasi grup. Karena perangkat Android
-  Wear memungkinkan pengguna melihat semua pemberitahuan anak bahkan pada level platform
-  yang lebih lama, maka Anda harus membangun pemberitahuan anak dengan mengabaikan level
-  API.
-</p>
-
-<h2 id="custom"> Tampilan Khusus</h2>
-<p>Mulai dari Android N, Anda bisa menyesuaikan tampilan pemberitahuan dan
-tetap mendapatkan dekorasi sistem seperti header pemberitahuan, tindakan, dan
-layout yang bisa diperluas.</p>
-
-<p>Untuk mengaktifkan kemampuan ini, Android N menambahkan API berikut untuk menata gaya
-  tampilan khusus Anda:</p>
-
-<dl>
-<dt>
-{@code DecoratedCustomViewStyle()}</dt>
-<dd> Menata gaya pemberitahuan selain pemberitahuan
-media.</dd>
-<dt>
-{@code DecoratedMediaCustomViewStyle()}</dt>
-<dd> Menata gaya pemberitahuan media.</dd>
-</dl>
-
-<p>Untuk menggunakan API baru ini, panggil metode {@code setStyle()}, dengan meneruskan
-gaya tampilan khusus yang diinginkan padanya.</p>
-
-<p>Cuplikan ini menampilkan cara membuat objek pemberitahuan khusus dengan metode
-{@code DecoratedCustomViewStyle()}.</p>
-
-<pre>
-Notification notification = new Notification.Builder()
-           .setSmallIcon(R.drawable.ic_stat_player)
-           .setLargeIcon(albumArtBitmap))
-           .setCustomContentView(contentView);
-           .setStyle(new Notification.DecoratedCustomViewStyle())
-           .build();
-
-</pre>
-
-<h2 id="style">Gaya Perpesanan</h2>
-<p>
-  Android N memperkenalkan API baru untuk menyesuaikan gaya pemberitahuan.
-  Dengan menggunakan kelas <code>MessageStyle</code>, Anda bisa mengubah beberapa
-  label yang ditampilkan pada pemberitahuan, termasuk judul percakapan,
-  pesan tambahan, dan tampilan materi untuk pemberitahuannya.
-</p>
-
-<p>
-  Cuplikan kode berikut memperagakan cara menyesuaikan sebuah
-  gaya pemberitahuan menggunakan kelas <code>MessageStyle</code>.
-</p>
-
-<pre>
-  Notification notification = new Notification.Builder()
-             .setStyle(new Notification.MessagingStyle("Me")
-                 .setConversationTitle("Team lunch")
-                 .addMessage("Hi", timestamp1, null) // Pass in null for user.
-                 .addMessage("What's up?", timestamp2, "Coworker")
-                 .addMessage("Not much", timestamp3, null)
-                 .addMessage("How about lunch?", timestamp4, "Coworker"));
-</pre>
diff --git a/docs/html-intl/intl/ja/about/versions/nougat/android-7.0-testing.jd b/docs/html-intl/intl/ja/about/versions/nougat/android-7.0-testing.jd
deleted file mode 100644
index 9f03412..0000000
--- a/docs/html-intl/intl/ja/about/versions/nougat/android-7.0-testing.jd
+++ /dev/null
@@ -1,190 +0,0 @@
-page.title=テストガイド
-page.image=images/cards/card-n-guide_2x.png
-meta.tags="preview", "testing"
-page.tags="preview", "developer preview"
-
-@jd:body
-
-<div id="tb-wrapper">
-  <div id="tb">
-    <h2>このドキュメントの内容</h2>
-      <ol>
-        <li><a href="#runtime-permissions">パーミッションをテストする</a></li>
-        <li><a href="#doze-standby">Doze とアプリ スタンバイをテストする</a></li>
-        <li><a href="#ids">自動バックアップと端末識別子</a></li>
-      </ol>
-  </div>
-</div>
-
-<p>
-  Android N を利用すると、次期バージョンのプラットフォームでアプリが動作するか確認できます。
-このプレビューには、<a href="{@docRoot}preview/api-overview.html">API の概要</a>と<a href="{@docRoot}preview/behavior-changes.html">動作の変更点</a>に記載されているように、アプリに影響を与える可能性のある多くの API と動作の変更が含まれています。
-
-このプレビューでアプリをテストするときには、アプリの良好な使用感を確保するために、システムのいくつかの変更点に特に注意する必要があります。
-
-
-</p>
-
-<p>
-  このガイドでは、アプリでプレビューの機能の何をどのようにテストすればよいか説明します。以下のプレビュー機能は、アプリの動作に大きな影響を与える可能性があるので、優先してテストする必要があります。
-
-
-</p>
-
-<ul>
-  <li><a href="#runtime-permissions">パーミッション</a>
-  </li>
-  <li><a href="#doze-standby">Doze とアプリ スタンバイ</a>
-  </li>
-  <li><a href="#ids">自動バックアップと端末識別子</a></li>
-</ul>
-
-<p>
-  テスト用のプレビュー システム イメージを使用した端末または仮想端末のセットアップ方法の詳細については、<a href="{@docRoot}preview/setup-sdk.html">Android N SDK のセットアップ</a>をご覧ください。
-
-
-</p>
-
-
-<h2 id="runtime-permissions">パーミッションをテストする</h2>
-
-<p>
-  <a href="{@docRoot}preview/features/runtime-permissions.html">パーミッション</a> モデルの変更により、ユーザーがアプリにパーミッションを付与する方法が変わりました。
-アプリでは、インストール時にすべてのパーミッションを要求するのではなく、実行時に個々のパーミッションをユーザーに要求する必要があります。
-
-これにより、ユーザーは、各アプリのアクティビティをより細かくコントロールできるようになるだけではなく、アプリが各パーミッションを要求する理由をこれまでよりもよく理解できるようになります。
-ユーザーは、いつでもアプリに個別にパーミッションを付与したり、付与したパーミッションを個別に取り消したりできます。
-プレビューのこの機能は、アプリの動作に大きな影響を与える可能性があり、アプリの一部の機能が動作しなくなったり、限定された機能しか使えなくなったりする可能性もあります。
-
-
-</p>
-
-<p class="caution">
-  この変更は、アプリがこの新しいバージョンを対象にしているかどうかにかかわらず、この新しいプラットフォーム上で実行されるすべてのアプリに影響します。
-このプラットフォームは以前のアプリに限定的な互換動作を提供しますが、公式版のプラットフォームのリリースに合わせてアップデート版のアプリを公開できるように、新しいパーミッション モデルに対応させるためのアプリの移行を今から計画することを強くお勧めします。
-
-
-</p>
-
-
-<h3 id="permission-test-tips">テストのヒント</h3>
-
-<p>
-  以下のテストのヒントを活用して、アプリでの新しいパーミッション動作のテストを計画し、実行してください。
-
-</p>
-
-<ul>
-  <li>アプリの現在のパーミッションと関連するコードパスを確認します。</li>
-  <li>パーミッションで保護されているサービスとデータ間のユーザーフローをテストします。</li>
-  <li>付与されたパーミッションと取り消されたパーミッションのさまざまな組み合わせをテストします。</li>
-  <li>{@code adb} ツールを使用して、コマンドラインからパーミッションを管理します。
-    <ul>
-      <li>パーミッションとステータスをグループ化して表示します。
-        <pre>adb shell pm list permissions -d -g</pre>
-      </li>
-      <li>以下の構文を使用して 1 つまたは複数のパーミッションを付与または取り消します。<br>
-        <pre>adb shell pm [grant|revoke] &lt;permission.name&gt; ...</pre>
-      </li>
-    </ul>
-  </li>
-  <li>アプリでパーミッションを使用しているサービスを分析します。</li>
-</ul>
-
-<h3 id="permission-test-strategy">テスト方針</h3>
-
-<p>
-  このパーミッションの変化は、アプリの構造と設計、ユーザー エクスペリエンスとフローに影響を与えます。
-アプリの現在のパーミッション利用の状況を調査し、新しいフローの検討を開始する必要があります。
-このプラットフォームの公式リリースは互換動作を提供しますが、互換動作に頼ることなくアプリのアップデートを計画することを強くお勧めします。
-
-
-</p>
-
-<p>
-  まずアプリが実際に必要とし使用しているパーミッションを特定してから、パーミッションで保護されたサービスを使用している各コードパスを探してください。
-これには、新しいプラットフォーム上でのテストと、コードの解析が必要です。
-テストでは、アプリの {@code targetSdkVersion} をこのプレビュー版に変えて、ランタイム パーミッションのオプトインに重点的にテストする必要があります。
-詳細については、<a href="{@docRoot}preview/setup-sdk.html#">Android N SDK のセットアップ</a>をご覧ください。
-
-
-</p>
-
-<p>
-  パーミッションの取り消しと追加のさまざまな組み合わせをテストし、パーミッションに依存するユーザーフローを確認します。
-パーミッションへの依存性が明白または論理的ではない箇所では、依存性を取り除くため、またはパーミッションが必要な理由を明白にするために、フローのリファクタリングまたはコンパートメント化を検討する必要があります。
-
-
-</p>
-
-<p>
-  ランタイム パーミッションの動作、テスト、ベスト プラクティスについては、Developer Preview ページの<a href="{@docRoot}preview/features/runtime-permissions.html">パーミッション</a>をご覧ください。
-
-
-</p>
-
-
-<h2 id="doze-standby">Doze とアプリ スタンバイをテストする</h2>
-
-<p>
-  省電力機能である Doze とアプリ スタンバイにより、端末がアイドル状態のときやそのアプリにフォーカスがないときに、アプリが実行できるバックグラウンド処理の量が制限されます。
-システムによってアプリに加えられる可能性のある制限には、ネットワーク アクセスの制限や停止、バックグラウンド タスクの停止、通知の停止、ウェイク リクエストの無視、アラームなどがあります。
-
-これらの省電力のための最適化が行われた状態で確実にアプリが適切に動作するように、これらの省電力状態をシミュレートしてアプリをテストする必要があります。
-
-
-</p>
-
-<h4 id="doze">アプリで Doze をテストする</h4>
-
-<p>アプリで Doze をテストするには: </p>
-
-<ol>
-<li>Android N のシステム イメージを使用して、ハードウェア端末または仮想端末を設定します。</li>
-<li>端末を開発マシンに接続し、アプリをインストールします。</li>
-<li>アプリを実行し、アクティブ状態のままにします。</li>
-<li>以下のコマンドを実行して、端末の Doze モードへの移行をシミュレートします。
-
-<pre>
-$ adb shell dumpsys battery unplug
-$ adb shell dumpsys deviceidle step
-$ adb shell dumpsys deviceidle -h
-</pre>
-
-  </li>
-  <li>端末がアクティブ状態に戻ったときのアプリの動作を観察します。端末が Doze モードから抜けるときに、アプリがスムーズに復帰することを確認します。
-</li>
-</ol>
-
-
-<h4 id="standby">アプリでアプリ スタンバイをテストする</h4>
-
-<p>アプリでアプリ スタンバイ モードをテストするには: </p>
-
-<ol>
-  <li>Android N のシステム イメージを使用して、ハードウェア端末または仮想端末を設定します。</li>
-  <li>端末を開発マシンに接続し、アプリをインストールします。</li>
-  <li>アプリを実行し、アクティブ状態のままにします。</li>
-  <li>以下のコマンドを実行して、アプリのスタンバイ モードへの移行をシミュレートします。
-
-<pre>
-$ adb shell am broadcast -a android.os.action.DISCHARGING
-$ adb shell am set-idle &lt;packageName&gt; true
-</pre>
-
-  </li>
-  <li>以下のコマンドを使用して、アプリのウェイクをシミュレートします。
-    <pre>$ adb shell am set-idle &lt;packageName&gt; false</pre>
-  </li>
-  <li>アプリがウェイク状態に戻ったときのアプリの動作を観察します。アプリがスタンバイ モードからスムーズに復帰することを確認します。
-特に、アプリの通知とバックグラウンド ジョブが想定通りの動作を続けているかを確認する必要があります。
-</li>
-</ol>
-
-<h2 id="ids">アプリの自動バックアップと端末固有識別子</h2>
-
-<p>アプリが、Google Cloud Messaging の登録 ID などのなんらかの端末固有の識別子を内部ストレージに保持している場合、<a href="{@docRoot}preview/backup/index.html">アプリの自動バックアップ</a>の説明に従って、そのストレージのロケーションを自動バックアップの対象から除外してください。
-
-
-
- </p>
diff --git a/docs/html-intl/intl/ja/about/versions/nougat/index.jd b/docs/html-intl/intl/ja/about/versions/nougat/index.jd
index 774e065..5881cf6 100644
--- a/docs/html-intl/intl/ja/about/versions/nougat/index.jd
+++ b/docs/html-intl/intl/ja/about/versions/nougat/index.jd
@@ -1,6 +1,6 @@
-page.title=Android N Developer Preview
-page.tags="preview","developer"
-meta.tags="preview", "android"
+page.title=Android 7.0 Nougat
+page.tags="androidn","versions"
+meta.tags="android n", "nougat", "android 7.0"
 fullpage=true
 forcelocalnav=true
 header.hide=1
@@ -17,66 +17,61 @@
   })
 </script>
 
-<section class="dac-expand dac-hero dac-light" style="background-color:#B2DFDB">
+<section class="dac-expand dac-hero dac-light">
   <div class="wrap" style="max-width:1100px;margin-top:0">
+  <a href="{@docRoot}about/versions/nougat/android-7.0.html">
     <div class="cols dac-hero-content" style="padding-bottom:1em;">
 
-      <div class="col-7of16 col-push-9of16" style="padding-left:2em">
-        <h1 class="dac-hero-title">Android N Developer Preview</h1>
+      <div class="col-7of16 col-push-8of16" style="padding-left:2em">
+        <h1 class="dac-hero-title">Android 7.0 Nougat</h1>
         <p class="dac-hero-description">
-          Android N が正式リリースされる前に、
+          Android Nougat が正式リリースされる前に、
           Nexus や他の端末で事前に<strong>アプリの動作をご確認いただけます</strong>。新しいシステム動作をサポートして、<strong>電力やメモリの使用量を削減しましょう</strong>。
 
           <strong>マルチ ウィンドウ UI</strong> や<strong>ダイレクト リプライ通知</strong>などの機能も利用して、アプリを拡張してみてください。
 
         </p>
 
-        <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+        <a class="dac-hero-cta" href="{@docRoot}about/versions/nougat/android-7.0.html">
           <span class="dac-sprite dac-auto-chevron"></span>
-          スタートガイド</a>
-<!--<br>
-        <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
-          Update to Android N (final SDK)
-        </a><br>-->
+          スタートガイド
+        </a>
       </div>
-      <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
-        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png" srcset="{@docRoot}images/home/n-preview-hero.png 1x,
-             {@docRoot}images/home/n-preview-hero_2x.png 2x">
+      <div class="col-7of16 col-pull-6of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
+        <a  href="{@docRoot}about/versions/nougat/android-7.0.html">
+        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png"
+             srcset="{@docRoot}images/home/n-preview-hero.png 1x,
+             {@docRoot}images/home/n-preview-hero_2x.png 2x" />
+           </a>
       </div>
-    </div>
+    </div></a>
     <div class="dac-section dac-small">
       <div class="resource-widget resource-flow-layout col-16"
-           data-query="collection:preview/landing/resources"
+           data-query="collection:nougat/landing/resources"
            data-cardSizes="6x2"
-           data-maxResults="6"></div>
-    </div>
+           data-maxResults="3"></div>
+         </div>
   </div>
 </section>
 
+
 <div id="useUpdatedTemplates" style="display:none" class="dac-section dac-slim dac-gray dac-expand">
   <div class="wrap dac-offset-parent">
-    <a class="dac-fab dac-scroll-button" data-scroll-button href="#build-apps">
+    <a class="dac-fab dac-scroll-button" data-scroll-button href="#latest">
       <i class="dac-sprite dac-arrow-down-gray"></i>
     </a>
     <ul class="dac-actions">
       <li class="dac-action">
-        <a class="dac-action-link" href="https://developer.android.com/preview/bug">
+        <a class="dac-action-link" href="https://source.android.com/source/report-bugs.html">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
-          問題の報告</a>
-
-      </li>
-      <li class="dac-action">
-        <a class="dac-action-link" href="{@docRoot}preview/support.html">
-          <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
-          リリースノートの確認</a>
-
+          問題の報告
+        </a>
       </li>
       <li class="dac-action">
         <a class="dac-action-link" href="{@docRoot}preview/dev-community">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
-          開発者コミュニティに参加</a>
-
+          開発者コミュニティに参加
+        </a>
       </li>
     </ul>
   </div><!-- end .wrap -->
@@ -113,19 +108,33 @@
     data-initial-results="3"></div>
 </div></section>
 
-<section class="dac-section dac-gray"><div class="wrap">
-  <h1 class="dac-section-title">リソース</h1>
+<section class="dac-section dac-gray" id="videos"><div class="wrap">
+  <h1 class="dac-section-title">Videos</h1>
   <div class="dac-section-subtitle">
-    Android N 向けにアプリを開発する上で役立つ必須情報をご提供します。
+    New Android capabilities and the right way to use them in your apps.
   </div>
 
   <div class="resource-widget resource-flow-layout col-16"
-       data-query="collection:preview/landing/more"
+    data-query="collection:nougat/landing/videos/first,type:youtube+tag:androidn"
+    data-sortOrder="-timestamp"
+    data-cardSizes="6x6"
+    data-items-per-page="6"
+    data-maxResults="15"
+    data-initial-results="3">
+  </div>
+</div></section>
+
+<section class="dac-section dac-light" id="resources"><div class="wrap">
+  <h1 class="dac-section-title">リソース</h1>
+  <div class="dac-section-subtitle">
+    Android Nougat 向けにアプリを開発する上で役立つ必須情報をご提供します。
+  </div>
+
+  <div class="resource-widget resource-flow-layout col-16"
+       data-query="collection:nougat/landing/more"
        data-cardSizes="6x6"
        data-items-per-page="6"
        data-maxResults="15"
        data-initial-results="6"></div>
-
   </div>
-</section>
-
+</section>
\ No newline at end of file
diff --git a/docs/html-intl/intl/ja/index.jd b/docs/html-intl/intl/ja/index.jd
index 755ec62..ba73c41 100644
--- a/docs/html-intl/intl/ja/index.jd
+++ b/docs/html-intl/intl/ja/index.jd
@@ -15,33 +15,30 @@
   })
 </script>
 
-<section class="dac-expand dac-hero dac-invert" style="background-color:#455A64">
-  <div class="wrap" style="max-width:1100px;margin-top:0">
-    <div class="col-7of16 col-push-9of16" style="padding-left:2em;">
-      <a href="{@docRoot}preview/index.html">
-        <h1 class="dac-hero-title">Android N Developer Preview</h1>
-        <p class="dac-hero-description">
-          Get ready for the next version of Android!
-          <strong>Test your apps</strong> on Nexus and other devices. Support new system
-          behaviors to <strong>save power and memory</strong>.
+<section class="dac-expand dac-hero" style="background-color:#b2dfdb;">
+  <div class="wrap" style="max-width:1000px;margin-top:0">
+    <div class="col-7of16 col-push-8of16">
+      <a href="{@docRoot}about/versions/nougat/index.html">
+        <h1 class="dac-hero-title" style="color:#004d40">Android 7.0 Nougat!</h1>
+        <p class="dac-hero-description" style="color:#004d40">
+          <strong>Android 7.0 Nougat is here!</strong>
+          Get your apps ready for the latest version of Android, with new system
+          behaviors to <strong>save battery and memory</strong>.
           Extend your apps with <strong>multi-window UI</strong>,
           <strong>direct reply notifications</strong> and more.
         </p>
-        <a class="dac-hero-cta" href="/preview/index.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
+        <a class="dac-hero-cta" href="{@docRoot}about/versions/nougat/index.html" style="color:#004d40">
+          <span class="dac-sprite dac-auto-chevron" style="background-color:#b2dfdb"></span>
           Learn more
-        </a><!--<br>
-        <a class="dac-hero-cta" href="/preview/support.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
-          Update to Developer Preview (final SDK)
-        </a><br>-->
+        </a>
+        </a>
       </a>
     </div>
-    <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:0em;padding-right:1.5em;">
-      <a href="{@docRoot}preview/index.html">
-        <img style="" class="dac-hero-image" src="/images/home/n-preview-hero.png"
-             srcset="/images/home/n-preview-hero.png 1x,
-             /images/home/n-preview-hero_2x.png 2x">
+    <div class="col-6of16 col-pull-6of16 dac-hero-figure" style="padding-left:1em;padding-top:1em;">
+      <a href="{@docRoot}about/versions/nougat/index.html">
+        <img class="dac-hero-image" src="{@docRoot}images/home/nougat_bg.jpg"
+             srcset="{@docRoot}images/home/nougat_bg.jpg 1x,
+             {@docRoot}images/home/nougat_bg_2x.jpg 2x">
         </a>
     </div>
   </div>
diff --git a/docs/html-intl/intl/ja/preview/download_mp2.jd b/docs/html-intl/intl/ja/preview/download_mp2.jd
deleted file mode 100644
index 67b1bc4..0000000
--- a/docs/html-intl/intl/ja/preview/download_mp2.jd
+++ /dev/null
@@ -1,359 +0,0 @@
-page.title=ダウンロード
-page.image=images/cards/card-download_16-9_2x.png
-
-@jd:body
-
-<div style="position:relative; min-height:600px">
-
-  <div class="wrap" id="tos" style="position:absolute;display:none;width:inherit;">
-
-    <p class="sdk-terms-intro">Android Preview SDK のコンポーネントをダウンロード、インストールする前に、次の利用規約に同意する必要があります。
-</p>
-
-    <h2 class="norule">利用規約</h2>
-
-    <div class="sdk-terms" onfocus="this.blur()" style="width:678px">
-以下は、Android SDK Preview の使用許諾契約です(以下「本契約」)。
-
-1.はじめに
-
-1.1 Android SDK Preview(以下、本契約で「Preview」という。具体的には利用可能な場合には Android システム ファイル、パッケージ型 API、Preview ライブラリ ファイルを含む)は、本契約の規定に従ってライセンス許可されます。本契約では、デベロッパーの Preview の使用に関して、デベロッパーと Google の間で法的拘束力のある契約を結びます。
-
-1.2 「Android」とは、Android オープン ソース プロジェクト(http://source.android.com/ にて随時更新)にて利用可能な、端末向けの Android ソフトウェア スタックを意味します。
-
-1.3 「Google」とは、1600 Amphitheatre Parkway, Mountain View, CA 94043, United States に主たる事業所を有するデラウェア州法人である Google Inc. を意味します。
-
-2.本契約の同意
-
-2.1 Preview を使用するには、まず本契約に同意する必要があります。本契約に同意しない場合は Preview を使用できません。
-
-2.2 同意するかまたは Preview を使用するためにクリックすると、本契約に同意したことになります。
-
-2.3 米国またはその他の国(デベロッパーが居住している国かまたはデベロッパーが Preview を使用する国を含む)の法律により Preview の使用を禁止されている人である場合、Preview を使用することも、使用許諾契約に同意することもできません。
-
-2.4 雇用主またはその他の事業体を代表または代理して本契約に拘束されることに同意し Preview を企業または組織の内部で使用する場合、担当者の雇用主またはその他の事業体を本契約に法的に拘束する完全な法的権限を有していることを表明および保証するものとします。担当者が必要な権限を有していない場合は、担当者の雇用主またはその他の事業体を代表または代理して、本契約に同意することも、Preview を使用することもできません。
-
-3.Google Preview ライセンス
-
-3.1 本契約の規定に従い、Google は Android プラットフォーム上で実行するアプリケーションの開発に Preview を個人的にもしくは企業または組織の内部で使用するための、ロイヤリティ フリーな、譲渡不可で、非排他的な、サブライセンス不可の、限定された、取り消し可能なライセンスを付与するものとします。
-
-3.2 Preview に関するすべての法的権利、所有権、利益(Preview に含まれる知的財産権を含む)は Google またはサードパーティが所有するものとします。「知的財産権」とは、特許法、著作権法、営業秘密法、商標法、不当競争防止法に基づいて発生するすべての権利、およびその他のすべての所有権を意味します。デベロッパーに明示的に付与されていない権利は、すべて Google が所有します。
-
-3.3 本契約で明示的に許可されている目的以外においては、Preview を使用できません。当該のサードパーティのライセンスで必要とされる場合を除き、デベロッパーは、(a) Preview または Preview の一部をコピー(バックアップ目的を除く)、修正、改造、再配布、逆コンパイル、リバース エンジニアリング、逆アセンブルまたは派生物の作成、または(b)モバイル ハンドセットまたは個人用 PC 以外のハードウェア端末への Preview の読み込み、Preview と他のソフトウェアとの結合、または Preview の一部を組み込んだソフトウェアや端末の配布はできません。
-
-3.4 デベロッパーは、Android の断片化につながるような行為をしないことに同意します。これには、Preview から派生したソフトウェア開発キットの配布、作成への参加、宣伝を含みます(ただし必ずしもこれらには限定されません)。
-
-3.5 オープンソース ソフトウェア ライセンス下でライセンス付与された Preview のコンポーネントの使用、複製、配布は、本契約ではなく、そのオープンソース ソフトウェアのライセンスに準拠するものとします。デベロッパーは、許諾されるすべての権利下で、そのようなオープンソース ソフトウェア ライセンスに対して、優良ライセンシーのままでいることに同意し、そのような権利を終了、停止、または違反する可能性のあるいかなる行為も差し控えることに同意するものとします。
-
-3.6 デベロッパーは、Google が提供する Preview の形式および性質は事前の通知なしに変更される場合があり、今後リリースされる Preview のバージョンでは、以前のバージョンの Preview で開発されたアプリケーションとの互換性がない可能性があることに同意します。デベロッパーは、Google が事前の通知なく、Google の単独の裁量でデベロッパーまたはユーザーへの Preview(または Preview 内の一部の機能)の提供を(恒久的または一時的に)停止する場合があることに同意します。
-
-3.7 本契約のいかなる部分も、Google のいかなる商標名、商標、サービスマーク、ロゴ、ドメイン名、またはその他のブランド識別表示を使用する権利もデベロッパーに付与するものではありません。
-
-3.8 デベロッパーは、Preview に添付または収録されているすべての知的財産権に関する通知(著作権および商標の通知を含む)の削除、隠ぺい、改ざんを行わないことに同意します。
-
-4.デベロッパーによる Preview の使用
-
-4.1 Google は、本契約に基づき Preview を使用してデベロッパーが開発したソフトウェア アプリケーションに関して、デベロッパー(またはデベロッパーのライセンサー)からいかなる権利、所有権、または利益(当該アプリケーションに含まれる知的財産権を含む)も取得するものではないことに同意します。
-
-4.2 デベロッパーは、Preview を(a)本契約、および(b)該当する司法管轄区における適用される法律、規則、または一般に認められた慣行またはガイドライン(米国またはその他の該当国におけるデータまたはソフトウェアの輸出入に関する法律を含む)で認められている目的にのみ使用することに同意します。
-
-4.3 Preview を使用してアプリケーションを開発する場合、デベロッパーはユーザーのプライバシーおよび法的権利を保護することに同意します。ユーザーからデベロッパーにユーザー名、パスワード、またはその他のログイン情報または個人情報が提供される場合、デベロッパーは、情報がデベロッパーのアプリケーションに提供されることをユーザーに認識させ、当該ユーザーについてプライバシーに関する法的に十分な通知および保護を行わなければなりません。デベロッパーのアプリケーションに個人情報または秘密情報が保存される場合、この保存は保護された方法で行われなければなりません。ユーザーからデベロッパーのアプリケーションに Google アカウントの情報が提供された場合、デベロッパーのアプリケーションでは、ユーザーが許可したタイミングで、かつユーザーが許可した限定された目的にのみ、当該情報を使用してユーザーの Google アカウントにアクセスすることが認められるものとします。
-
-4.4 デベロッパーは、Preview に関して、第三者(Google、およびあらゆる携帯電話会社を含むが、これらに限定されない)のサーバー、ネットワーク、またはその他の財産またはサービスへの妨害、中断、損害、または許可されていない態様でのアクセスとなる行為(そのような行為に該当する対象製品の開発または販売 / 配布を含む)に関与しないことに同意します。
-
-4.5 デベロッパーは、デベロッパーが Android および Android のアプリケーションを介して作成、送信、表示するデータ、コンテンツ、リソース、および自身の行為の結果(Google に発生する可能性のあるあらゆる損失および損害を含む)について、自身が単独で責任を負うこと(および Google がこれについてデベロッパーまたはいかなる第三者に対しても一切責任を負わないこと)に同意します。
-
-4.6 デベロッパーは、本契約、適用される第三者の契約もしくは利用規約、または適用される法律もしくは規則に基づく自身の義務に違反したこと、および当該違反の結果(Google または第三者に発生したあらゆる損失および損害を含む)について、自身が単独で責任を負うこと(および Google がこれについてデベロッパーまたはいかなる第三者に対しても一切責任を負わないこと)に同意します。
-
-4.7 Preview は開発中であり、デベロッパーによるテスティングやフィードバックは開発プロセスの重要な一部となります。デベロッパーは、Preview の使用により、一部の機能の実装が開発中であると認識し、Preview が安定したリリースの完全な機能性を持つことに依存すべきでないことを認識するものとします。本 Preview は、公式の Android SDK のリリース後はサポート対象でなくなるため、デベロッパーは、Preview を使用するいかなるアプリケーションも公然と配布または引き渡さないことに同意するものとします。
-
-5.デベロッパーの資格情報
-
-5.1 デベロッパーは、Google が発行した、またはデベロッパー自身で選択した、自身のデベロッパー用資格情報の秘密を保持する責任を負うこと、および自身のデベロッパー用資格情報のもとで開発されたすべてのアプリケーションについて単独で責任を負うことに同意します。
-
-6.プライバシーおよび情報
-
-6.1 Google は、Preview の継続的な技術革新と改良のために、ソフトウェアから特定の使用状況統計情報(一意識別子、関連する IP アドレス、ソフトウェアのバージョン番号、Preview のどのツール/サービスがどのように使用されているかに関する情報を含むが、これらに限定されない)を収集できます。この情報が収集される前に、Preview に通知が表示され、デベロッパーの同意が求められます。デベロッパーが同意しない場合は、情報は収集されません。
-
-6.2 収集されるデータは、Preview の改良のために集約された形で精査され、Google のプライバシー ポリシー(http://www.google.com/policies/privacy/)に従って管理されます。
-
-7.第三者のアプリケーション
-
-7.1 デベロッパーが、Preview を使用して第三者が開発したアプリケーションを実行する、あるいは第三者から提供されたデータ、コンテンツ、リソースにアクセスする場合、デベロッパーは、Google がそれらのアプリケーション、データ、コンテンツ、リソースについて責任を負わないことに同意します。デベロッパーは、そのような第三者のアプリケーションを介してアクセスするすべてのデータ、コンテンツ、リソースについては、それらを生成した者が単独で責任を負うものであり、Google はそれらの第三者のアプリケーション、データ、コンテンツ、またはリソースの使用もしくはアクセスによって生じたあらゆる損失および損害について一切責任を負わないことを理解します。
-
-7.2 デベロッパーは、そのような第三者のアプリケーションを介して表示されるデータ、コンテンツ、リソースは、提供者(あるいは代理の第三者または事業体)が所有する知的財産権で保護されている場合があることを認識するものとします。デベロッパーは、当該所有者からの明確な許可がない限り、それらのデータ、コンテンツ、リソース(全体または一部)の変更、貸与、賃貸、担保、配布または派生物の作成を行うことはできません。
-
-7.3 デベロッパーは、そのような第三者のアプリケーション、データ、コンテンツまたはリソースの使用が、デベロッパーと当該第三者間の別の規約に従うものであることを認識するものとします。
-
-8.Google API の使用
-
-8.1 Google API
-
-8.1.1 API を使用して Google からデータを取得する場合、デベロッパーは、そのデータは、Google またはデータを提供する事業体(あるいは代理の第三者または事業体)が所有する知的財産権で保護されている場合があることを認識するものとします。そのような API の使用は追加の利用規約に従うものとします。デベロッパーは、当該の利用規約による許可がない限り、そのデータ(全体または一部)の変更、貸与、賃貸、担保、配布または派生物の作成を行うことはできません。
-
-8.1.2 デベロッパーは、API を使用して Google からユーザーのデータを取得する場合、ユーザーが明示的に同意した場合のみ、およびユーザーが許可したタイミングとその目的にのみ、データを取得できることを理解し、同意します。
-
-9.本契約の終了
-
-9.1 本契約は、下記の規定に従ってデベロッパーまたは Google のいずれかによって解約されるまで、継続して適用されるものとします。
-
-9.2 デベロッパーが本契約の解約を希望する場合は、Preview および関連するデベロッパー資格情報の使用を停止することで、契約を終了するものとします。
-
-9.3 Google は、理由の有無にかかわらず、書面で通知することでいつでもデベロッパーとの本契約を解約することができます。
-
-9.4 本契約は事前の通知またはその他の措置なく、次のうち早い方に自動的に終了します。
-(A)Google が、デベロッパーが居住している国またはデベロッパーがサービスを使用する国での Preview または Preview の一部の配布を停止したとき。
-(B)Google が Android SDK の最終バージョンをリリースしたとき。
-
-9.5 本契約が終了すると、本契約で付与されていたライセンスは終了し、デベロッパーは速やかに Preview のすべての使用を停止するものとし、第 10 条、第 11 条、第 12 条、第 14 条の規定は無期限に効力を有するものとします。
-
-10.免責事項
-
-10.1 デベロッパーは、デベロッパーによる Preview の使用はデベロッパー自身の責任において行うものであること、および Preview は「現状有姿」かつ「提供可能な限りにおいて」、Google からのいかなる種類の保証もなく提供されるものであることを明示的に理解し、これに同意します。
-
-10.2 デベロッパーによる Preview および Preview の使用を通じてダウンロードまたはその他の方法で取得されたマテリアルの使用は、デベロッパー自身の裁量および責任において行うものであり、当該使用の結果として生じるデベロッパーのコンピュータ システムもしくはその他の端末への損害またはデータの喪失についての責任はデベロッパーが単独で負います。前述を制限することなく、Preview は安定したリリースではなく、コンピュータやその他の端末の利用の完全な回復不可能な損失を含む、重大な損害を引き起こす可能性のあるエラー、欠陥、およびセキュリティ上の脆弱性が含まれている可能性があることを理解します。
-
-10.3 Google はまた、商品性、特定目的への適合性、および権利侵害がないことの黙示的な保証および条件を含む(ただしこれらに限定されない)、明示的か黙示的かを問わずあらゆる種類のすべての保証および条件を明示的に否定します。
-
-11.責任の制限
-
-11.1 デベロッパーは、Google、その子会社および関連会社、ならびにそのライセンサーが、デベロッパーに発生した直接損害、間接損害、偶発的損害、特別損害、結果的損害、または懲罰的損害(データの喪失を含む)について、Google またはその代表者が当該損失が発生する可能性について告知されていたかどうか、または知っていたはずであるかどうかにかかわらず、いかなる責任法理のもとでもデベロッパーに対して責任を負わないことを明示的に理解し、これに同意します。
-
-12.補償
-
-12.1 法律で認められる最大限の範囲内において、デベロッパーは、(a)デベロッパーが Preview を使用したこと、および(b)デベロッパーが Preview で開発したアプリケーションが他者のいかなる知的財産権を侵害していること、または他者の名誉を毀損している、もしくは他者のパブリシティ権もしくはプライバシー権を侵害していること、および(c)デベロッパーが本契約に違反したことから発生したあらゆる申し立て、普通法上の訴訟、衡平法上の訴訟、または法的手続き、ならびにあらゆる損失、責任、損害、費用、および経費(合理的な弁護士報酬を含む)について、Google、その関連会社、ならびに当該各社の取締役、役員、従業員、代理人を防御し、補償し、免責することに同意します。
-
-13.契約の変更
-
-13.1 Google は、Preview の新しいバージョンを配布することにより、いつでも本契約を変更することができます。変更が生じた場合、Google は、Preview の提供ウェブサイト上に使用許諾契約の改訂版を公開します。
-
-14.法的一般条項
-
-14.1 本契約は、デベロッパーと Google の間の法的な合意のすべてを表し、デベロッパーによる Preview の使用(別の契約下で Google が提供するサービスを除く)に適用され、Preview に関するデベロッパーと Google の間のあらゆる事前の合意に完全に取って代わるものです。
-
-14.2 デベロッパーは、Google が本契約に定める(または適用される法律のもとで Google が享受できる)法的な権利または救済措置を行使または執行しなかった場合でも、Google の権利が正式に放棄されたとはみなされないこと、および Google が以後も引き続き当該権利および救済措置を行使または執行できることに同意します。
-
-14.3 本件について判断を下す管轄権を有する司法裁判所によって、本契約のいずれかの条項が無効と判断された場合、当該条項は、本契約の残りの部分に影響を与えることなく本契約から削除されるものとします。本契約の残りの条項は、以後も引き続き有効かつ執行可能であるものとします。
-
-14.4 デベロッパーは、Google が親会社となっている各グループ企業が、本契約の第三受益者となること、および当該企業が、当該企業に利益(または受益権)を付与する本契約の条項を直接執行する、また当該条項に依拠する権利を有することを了承し、これに同意します。上記以外のいかなる人または法人も、本契約の第三受益者とはならないものとします。
-
-14.5 輸出規制。Preview は、米国輸出管理法令の対象です。デベロッパーは、Preview に適用されるすべての国内および国際の輸出管理法令に従わなければなりません。これらの法律には、仕向け地、ユーザー、および最終用途に関する制限が含まれます。
-
-14.6 デベロッパーは、Google から事前に書面で承認を得ずに、本契約を譲渡または移転することはできません。また、そのような承認を得ずに計画された譲渡はすべて無効になります。デベロッパーは、Google から事前に書面で承認を得ずに、本契約に基づく自身の責任または義務を他者に委任してはなりません。
-
-14.7 本契約あるいは本契約に基づくデベロッパーと Google の関係から発生または関連するすべての申し立ては、米国カリフォルニア州の抵触法を除いて、カリフォルニア州法に準拠するものとします。デベロッパーおよび Google は、本契約あるいは本契約に基づくデベロッパーと Google の関係から発生または関連する法的事項の解決について、米国カリフォルニア州サンタクララ郡に所在の連邦裁判所または州立裁判所が専属管轄権を有することに合意します。上記にかかわらず、デベロッパーは、Google が任意の司法管轄区において差し止め命令による救済(または同等の緊急法的救済)を求める申し立てを行うことが認められることに同意します。
-  </div><!-- sdk terms -->
-
-
-
-    <div id="sdk-terms-form">
-      <p>
-        <input id="agree" type="checkbox" name="agree" value="1" onclick="onAgreeChecked()" />
-        <label id="agreeLabel" for="agree">上記の利用規約を読み、同意します。</label>
-      </p>
-      <p><a href="" class="button disabled" id="downloadForRealz" onclick="return onDownloadForRealz(this);"></a></p>
-    </div>
-
-
-  </div><!-- end TOS -->
-
-
-  <div id="landing">
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>本書の内容</h2>
-      <ol>
-        <li><a href="#sdk">Preview SDK</a></li>
-        <li><a href="#docs">デベロッパー ドキュメント</a></li>
-        <li><a href="#images">ハードウェアのシステム イメージ</a></li>
-      </ol>
-
-     <h2>Legacy downloads</h2>
-        <ol>
-           <li><a href="{@docRoot}preview/download_mp1.html">Developer Preview Archive</a></li>
-        </ol>
-  </div>
-</div>
-
-
-<p>
-  Android M Preview SDK には、アプリとプラットフォームの次期リリースで提供される新しい API とのテストに役立つ開発ツール、Android システム ファイル、ライブラリ ファイルが含まれています。
-このドキュメントでは、アプリのテスト用にダウンロードできる Preview のコンポーネントを入手する方法について説明します。
-
-</p>
-
-
-<h2 id="sdk">Preview SDK</h2>
-
-<p>
-  Preview SDK <a href="{@docRoot}tools/help/sdk-manager.html">Android SDK マネージャー</a>経由でダウンロードできます。Preview SDK のダウンロードと設定の詳細については、<a href="{@docRoot}preview/setup-sdk.html#downloadSdk">Set Up the Preview SDK</a> をご覧ください。
-
-</p>
-
-
-<h2 id="docs">デベロッパー ドキュメント</h2>
-
-<p>
-  デベロッパー ドキュメントのダウンロード パッケージでは、詳細な Preview の API リファレンス情報や API の比較レポートが提供されます。
-</p>
-
-<table>
-  <tr>
-    <th scope="col">Description</th>
-    <th scope="col">Download / Checksums</th>
-  </tr>
-  <tr id="docs-dl">
-    <td>Android M Preview 2<br>Developer Docs</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >m-preview-2-developer-docs.zip</a><br>
-      MD5: 1db6fff9c722b0339757e1cdf43663a8<br>
-      SHA-1: 5a4ae88d644e63824d21b0e18f8e3977a7665157
-    </td>
-  </tr>
-</table>
-
-<h2 id="images">ハードウェアのシステム イメージ</h2>
-
-<p>
-  これらのシステム イメージでは、テスト用に物理端末にプラットフォームのプレビュー バージョンをインストールできます。
-端末にこれらのイメージを 1 つ以上設定すると、アプリをインストールして、プラットフォームの次期バージョンでアプリがどのように動作するかをテストできます。
-端末にシステム イメージをインストールするプロセスでは、<em>端末からすべてのデータが削除</em>されるため、システム イメージのインストール前にデータをバックアップする必要があります。
-
-
-</p>
-
-<p class="warning">
-  <b>警告:</b> 次の Android システム イメージはプレビュー版であり、今後変更される可能性があります。デベロッパーによるシステム イメージの使用は、Android SDK Preview 使用許諾契約に準拠するものとします。
-Android Preview システム イメージは安定したリリースではなく、お使いのコンピュータ システム、端末、データに影響を与える可能性のあるエラーや欠陥が含まれている場合があります。
-
-プレビュー版の Android システム イメージは工場出荷版の OS と同等のテストを受けておらず、お使いの電話やインストールされているサービス、アンインストールの動作停止を引き起こす場合があります。
-
-
-</p>
-
-<table>
-  <tr>
-    <th scope="col">Device</th>
-    <th scope="col">Download / Checksums</th>
-  </tr>
-  <tr id="hammerhead">
-    <td>Nexus 5 (GSM/LTE) <br>"hammerhead"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >hammerhead-MPZ79M-preview-b1f4bde4.tgz</a><br>
-      MD5: 2ca9f18bf47a061b339bab52647ceb0d<br>
-      SHA-1: b1f4bde447eccbf8ce5d9b8b8ba954e3eac8e939
-    </td>
-  </tr>
-  <tr id="shamu">
-    <td>Nexus 6 <br>"shamu"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >shamu-MPZ79M-preview-e1024040.tgz</a><br>
-      MD5: 24a2118da340b9afedfbdfc026f6ff81<br>
-      SHA-1: e10240408859d5188c4aae140e1c539130ba614b
-    </td>
-  </tr>
-  <tr id="volantis">
-    <td>Nexus 9 <br>"volantis"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >volantis-MPZ79M-preview-9f305342.tgz</a><br>
-      MD5: 9edabf0a4c61b247f1cbb9dfdc0a899e<br>
-      SHA-1: 9f30534216f10899a6a75495fc7e92408ea333a7
-    </td>
-  </tr>
-
-  <tr id="fugu">
-    <td>Nexus Player <br>"fugu"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >fugu-MPZ79N-preview-fb63af98.tgz</a><br>
-      MD5: e8d081137a20b66df595ee69523314b5<br>
-      SHA-1: fb63af98302dd97be8de9313734d389ccdcce250
-    </td>
-  </tr>
-
-</table>
-
-<h3 id="install-image">端末にイメージをインストールする</h3>
-
-<p>
-  テスト用に端末イメージを使用するには、互換性のある端末にインストールする必要があります。次の手順に従って、システム イメージをインストールします。
-
-</p>
-
-<ol>
-  <li>この一覧の中からいずれかのシステム イメージ パッケージをダウンロードして、解凍します。</li>
-  <li>保持するデータを端末からバックアップします。</li>
-  <li>
-<a href="https://developers.google.com/android/nexus/images#instructions">developers.google.com/android</a>
- の手順に従って端末にイメージをフラッシュします。</li>
-</ol>
-
-<p class="note">
-  <strong>注:</strong> 開発用端末に Preview のシステム イメージをフラッシュすると、OTA アップデートを通じて次のプレビュー リリースに自動的にアップグレードされます。
-
-</p>
-
-<h3 id="revertDevice">端末を工場出荷時の仕様に戻す</h3>
-
-<p>
-  Preview をアンインストールして、工場出荷時の仕様に戻すには、
-<a href="http://developers.google.com/android/nexus/images">developers.google.com/android</a> にアクセス
-して、端末にフラッシュするイメージをダウンロードします。同じページの手順に従って端末にイメージをフラッシュします。
-
-</p>
-
-  </div><!-- landing -->
-
-</div><!-- relative wrapper -->
-
-
-
-<script>
-  var urlRoot = "http://storage.googleapis.com/androiddevelopers/shareables/preview/";
-  function onDownload(link) {
-
-    $("#downloadForRealz").html("Download " + $(link).text());
-    $("#downloadForRealz").attr('href', urlRoot + $(link).text());
-
-    $("#tos").fadeIn('fast');
-    $("#landing").fadeOut('fast');
-
-    return true;
-  }
-
-
-  function onAgreeChecked() {
-    /* verify that the TOS is agreed */
-    if ($("input#agree").is(":checked")) {
-      /* reveal the download button */
-      $("a#downloadForRealz").removeClass('disabled');
-    } else {
-      $("a#downloadForRealz").addClass('disabled');
-    }
-  }
-
-  function onDownloadForRealz(link) {
-    if ($("input#agree").is(':checked')) {
-    /*
-      $("#tos").fadeOut('fast');
-      $("#landing").fadeIn('fast');
-    */
-
-      ga('send', 'event', 'M Preview', 'System Image', $("#downloadForRealz").html());
-
-    /*
-      location.hash = "";
-    */
-      return true;
-    } else {
-      return false;
-    }
-  }
-
-  $(window).hashchange( function(){
-    if (location.hash == "") {
-      location.reload();
-    }
-  });
-
-</script>
diff --git a/docs/html-intl/intl/ja/preview/features/background-optimization.jd b/docs/html-intl/intl/ja/preview/features/background-optimization.jd
deleted file mode 100644
index 04921c7..0000000
--- a/docs/html-intl/intl/ja/preview/features/background-optimization.jd
+++ /dev/null
@@ -1,391 +0,0 @@
-page.title=バックグラウンド処理の最適化
-page.metaDescription=暗黙的なブロードキャストに対する新しい制限。
-page.keywords="android N", "implicit broadcasts", "job scheduler"
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>
-      このドキュメントの内容
-    </h2>
-
-    <ol>
-      <li>
-        <a href="#connectivity-action">CONNECTIVITY_ACTION に対する制限</a>
-      </li>
-
-      <li>
-        <a href="#sched-jobs">従量制ではない接続でネットワーク ジョブをスケジュールする</a>
-
-      </li>
-
-      <li>
-        <a href="#monitor-conn">アプリを実行しているときにネットワーク接続を監視する</a>
-
-      </li>
-
-      <li>
-        <a href="#media-broadcasts">NEW_PICTURE と NEW_VIDEO に対する制限</a>
-
-      </li>
-
-      <li>
-        <a href="#new-jobinfo">新しい JobInfo メソッド</a>
-      </li>
-
-      <li>
-        <a href="#new-jobparam">新しい JobParameter メソッド</a>
-      </li>
-
-      <li>
-        <a href="#further-optimization">アプリをさらに最適化する</a>
-      </li>
-    </ol>
-  </div>
-</div>
-
-<p>
-  バックグラウンド処理が多くのメモリと電池を消費する場合があります。たとえば、多くのバックグラウンド処理が暗黙的なブロードキャストをリッスンするように登録されていますが、バックグラウンド処理が有用でない場合でも、暗黙的なブロードキャストによりこれらの処理が開始されることがあります。
-
-バックグラウンド処理が端末のパフォーマンスとユーザー エクスペリエンスの両方に多大な影響を及ぼす可能性があります。
-
-</p>
-
-<p>
-  Android N では、こういった問題を緩和するために、以下の制限が適用されます。
-
-</p>
-
-<ul>
-  <li>プレビュー向けのアプリは、マニフェストで {@link
-  android.net.ConnectivityManager#CONNECTIVITY_ACTION} ブロードキャストの受信登録をしていても、このブロードキャストを受信しません。
-実行中のアプリは、{@link
-  android.content.Context#registerReceiver Context.registerReceiver()} で {@link android.content.BroadcastReceiver} を登録することにより、メインスレッドで {@code CONNECTIVITY_CHANGE} を引き続きリッスンできます。
-
-
-  </li>
-
-  <li>アプリは、{@link
-  android.hardware.Camera#ACTION_NEW_PICTURE} ブロードキャストまたは {@link
-  android.hardware.Camera#ACTION_NEW_VIDEO} ブロードキャストを送受信できません。この最適化は、プレビューをターゲットにしたアプリだけでなく、すべてのアプリに影響を及ぼします。
-
-  </li>
-</ul>
-
-<p>
-  アプリでこれらのインテントのいずれかを使用する場合は、Android N 端末を適切にターゲットにできるように、可能な限りインテントとの依存性を削除する必要があります。
-
-  Android フレームワークは、これらの暗黙的なブロードキャストの必要性を軽減するいくつかのソリューションを提供します。
-たとえば、{@link android.app.job.JobScheduler} と <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-{@code GcmNetworkManager}</a> は、従量制ではないネットワークへの接続など、指定条件が満たされたときに、ネットワーク操作をスケジュールするための堅牢なメカニズムを提供します。
-
-
-また、コンテンツ プロバイダの変更に対応するために、{@link android.app.job.JobScheduler} を使用することもできます。{@link android.app.job.JobInfo} オブジェクトは、{@link android.app.job.JobScheduler} がジョブをスケジュールするために使用するパラメータをカプセル化します。
-
-
-ジョブの条件が満たされると、システムはこのジョブをアプリの {@link android.app.job.JobService} で実行します。
-
-</p>
-
-<p>
-  このドキュメントでは、アプリをこれらの新しい制限に対応させるために、
-{@link android.app.job.JobScheduler} などの代替メソッドの使用法について説明します。
-
-</p>
-
-<h2 id="connectivity-action">
-  CONNECTIVITY_ACTION に対する制限
-</h2>
-
-<p>
-  Android N 向けのアプリは、マニフェストで {@link
-  android.net.ConnectivityManager#CONNECTIVITY_ACTION} ブロードキャストの受信登録をしていても、このブロードキャストを受信しません。また、このブロードキャストに依存している処理は開始されません。
-
-これにより、ネットワークの変更をリッスンするアプリ、または端末が従量制ではないネットワークに接続したときにネットワーク アクティビティをまとめて実行するアプリに問題が発生する可能性があります。
-
-Android フレームワークは、この制限を回避するためのいくつかのソリューションを備えていますが、アプリで実行するタスクに応じて、適切なソリューションを選択してください。
-
-
-</p>
-
-<p class="note">
-  <strong>注:</strong>
-{@link android.content.Context#registerReceiver Context.registerReceiver()} で登録された {@link android.content.BroadcastReceiver} は、アプリが実行中のときにこれらのブロードキャストを継続して受信します。
-
-</p>
-
-<h3 id="sched-jobs">
-  従量制ではない接続でネットワーク ジョブをスケジュールする
-</h3>
-
-<p>
-  {@link android.app.job.JobInfo} オブジェクトをビルドするために {@link android.app.job.JobInfo.Builder JobInfo.Builder} を使用するときは、{@link
-  android.app.job.JobInfo.Builder#setRequiredNetworkType
-  setRequiredNetworkType()} メソッドを適用し、{@link android.app.job.JobInfo
-  JobInfo.NETWORK_TYPE_UNMETERED} をジョブ パラメータとして渡します。
-次のコードサンプルは、端末が従量制ではないネットワークに接続し、充電しているときに実行するサービスをスケジュールします。
-
-
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-      (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo job = new JobInfo.Builder(
-    MY_BACKGROUND_JOB,
-    new ComponentName(context, MyJobService.class))
-      .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
-      .setRequiresCharging(true)
-      .build();
-  js.schedule(job);
-}
-</pre>
-
-<p>
-  ジョブの条件が満たされたとき、アプリはコールバックを受け取り、指定された {@code JobService.class} で {@link android.app.job.JobService#onStartJob onStartJob()} メソッドを実行します。
-
-{@link
-  android.app.job.JobScheduler} 実装の例については、<a href="{@docRoot}samples/JobScheduler/index.html">JobScheduler サンプルアプリ</a>をご覧ください。
-</p>
-
-<p>
-  GMSCore サービスを使用し、Android 5.0(API レベル 21)以前をターゲットにしているアプリは、<a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-{@code GcmNetworkManager}</a> を使用して {@code Task.NETWORK_STATE_UNMETERED} を指定できます。
-
-</p>
-
-<h3 id="monitor-conn">
-  アプリを実行しているときにネットワーク接続を監視する
-</h3>
-
-<p>
-  実行されているアプリは、登録された {@link android.content.BroadcastReceiver} を使用して {@code CONNECTIVITY_CHANGE} を引き続きリッスンできます。
-ただし、{@link
-  android.net.ConnectivityManager} API は、特定のネットワーク条件が満たされたときだけコールバックをリクエストするより堅牢なメソッドを提供します。
-
-</p>
-
-<p>
-  {@link android.net.NetworkRequest} オブジェクトは、{@link android.net.NetworkCapabilities} に応じてネットワーク コールバックのパラメータを定義します。
-{@link
-  android.net.NetworkRequest.Builder NetworkRequest.Builder} クラスを使って {@link android.net.NetworkRequest} オブジェクトを作成します。次に、{@link
-  android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,
-  android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()} は、{@link android.net.NetworkRequest} オブジェクトをシステムに渡します。
-
-ネットワーク条件が満たされると、アプリはコールバックを受け取り、{@link
-  android.net.ConnectivityManager.NetworkCallback} クラスで定義された {@link android.net.ConnectivityManager.NetworkCallback#onAvailable
-  onAvailable()} メソッドを実行します。
-
-
-</p>
-
-<p>
-  アプリは終了するか、{@link android.net.ConnectivityManager#unregisterNetworkCallback
-  unregisterNetworkCallback()} を呼び出すまで、コールバックを受信し続けます。
-
-</p>
-
-<h2 id="media-broadcasts">
-  NEW_PICTURE と NEW_VIDEO に対する制限
-</h2>
-
-<p>
-  Android N では、アプリは、{@link
-  android.hardware.Camera#ACTION_NEW_PICTURE} ブロードキャストまたは {@link
-  android.hardware.Camera#ACTION_NEW_VIDEO} ブロードキャストを送受信できません。この制限は、新しいイメージや動画を処理するためにいくつかのアプリを起動する必要があるときに、パフォーマンスとユーザー エクスペリエンスへの影響を軽減するのに役立ちます。
-
-Android N では、{@link android.app.job.JobInfo} と {@link
-  android.app.job.JobParameters} を拡張することにより、代わりのソリューションを提供しています。
-
-</p>
-
-<h3 id="new-jobinfo">
-  新しい JobInfo メソッド
-</h3>
-
-<p>
-  Android N では、コンテンツ URI の変更でジョブをトリガーするために、{@link android.app.job.JobInfo} API に次のメソッドが追加されています。
-
-</p>
-
-<dl>
-  <dt>
-    {@code JobInfo.TriggerContentUri()}
-  </dt>
-
-  <dd>
-    コンテンツ URI の変更でジョブをトリガーするために必要なパラメータをカプセル化します。
-  </dd>
-
-  <dt>
-    {@code JobInfo.Builder.addTriggerContentUri()}
-  </dt>
-
-  <dd>
-    {@code TriggerContentUri} オブジェクトを {@link
-    android.app.job.JobInfo} に渡します。{@link android.database.ContentObserver} は、カプセル化されたコンテンツ URI を監視します。
-ジョブに関連する複数の {@code
-    TriggerContentUri} オブジェクトがある場合、システムは、1 つのコンテンツ URI のみの変更を通知する場合でも、コールバックを提供します。
-
-  </dd>
-
-  <dd>
-    指定した URI の子孫のいずれかが変更された場合、ジョブをトリガーするために、{@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS} フラグを追加します。
-このフラグは、{@link
-    android.content.ContentResolver#registerContentObserver
-    registerContentObserver()} に渡される {@code notifyForDescendants} パラメータに相当します。
-
-  </dd>
-</dl>
-
-<p class="note">
-  <strong>注:</strong> {@code TriggerContentUri()} は、{@link android.app.job.JobInfo.Builder#setPeriodic
-  setPeriodic()} または {@link android.app.job.JobInfo.Builder#setPersisted
-  setPersisted()} と組み合わせて使うことはできません。
-コンテンツの変更を継続的に監視するには、アプリの {@link
-  android.app.job.JobService} が最新のコールバックの処理を完了する前に、新しい
-{@link android.app.job.JobInfo} をスケジュールします。
-</p>
-
-<p>
-  次のサンプルコードは、システムが変更をコンテンツ URI {@code MEDIA_URI} に通知するときにトリガーされるジョブをスケジュールします。
-
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-          (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo.Builder builder = new JobInfo.Builder(
-          MY_BACKGROUND_JOB,
-          new ComponentName(context, MediaContentJob.class));
-  builder.addTriggerContentUri(
-          new JobInfo.TriggerContentUri(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
-          JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
-  js.schedule(builder.build());
-}
-</pre>
-<p>
-  システムが特定のコンテンツ URI の変更を通知すると、アプリはコールバックを受け取り、{@link android.app.job.JobParameters} オブジェクトが {@code MediaContentJob.class} の {@link android.app.job.JobService#onStartJob onStartJob()} メソッドに渡されます。
-
-
-
-</p>
-
-<h3 id="new-jobparam">
-  新しい JobParameter メソッド
-</h3>
-
-<p>
-  また、Android N では、{@link android.app.job.JobParameters} が拡張され、ジョブをトリガーしたコンテンツ権限や URI についての有用な情報をアプリが受け取れるようになっています。
-
-
-</p>
-
-<dl>
-  <dt>
-    {@code Uri[] getTriggeredContentUris()}
-  </dt>
-
-  <dd>
-    ジョブをトリガーした URI の配列を返します。この配列は、ジョブをトリガーした URI がない場合(たとえば、期限切れ、またはその他の理由でジョブがトリガーされた場合)、または変更された URI の数が 50 を超える場合は、{@code
-    null} になります。
-
-
-  </dd>
-
-  <dt>
-    {@code String[] getTriggeredContentAuthorities()}
-  </dt>
-
-  <dd>
-    ジョブをトリガーしたコンテンツ権限の文字列配列を返します。
-    返された配列が {@code null} ではない場合、どの URI が変更されたかについて、詳細を取得するために {@code getTriggeredContentUris()} を使用します。
-
-  </dd>
-</dl>
-
-<p>
-  次のサンプルコードは、{@link
-  android.app.job.JobService#onStartJob JobService.onStartJob()} メソッドをオーバーライドし、ジョブを起動したコンテンツ権限と URI を記録します。
-
-</p>
-
-<pre>
-&#64;Override
-public boolean onStartJob(JobParameters params) {
-  StringBuilder sb = new StringBuilder();
-  sb.append("Media content has changed:\n");
-  if (params.getTriggeredContentAuthorities() != null) {
-      sb.append("Authorities: ");
-      boolean first = true;
-      for (String auth :
-          params.getTriggeredContentAuthorities()) {
-          if (first) {
-              first = false;
-          } else {
-             sb.append(", ");
-          }
-           sb.append(auth);
-      }
-      if (params.getTriggeredContentUris() != null) {
-          for (Uri uri : params.getTriggeredContentUris()) {
-              sb.append("\n");
-              sb.append(uri);
-          }
-      }
-  } else {
-      sb.append("(No content)");
-  }
-  Log.i(TAG, sb.toString());
-  return true;
-}
-</pre>
-
-<h2 id="further-optimization">
-  アプリをさらに最適化する
-</h2>
-
-<p>
-  アプリをメモリ不足の端末またはメモリ不足の状況で実行するために最適化すると、パフォーマンスとユーザー エクスペリエンスが向上します。
-バックグラウンド サービスと静的に登録された暗黙的なブロードキャスト レシーバーへの依存関係を削除すると、そのような端末上のアプリの動作が向上します。
-
-Android N では、これらの問題を削減するための措置が講じられていますが、これらのバックグラウンド処理をまったく使用せずに、アプリが実行されるように最適化することをお勧めします。
-
-
-
-</p>
-
-<p>
-  Android N には、それらのバックグラウンド処理を無効にした状態でアプリの動作をテストするために使用できるいくつかの <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge(ADB)</a>コマンドが追加されています。
-
-</p>
-
-<ul>
-  <li>暗黙的なブロードキャストとバックグラウンド サービスが利用できない状態をシミュレートするには、次のコマンドを入力します。
-
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set &lt;package&gt; RUN_IN_BACKGROUND ignore}
-</pre>
-  </li>
-
-  <li>暗黙的なブロードキャストとバックグラウンド サービスを再度有効にするには、次のコマンドを入力します。
-
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set &lt;package&gt; RUN_IN_BACKGROUND allow}
-</pre>
-  </li>
-</ul>
diff --git a/docs/html-intl/intl/ja/preview/features/icu4j-framework.jd b/docs/html-intl/intl/ja/preview/features/icu4j-framework.jd
deleted file mode 100644
index 6a25cec..0000000
--- a/docs/html-intl/intl/ja/preview/features/icu4j-framework.jd
+++ /dev/null
@@ -1,159 +0,0 @@
-page.title=ICU4J Android フレームワーク API
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>このドキュメントの内容:</h2>
-<ol>
-    <li><a href="#relation">ICU4J との関係</a></li>
-    <li><a href="#migration">ICU4J から android.icu API に移行する</a></li>
-    <li><a href="#licence">ライセンス</a></li>
-</ol>
-
-<h2>関連ドキュメント</h2>
-<ol>
-  <li>
-    <a class="external-link" href="http://userguide.icu-project.org">ICU4J のドキュメント</a>
-  </li>
-
-  <li>
-    <a class="external-link" href="http://site.icu-project.org/#TOC-What-is-ICU-">ICU4J でサポートされている最新の標準</a>
-
-  </li>
-</ol>
-</div>
-</div>
-
-<p>
-  ICU4J は幅広く使用されている、オープンソースの Java ライブラリのセットで、Unicode のほか、ソフトウェア アプリのグローバル化のサポートを提供しています。
-Android N では、アプリのデベロッパー向けの Android フレームワーク内で ICU4J API のサブセットを公開しており、{@code android.icu} パッケージ内で使用できます。
-
-これらの API は、端末上のローカライズ データを使用します。
-そのため、ICU4J ライブラリを APK にコンパイルせず、フレームワーク内にあるライブラリを呼び出せばよいので、APK のフットプリントを削減できます
-
-(この場合、Android N より前のバージョンの Android を実行しているユーザーも、ICU4J ライブラリを含むバージョンのアプリをダウンロードできるようにするには、<a href="{@docRoot}google/play/publishing/multiple-apks.html">APK を複数のバージョン</a>用意する必要があります)。
-
-
-
-</p>
-
-<p>
-  ここではまず、これらのライブラリをサポートするために必要な最低限の Android API レベルについて基本的な情報を説明します。
-次に、Android 固有の ICU4J の実装に必要な情報を説明します。
-最後に、Android フレームワーク内で ICU4J API を使用する方法について説明します。
-
-</p>
-
-<h2 id="relation">ICU4J との関係</h2>
-
-<p>
-  Android N では、<code>com.ibm.icu</code> ではなく
-<code>android.icu</code> パッケージを介して ICU4J API のサブセットを公開しています。Android フレームワークでは、さまざまな理由により ICU4J API を公開しないという選択も考えられます。たとえば、Android N で廃止された API を公開しないため、または ICU チームからまだ安定版の発表がないため、などの理由があります。
-
-
-
-ICU チームが今後 API を廃止した場合、Android でも廃止と見なすことになりますが、引き続きそれらの API を含める予定です。
-
-</p>
-
-<p class="table-caption"><strong>表 1.</strong> Android N で使用される ICU および CLDR のバージョン
-</p>
-<table>
-<tr>
-<th>Android API レベル</th>
-<th>ICU バージョン</th>
-<th>CLDR バージョン</th>
-</tr>
-<tr>
-<td>Android N</td>
-<td>56</td>
-<td>28</td>
-</tr>
-</table>
-
-<p>いくつか注意事項があります。</p>
-
-<ul>
-<li>ICU4J Android フレームワーク API には、すべての ICU4J API が含まれているわけではありません。</li>
-<li>NDK デベロッパーは、Android ICU4C がサポートされていない点にご注意ください。</li>
-<li>Android フレームワーク内の API は、Android の<a href="{@docRoot}guide/topics/resources/localization.html">リソースを使用したローカライズ</a>に対するサポートに代わるものではありません。
-
-</li>
-</ul>
-
-<h2 id="migration">com.ibm.icu から android.icu パッケージに移行する</h2>
-
-<p>
-  アプリ内で既に ICU4J API を使用しており、
-<code>android.icu</code> API がその要件を満たしている場合、このフレームワーク API に移行するには、Java のインポートを <code>com.ibm.icu</code> から <code>android.icu</code> に変更します。
-
-次に、APK から ICU4J ファイルのコピーを削除します。
-
-</p>
-
-<p class="note">
-  <b>注</b>:ICU4J フレームワーク API では、名前空間に {@code com.ibm.icu} ではなく{@code android.icu} を使用します。
-これは、独自の {@code com.ibm.icu} ライブラリを含む APK で名前空間が競合しないようにするためです。
-
-</p>
-
-<h3 id="migrate-from-android">
-  その他の Android SDK API から android.icu API に移行する
-</h3>
-
-<p>
-  <code>java</code> および <code>android</code> パッケージには、ICU4J にあるクラスと同等のクラスが一部含まれています。
-しかし多くの場合、ICU4J では、より幅広い標準と言語のサポートを提供しています。
-
-</p>
-<p>次に、すぐに利用できる例をいくつか示します。</p>
-<table>
-<tr>
-<th>クラス</th>
-<th>代替クラス</th>
-</tr>
-<tr>
-<td><code>java.lang.Character</code> </td>
-<td><code>android.icu.lang.UCharacter</code> </td>
-</tr>
-<tr>
-<td><code>java.text.BreakIterator</code> </td>
-<td><code>android.icu.text.BreakIterator</code> </td>
-</tr>
-<tr>
-<td><code>java.text.DecimalFormat</code> </td>
-<td><code>android.icu.text.DecimalFormat</code> </td>
-</tr>
-<tr>
-<td><code>java.util.Calendar</code></td>
-<td>
-<code>android.icu.util.Calendar</code></td>
-</tr>
-<tr>
-<td><code>android.text.BidiFormatter</code>
- </td>
-<td><code>android.icu.text.Bidi</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateFormat</code>
- </td>
-<td><code>android.icu.text.DateFormat</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateUtils</code> </td>
-<td><code>android.icu.text.DateFormat</code>
-<code>android.icu.text.RelativeDateTimeFormatter</code>
-</td>
-</tr>
-</table>
-
-<h2 id="licence">ライセンス</h2>
-
-<p>
-  ICU4J は ICU ライセンスでリリースされています。詳細については、<a class="external-link" href="http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-">ICU ユーザーガイド</a>をご覧ください。
-
-</p>
diff --git a/docs/html-intl/intl/ja/preview/features/multilingual-support.jd b/docs/html-intl/intl/ja/preview/features/multilingual-support.jd
deleted file mode 100644
index 44686d2..0000000
--- a/docs/html-intl/intl/ja/preview/features/multilingual-support.jd
+++ /dev/null
@@ -1,221 +0,0 @@
-page.title=言語とロケール
-page.tags=androidn
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>このドキュメントの内容:</h2>
-<ol>
-	  <li><a href="#preN">言語リソースの解決における課題</a></li>
-    <li><a href="#postN">リソース解決方針の改善</a></li>
-    <li><a href="#design">追加のロケールをサポートするためのアプリ設計
-</a></li>
-
-</ol>
-
-</div>
-</div>
-
-<p>Android N では、複数言語のユーザーのサポートが強化されており、設定で複数のロケールを選択できます。
-Android N ではこの機能を提供するために、サポート対象のロケール数を大幅に拡大し、システムがリソースを解決する方法を変更しました。
-
-この新しいリソース解決方法は、より堅牢で、既存の APK との互換性を保つよう設計されていますが、予想外の動作には十分に注意してください。
-
-たとえば、アプリで目的の言語がデフォルトに設定されているかをテストする必要があります。
-また、アプリで複数の言語をサポートする場合、そのサポートが意図したとおりに機能するかを確かめてください。
-
-最後に、明示的にサポートを設計していない言語については、アプリで適切に処理する必要があります。
-</p>
-
-<p>このドキュメントでは最初に、Android N より前のバージョンのリソース解決方針について説明します。次に、Android N の改善されたリソース解決方針について説明します。
-
-最後に、増大したロケールを活用し、より多くの複数言語ユーザーをサポートする方法について説明します。
-</p>
-
-<h2 id="preN">言語リソースの解決における課題</h2>
-
-<p>Android N より前のバージョンの Android では、アプリとシステムのロケールを一致させることができない場合がありました。
-</p>
-
- <p>たとえば、以下の状況を想定します。</p>
- <ul>
- <li>アプリのデフォルトの言語が {@code en_US}(米国英語)で、{@code es_ES} リソース ファイルでスペイン語の文字列もローカライズされています。
-
-</li>
- <li> 端末は {@code es_MX} に設定されています。 </li>
-
-<p>Java コードが文字列を参照するときに、アプリでスペイン語のリソースが {@code es_ES} でローカライズされている場合でも、システムではデフォルト({@code en_US})リソース ファイルから文字列が読み込まれます。
-
-これは、システムで完全一致が見つからない場合に、ロケールから国コードを削除して引き続きリソースを探すためです。
-
-最後に、一致が見つからない場合は、デフォルトである {@code en_US} にフォールバックされます。
- </p>
-
-
-<p>ユーザーがアプリでまったくサポートされていないフランス語などを選択した場合にも、システムはデフォルトの {@code en_US} を読み込みます。
-次に例を示します。</p>
-
-<p class="table-caption" id="t-resource-res">
-<strong>表 1.</strong> ロケールの完全一致がない場合のリソース解決
-</p>
-<table>
-<tbody>
-<tr>
-<th>ユーザー設定</th>
-<th>アプリのリソース</th>
-<th>リソース解決</th>
-</tr>
-<tr>
-<td>fr_CH</td>
-<td>
-デフォルト(en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
- <td>
-fr_CH を試行 =&gt; 失敗<br>
-fr を試行 =&gt; 失敗<br>
-デフォルト(en)を使用
-</td>
- </tr>
- </tbody>
-</table>
-
-
-<p>この例では、システムはユーザーが英語を理解できるかどうかを認識せず、英語の文字列を表示します。
-この動作は現在、ごく一般的です。
-Android N では、このような状況が大幅に削減されるはずです。
-</p>
-
-<h2 id="postN">リソース解決方針の改善</h2>
-<p>Android N は、より堅牢なリソース解決を導入しており、自動的に適切な代替言語を見つけます。
-ただし、解決を迅速化し保守性を向上させるには、最も一般的な親言語でリソースを保存する必要があります。
-
- たとえば、これまで {@code es-US} ディレクトリにスペイン語のリソースを保存していた場合、{@code es-419} ディレクトリに移動します。ここには、ラテンアメリカのスペイン語が格納されます。
-
- 同様に {@code en-GB} という名前のフォルダにリソースを保存している場合、そのフォルダの名前を {@code en-001}(国際英語)に変更します。<code>en-GB</code> 文字列の最も一般的な親言語は {@code en-001} であるためです。
-
-
- 次の例では、このような対応がリソース解決のパフォーマンスと信頼性を向上する根拠について説明します。
-</p>
-
-<h3>リソース解決の例</h3>
-
-<p>Android N では、<strong>表 1</strong> で説明した例の解決方法が異なります。
-</p>
-
-<p class="table-caption" id="t-improved-res">
-<strong>表 2.</strong> ロケールの完全一致が存在しない場合の改善された解決方針
-</p>
-<table>
-<tr>
-<th>ユーザー設定</th>
-<th>アプリのリソース</th>
-<th>リソース解決</th>
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-</ol>
-</td>
-<td>
-デフォルト(en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
-<td>
-fr_CH を試行 =&gt; 失敗<br>
-fr を試行 =&gt; 失敗<br>
-fr の子言語を試行 =&gt; fr_FR<br>
-fr_FR を使用
-</td>
-</tr>
-
-</table>
-
-
-<p>これで、ユーザーは英語ではなくフランス語のリソースを利用できます。この例は、フランス語の文字列を Android N の {@code fr_FR} ではなく {@code fr} に保存すべき理由も示しています。これが、最も近い親言語と一致させ、迅速に解決し、予測しやすくするための対策になります。
-
-
-</p>
-
-<p>この改善された解決ロジックに加えて、Android では、選択できるユーザー言語を増やしました。
-もう一度上記の例で説明します。今回は、追加のユーザー言語としてイタリア語が指定され、アプリはフランス語をサポートしていません。
-  </p>
-
-<p class="table-caption" id="t-2d-choice">
-<strong>表 3.</strong> アプリがユーザーの 2 番目に優先されるロケール設定のみと一致する場合のリソース解決
-</p>
-<table>
-<tr>
-<th>ユーザー設定</th>
-<th>アプリのリソース</th>
-<th>リソース解決</th>
-
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-<li> it_CH</li>
-</ol>
-</td>
-<td>
-デフォルト(en)<br>
-de_DE<br>
-es_ES<br>
-it_IT<br>
-</td>
-<td>
-fr_CH を試行 =&gt; 失敗<br>
-fr を試行 =&gt; 失敗<br>
-fr の子を試行 =&gt; 失敗<br>
-it_CH を試行 =&gt; 失敗<br>
-it を試行 =&gt; 失敗<br>
-it の子言語を試行 =&gt; it_IT<br>
-it_IT を使用
-</td>
-
-</tr>
-
-</table>
-<p>アプリでフランス語をサポートしていなくても、ユーザーが理解できる言語が使用されます。
-</p>
-
-
-<h2 id="design">追加のロケールをサポートするためのアプリ設計</h2>
-<h3>LocaleList API</h3>
-
-<p>Android N では、新しい API {@code LocaleList.getDefault()} が加わりました。これにより、アプリは直接、ユーザーが指定した言語のリストを問い合わせることができます。
-この API を使用すると、アプリの動作がさらに洗練され、コンテンツの表示がより最適化されます。
-
-たとえば検索で、ユーザーの設定に基づいて複数の言語で結果を表示できます。
-ブラウザ アプリは、ユーザーが理解できる言語の翻訳ページを表示することがなくなり、キーボード アプリは、自動的に最適なレイアウトを有効にすることができます。
-
- </p>
-
-<h3>フォーマッタ</h3>
-
-<p>Android 6.0(API レベル 23)までは、Android は多くの一般的な言語(en、es、ar、fr、ru)に対して 1 つか 2 つのロケールのみをサポートしていました。
-
-各言語にはわずかなバリエーションしかなかったため、アプリはリソース ファイルでハードコーディングされた文字列として数字や日付を保存し、処理することができました。
-
-しかし Android で幅広いロケールのセットがサポートされるようになったため、日付、時刻、通貨などの情報は、1 つのロケール内でも形式が大幅に異なる場合があります。
-
-
-形式をハードコーディングすると、エンドユーザーが混乱するおそれがあります。
-したがって、Android N で開発するときは、数字や日付の文字列をハードコーディングせず、必ずフォーマッタを使用してください。
-</p>
-
-<p>その良い例がアラビア語です。アラビア語のロケールのサポートは {@code ar_EG} の 1 つだけでしたが、Android N では 27 に増えました。
-これらのロケールは、ほとんどのリソースを共有できますが、数字は ASCII 表記とネイティブ表記で好みが分かれています。
-たとえば、「4 桁の PIN を選択してください」など、数字の変数を含む文を作成する場合、以下のようにフォーマッタを使用します。
-
-</p>
-
-<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>
diff --git a/docs/html-intl/intl/ja/preview/features/notification-updates.jd b/docs/html-intl/intl/ja/preview/features/notification-updates.jd
deleted file mode 100644
index d7cdc36..0000000
--- a/docs/html-intl/intl/ja/preview/features/notification-updates.jd
+++ /dev/null
@@ -1,393 +0,0 @@
-page.title=通知
-page.tags=notifications
-helpoutsWidget=true
-page.image=/preview/images/notifications-card.png
-
-trainingnavtop=true
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-
-<!-- table of contents -->
-<h2>このドキュメントの内容</h2>
-<ol>
-  <li><a href="#direct">ダイレクト リプライ</a></li>
-  <li><a href="#bundle">バンドル通知</a></li>
-  <li><a href="#custom">カスタムビュー</a></li>
-  <li><a href="#style">メッセージ スタイル</a></li>
-</ol>
-
-</div>
-</div>
-
-<p>Android N には、アプリが視認性の高いインタラクティブな通知を投稿できるようにする新しい API がいくつか導入されています。
-</p>
-
-<p>Android N では、ハンドセットでインライン リプライをサポートするために、既存の {@link android.support.v4.app.RemoteInput} 通知 API が拡張されています。
-これらの機能を使用すると、ユーザーは、アプリにアクセスすることなく、通知シェードからすばやく応答できます。
-</p>
-
-<p>
-  Android N では、類似した通知をバンドルして、単一の通知として表示することもできます。
-このバンドルを可能にするために、Android N では、既存の {@link
-  android.support.v4.app.NotificationCompat.Builder#setGroup
-  NotificationCompat.Builder.setGroup()} メソッドが使用されます。ユーザーは、各通知を展開して、通知シェードから個別に返信や消去などのアクションを各通知に対して行うことができます。
-
-
-</p>
-
-<p>最後に、Android N には、アプリのカスタマイズした通知ビューでシステム デコレーションを活用できるようにする新しい API が追加されています。
-これらの API は、通知ビューで、標準のテンプレートを使った一貫した表示を共有できるようにします。
-
-</p>
-
-<p>このドキュメントでは、アプリでこれらの新しい通知機能を使用するときに考慮する必要のある主な変更点について説明します。
-</p>
-
-<h2 id="direct">ダイレクト リプライ</h2>
-
-<p>Android N のダイレクト リプライ機能を使用すると、ユーザーは、テキスト メッセージにすばやく応答したり、通知インターフェース内でタスクリストを直接アップデートしたりできます。
-
-ハンドヘルド デバイスでは、インライン リプライ アクションが、通知にアタッチされた追加ボタンとして表示されます。
-ユーザーがキーボード経由で返信する場合、通知アクション向けに指定したインテントにテキストによる応答がアタッチされ、そのインテントがハンドヘルド デバイス用アプリに送信されます。
-
-
-
-
-
-<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
-  {@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
-<p class="img-caption">
-  <strong>図 1.</strong> Android N に追加された [<strong>Reply</strong>] アクション ボタン。
-
-</p>
-
-<h3>インライン リプライ アクションを追加する</h3>
-
-<p>ダイレクト リプライをサポートする通知アクションを作成する方法は次のとおりです。
-</p>
-
-<ol>
-<li>通知アクションに追加できる {@link android.support.v4.app.RemoteInput.Builder} のインスタンスを作成します。
-
-このクラスのコンストラクタは、システムがテキスト入力のキーとして使用する文字列を受け取ります。
-その後、ハンドヘルド デバイス用アプリはそのキーを使用して、入力テキストを取得します。
-
-
-<pre>
-// Key for the string that's delivered in the action's intent.
-private static final String KEY_TEXT_REPLY = "key_text_reply";
-String replyLabel = getResources().getString(R.string.reply_label);
-RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
-        .setLabel(replyLabel)
-        .build();
-</pre>
-</li>
-<li> <code>addRemoteInput()</code> を使用して、{@link android.support.v4.app.RemoteInput} オブジェクトをアクションにアタッチします。
-
-
-<pre>
-// Create the reply action and add the remote input.
-Notification.Action action =
-        new Notification.Action.Builder(R.drawable.ic_reply_icon,
-                getString(R.string.label), replyPendingIntent)
-                .addRemoteInput(remoteInput)
-                .build();
-</pre>
-</li>
-
-<li>アクションを通知に適用し、通知を発行します。
-
-<pre>
-// Build the notification and add the action.
-Notification newMessageNotification =
-        new Notification.Builder(mContext)
-                .setSmallIcon(R.drawable.ic_message)
-                .setContentTitle(getString(R.string.title))
-                .setContentText(getString(R.string.content))
-                .addAction(action))
-                .build();
-
-// Issue the notification.
-NotificationManager notificationManager =
-        NotificationManager.from(mContext);
-notificationManager.notify(notificationId, newMessageNotification);
-
-</pre>
-</li>
-
-</ol>
-
-
-<p> ユーザーが通知アクションをトリガーすると、ユーザーは応答を入力するよう求められます。
- </p>
-
-<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
-    {@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>図 2.</strong> ユーザーは通知シェードでテキスト メッセージを入力できます。
-</p>
-
-<h3>
-  インライン リプライからユーザー入力を取得する
-</h3>
-
-<p>
-  リプライ アクションのインテントで宣言したアクティビティで、通知インターフェースからのユーザー入力を取得する方法は次のとおりです。
-
-</p>
-
-<ol>
-  <li>通知アクションのインテントを入力パラメータとして渡すことにより、{@link android.support.v4.app.RemoteInput#getResultsFromIntent
-  getResultsFromIntent()} を呼び出します。
-このメソッドは、テキストによる応答が含まれた {@link android.os.Bundle} を返します。
-
-
-    <pre>
-Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-</pre>
-  </li>
-
-  <li>result キー({@link
-  android.support.v4.app.RemoteInput.Builder} コンストラクタに提供されている)を使用して、バンドルへのクエリを実行します。次のコード スニペットに示すようにメソッドを作成することにより、このプロセスを完了して入力テキストを取得できます。
-
-
-
-    <pre>
-// Obtain the intent that started this activity by calling
-// Activity.getIntent() and pass it into this method to
-// get the associated string.
-
-private CharSequence getMessageText(Intent intent) {
-    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-    if (remoteInput != null) {
-        return remoteInput.getCharSequence(KEY_TEXT_REPLY);
-    }
-    return null;
- }
-</pre>
-  </li>
-
-  <li>以前の通知に指定したのと同じ通知 ID を使用して、別の通知をビルドして発行します。
-進捗インジケーターが通知インターフェースに表示されなくなり、リプライが正常に行われたことがわかります。
-
-この新しい通知で作業するときは、レシーバーの {@code onReceive()} メソッドに渡されるコンテキストを使用します。
-
-
-    <pre>
-// Build a new notification, which informs the user that the system
-// handled their interaction with the previous notification.
-Notification repliedNotification =
-        new Notification.Builder(context)
-                .setSmallIcon(R.drawable.ic_message)
-                .setContentText(getString(R.string.replied))
-                .build();
-
-// Issue the new notification.
-NotificationManager notificationManager =
-        NotificationManager.from(context);
-notificationManager.notify(notificationId, repliedNotification);
-</pre>
-  </li>
-</ol>
-
-<p>
-  チャットなどのインタラクティブなアプリでは、取得されたテキストを処理するときに、追加のコンテキストを含めると役立つ場合があります。
-たとえば、このようなアプリでは複数行のチャット履歴が表示されることがあります。
-{@link
-  android.support.v4.app.RemoteInput} を介してユーザーが応答した場合、{@code setRemoteInputHistory()} メソッドを使用してリプライ履歴を更新できます。
-
-</p>
-
-<p>
-  アプリがリモート入力を受け取った後、通知は更新またはキャンセルされる必要があります。
-ユーザーがダイレクト リプライを使用してリモート更新にリプライする場合は、通知をキャンセルしないでください。
-
-代わりに、通知を更新してユーザーのリプライを表示します。{@code MessagingStyle} を使用した通知の場合は、リプライを最新のメッセージとして追加する必要があります。
-
-他のテンプレートを使用する場合は、ユーザーのリプライをリモート入力履歴に追加できます。
-
-</p>
-
-<h2 id="bundle">バンドル通知</h2>
-
-<p>Android N は、通知のキューを表す新しい方法である
- <i>バンドル通知</i>をデベロッパーに提供します。この機能は、Android Wear の<a href="{@docRoot}training/wearables/notifications/stacks.html">通知スタック</a>機能に似ています。
-
-たとえば、受信したメッセージの通知をアプリで作成する場合、複数のメッセージが受信されると、通知が単一のグループにバンドルされます。
-
-既存の {@link android.support.v4.app.NotificationCompat.Builder#setGroup
-Builder.setGroup()} メソッドを使用して、同様の通知をバンドルできます。
-</p>
-
-<p>
-  通知グループでは、通知グループを構成する通知が階層化されます。
-  この階層の最上位には、そのグループの概要情報を表示する親通知があります。
-ユーザーは通知グループを順次展開できます。ユーザーが階層を深くたどると、より多くの情報が表示されます。
-
-ユーザーがバンドルを展開すると、すべての子通知の詳細情報が表示されます。ユーザーがいずれかの通知を展開すると、そのコンテンツがすべて表示されます。
-
-
-</p>
-
-<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
-          {@docRoot}preview/images/bundles_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>図 3.</strong> ユーザーは通知グループを順次展開できます。
-
-</p>
-
-<p class="note">
-  <strong>注:</strong>同じアプリが 4 つ以上の通知を送信するときにグループ化が指定されていない場合、システムにより自動的に通知がグループ化されます。
-
-
-</p>
-
-<p>通知をグループに追加する方法については、<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">各通知をグループに追加する</a>をご覧ください。
-
-</p>
-
-
-<h3 id="best-practices">バンドル通知のベストプラクティス</h3>
-<p>このセクションでは、前のバージョンの Android プラットフォームで利用可能な {@link android.app.Notification.InboxStyle InboxStyle} 通知の代わりに、通知グループを使用する必要がある状況についてのガイドラインを提供します。
-
-
-</p>
-
-<h3>バンドル通知を使用するとき</h3>
-
-<p>ユースケースで次のすべての条件が満たされた場合にのみ通知グループを使用する必要があります。
-</p>
-
-<ul>
-  <li>子通知が完全な通知であり、グループの概要なしに、子通知を個別に表示できる。
-</li>
-  <li>子通知を個別に表示するメリットがある。次に例を示します。
-
-  </li>
-  <ul>
-    <li>子通知がアクション可能であり、各子通知に固有のアクションがある。</li>
-    <li>ユーザーが読みたい多くの情報が子通知にある。</li>
-  </ul>
-</ul>
-
-<p>通知グループの適切なユースケースの例には、着信メッセージのリストを表示するメッセージング アプリや受信したメールのリストを表示するメールアプリなどが含まれます。
-
-</p>
-
-<p>
-単一の通知が望ましいユースケースの例には、1 人のユーザーからの個別メッセージや、1 行のテキスト メッセージ アイテムのリスト表示が含まれます。
-
-このリスト表示を行うには、
-{@link android.app.Notification.InboxStyle InboxStyle} または {@link android.app.Notification.BigTextStyle BigTextStyle} を使用します。
-
-
-</p>
-
-<h3 id ="post">バンドル通知を表示する</h3>
-
-<p>
-  アプリは、グループに単一の子通知が含まれている場合でも、グループの概要を常に送信する必要があります。
-グループに単一の通知のみが含まれている場合、システムによって、概要の表示が非表示になり、子通知が直接表示されます。
-これにより、ユーザーがグループの子通知をスワイプして消すときに一貫した使用感が出ます。
-
-
-</p>
-
-<p class="note">
-  <strong>注:</strong>このバージョンの Android N では、単一の子通知が含まれる通知グループの概要を非表示にできません。
-この機能は、将来のバージョンの Android N に追加されます。
-
-</p>
-
-<h3>通知をピークする</h3>
-
-<p>通常、子通知はグループとして表示されますが、子通知を<a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">ヘッドアップ通知</a>として一時的に表示するように設定できます。
-
-
-この機能は、特に最新の子通知とその関連するアクションへの即時アクセスを可能にするので便利です。
-
-</p>
-
-
-<h3>下位互換性</h3>
-
-<p>
-  Android 5.0(API レベル 21)以降では、Android Wear 端末をサポートするために、通知グループとリモート入力が {@link
-  android.app.Notification} API の一部になっています。
-これらの API を使用して通知を既に作成している場合は、アプリの動作が上記のガイドラインに適合していることの確認と、{@code
-  setRemoteInputHistory()} の実装検討のみを行ってください。
-
-
-</p>
-
-<p>
-  下位互換性をサポートするために、サポート ライブラリの {@link android.support.v4.app.NotificationCompat} クラスで同じ API が利用できるようになっているため、前の Android バージョンで機能する通知を作成できます。
-
-
-携帯端末とタブレットでは、概要通知のみがユーザーに表示されるため、アプリは、受信トレイスタイルやグループの全情報を表す同等の通知を引き続きサポートする必要があります。
-
-Android Wear 端末では、古いプラットフォーム レベル上にもすべての子通知が表示されるため、API レベルに関係なく、子通知を作成する必要があります。
-
-
-
-</p>
-
-<h2 id="custom"> カスタムビュー</h2>
-<p>Android N 以降では通知ビューをカスタマイズでき、通知ヘッダー、アクション、展開レイアウトなどのシステム デコレーションを引き続き取得できます。
-
-</p>
-
-<p>この機能を有効にするために、Android N には、カスタムビューにスタイルを適用する次の API が追加されています。
-</p>
-
-<dl>
-<dt>
-{@code DecoratedCustomViewStyle()}</dt>
-<dd> メディア通知以外の通知にスタイルを適用します。
-</dd>
-<dt>
-{@code DecoratedMediaCustomViewStyle()}</dt>
-<dd> メディア通知にスタイルを適用します。</dd>
-</dl>
-
-<p>この新しい API を使用するには、{@code setStyle()} メソッドを呼び出し、目的のカスタムビュー スタイルに渡します。
-</p>
-
-<p>次のコード スニペットは、
-{@code DecoratedCustomViewStyle()} メソッドでカスタム通知オブジェクトを作成する方法を示しています。</p>
-
-<pre>
-Notification notification = new Notification.Builder()
-           .setSmallIcon(R.drawable.ic_stat_player)
-           .setLargeIcon(albumArtBitmap))
-           .setCustomContentView(contentView);
-           .setStyle(new Notification.DecoratedCustomViewStyle())
-           .build();
-
-</pre>
-
-<h2 id="style">メッセージング スタイル</h2>
-<p>
-  Android N では、通知スタイルをカスタマイズするための新しい API が提供されます。
-  <code>MessageStyle</code> クラスを使用して、会話タイトル、追加メッセージ、通知のコンテンツ ビューなど、通知に表示される複数のラベルを変更できます。
-
-
-</p>
-
-<p>
-  次のコード スニペットは、<code>MessageStyle</code> クラスを使用して通知のスタイルをカスタマイズする方法を示しています。
-
-</p>
-
-<pre>
-  Notification notification = new Notification.Builder()
-             .setStyle(new Notification.MessagingStyle("Me")
-                 .setConversationTitle("Team lunch")
-                 .addMessage("Hi", timestamp1, null) // Pass in null for user.
-                 .addMessage("What's up?", timestamp2, "Coworker")
-                 .addMessage("Not much", timestamp3, null)
-                 .addMessage("How about lunch?", timestamp4, "Coworker"));
-</pre>
diff --git a/docs/html-intl/intl/ko/about/versions/nougat/android-7.0-testing.jd b/docs/html-intl/intl/ko/about/versions/nougat/android-7.0-testing.jd
deleted file mode 100644
index 1222227..0000000
--- a/docs/html-intl/intl/ko/about/versions/nougat/android-7.0-testing.jd
+++ /dev/null
@@ -1,190 +0,0 @@
-page.title=테스트 가이드
-page.image=images/cards/card-n-guide_2x.png
-meta.tags="preview", "testing"
-page.tags="preview", "developer preview"
-
-@jd:body
-
-<div id="tb-wrapper">
-  <div id="tb">
-    <h2>이 문서의 내용</h2>
-      <ol>
-        <li><a href="#runtime-permissions">권한 테스트</a></li>
-        <li><a href="#doze-standby">잠자기 및 앱 대기 모드 테스트</a></li>
-        <li><a href="#ids">자동 백업 및 기기 식별자</a></li>
-      </ol>
-  </div>
-</div>
-
-<p>
-  Android N에서는 앱이 차기 버전의 플랫폼에서 제대로 작동하는지 확인해볼 수 있습니다.
- 이 프리뷰에는 앱에 영향을 미칠 수 있는 수많은 API와 동작 변경 사항이 포함되어 있습니다. 이에 대해서는 <a href="{@docRoot}preview/api-overview.html">API 개요</a>와 <a href="{@docRoot}preview/behavior-changes.html">동작 변경 사항</a>에 설명되어 있습니다.
-
- 프리뷰로 앱을 테스트할 때에는 사용자에게 좋은 환경을 제공하기 위해 개발자 여러분이 꼭 초점을 맞춰야 하는 몇 가지 특정한 시스템 변경사항이 있습니다.
-
-
-</p>
-
-<p>
-  이 가이드에서는 앱에서 테스트할 프리뷰 기능은 어떤 것이고, 테스트 방법은 어떤지에 대해 설명합니다. 이와 같은 특정 프리뷰 기능을 먼저 테스트하는 것이 좋습니다. 왜냐하면 이들 기능은 앱의 동작에 큰 영향을 미칠 가능성이 높기 때문입니다.
-
-
-</p>
-
-<ul>
-  <li><a href="#runtime-permissions">권한</a>
-  </li>
-  <li><a href="#doze-standby">잠자기 및 앱 대기 모드</a>
-  </li>
-  <li><a href="#ids">자동 백업 및 기기 식별자</a></li>
-</ul>
-
-<p>
-  테스트용 프리뷰 시스템 이미지로 기기 또는 가상 기기를 설정하는 방법에 대한 자세한 정보는 <a href="{@docRoot}preview/setup-sdk.html">Android N SDK 설정</a>을 참조하세요.
-
-
-</p>
-
-
-<h2 id="runtime-permissions">권한 테스트</h2>
-
-<p>
-  새로운 <a href="{@docRoot}preview/features/runtime-permissions.html">권한</a> 모델은 사용자가 여러분의 앱에 권한을 할당하는 방법을 바꿔 놓습니다.
- 설치 절차 중에 모든 권한을 허용하는 것이 아니라, 앱이 런타임에 사용자에게 각각의 권한을 요청해야 합니다.
-
- 사용자 입장에서는 이러한 동작으로 각 앱의 액티비티에 대해 더 세분화된 제어권을 행사할 수 있을 뿐만 아니라 이 앱이 어째서 특정한 권한을 요청하고 있는 것인지 맥락을 더 잘 이해할 수 있게 되기도 합니다.
- 사용자는 언제든 앱에 개별적으로 권한을 허용할 수 있고, 이를 취소할 수도 있습니다.
- 미리 보기의 이러한 기능은 앱의 동작에 영향을 미칠 가능성이 가장 높고, 앱의 몇 가지 기능이 작동하지 않도록 막거나 저하된 상태로 작동하게 할 수도 있습니다.
-
-
-</p>
-
-<p class="caution">
-  이 변경 내용은 새 플랫폼에서 실행되는 모든 앱에 영향을 비치며, 새 플랫폼 버전을 대상으로 하지 않는 앱도 예외가 아닙니다.
- 레거시 앱에 대해 플랫폼이 제한된 호환성 동작을 제공하기는 하지만, 지금 바로 새 권한 모델로 앱의 마이그레이션 계획을 시작하는 편이 좋습니다. 플랫폼이 공식적으로 출시될 때에 맞춰 앱의 업데이트된 버전을 게시하는 것을 목표로 하십시오.
-
-
-</p>
-
-
-<h3 id="permission-test-tips">테스트 팁</h3>
-
-<p>
-  다음은 새 권한 동작에 대해 앱 테스트를 계획하고 실행하는 데 유용한 몇 가지 테스트 팁입니다.
-
-</p>
-
-<ul>
-  <li>앱의 현재 권한과 관련된 코드 경로를 확인합니다.</li>
-  <li>권한 보호된 서비스 및 데이터 전반에 걸친 사용자 흐름을 테스트합니다.</li>
-  <li>허용된/취소된 권한을 여러 가지로 조합하여 테스트합니다.</li>
-  <li>명령줄에서 권한을 관리할 때 {@code adb} 도구를 사용합니다.
-    <ul>
-      <li>권한과 상태를 그룹별로 목록으로 나열합니다.
-        <pre>adb shell pm list permissions -d -g</pre>
-      </li>
-      <li>하나 이상의 권한을 다음과 같은 구문을 사용하여 허용하거나 취소합니다.<br>
-        <pre>adb shell pm [grant|revoke] &lt;permission.name&gt; ...</pre>
-      </li>
-    </ul>
-  </li>
-  <li>권한을 사용하는 서비스에 대해 앱을 분석해봅니다.</li>
-</ul>
-
-<h3 id="permission-test-strategy">테스트 전략</h3>
-
-<p>
-  권한을 변경하면 앱의 구조와 디자인은 물론 사용자 환경과, 개발자가 사용자에게 제공하는 흐름에도 영향을 미칩니다.
- 앱의 현재 권한 사용 내용을 평가한 다음 제공하고자 하는 새로운 흐름을 계획하기 시작해야 합니다.
- 플랫폼의 공식 릴리스에서 호환성 동작을 제공할 예정이지만, 이와 같은 동작에만 의존하지 말고 앱 업데이트를 계획하는 것이 좋습니다.
-
-
-</p>
-
-<p>
-  앱이 실제로 필요로 하고 사용하는 권한을 확인한 다음, 권한 보호된 서비스를 사용하는 여러 가지 코드 경로를 찾습니다.
- 이렇게 하려면 새 플랫폼에서 여러 가지로 조합한 테스트를 거치고 코드 분석을 통해야 합니다.
- 테스트에서는 런타임 권한에 옵트인하는 것에 초점을 맞춰야 합니다. 이를 위해 앱의 {@code targetSdkVersion}을 프리뷰 버전으로 변경하세요.
- 자세한 정보는 <a href="{@docRoot}preview/setup-sdk.html#">Android N SDK 설정</a>을 참조하세요.
-
-
-</p>
-
-<p>
-  다양한 조합의 권한을 해지하고 추가하는 방식으로 테스트를 수행하여 권한에 종속되는 사용자 흐름을 파악합니다.
- 종속성이 분명하지 않거나 논리적인 경우, 리팩터링을 고려해 보거나 해당 흐름을 구분하여 종속성을 제거, 또는 해당 권한이 왜 필요한지 분명히 하는 방안을 고려해야 합니다.
-
-
-</p>
-
-<p>
-  런타임 권한의 동작, 테스트 및 모범 사례에 대한 자세한 정보는 <a href="{@docRoot}preview/features/runtime-permissions.html">권한</a> 개발자 미리 보기 페이지를 참조하십시오.
-
-
-</p>
-
-
-<h2 id="doze-standby">잠자기 및 앱 대기 모드 테스트</h2>
-
-<p>
-  잠자기 및 앱 대기 모드의 절전 기능은 기기가 유휴 상태에 있을 때 또는 사용자가 앱에 초점을 맞추고 있지 않을 때 앱이 수행할 수 있는 배경 처리의 양을 제한합니다.
- 시스템이 앱에 부과할 수 있는 제한 사항에는 네트워크 액세스를 제한하거나 없애기, 배경 작업을 일시 중지시키기, 알림 일시 중지, 절전 모드 해제 및 알람 요청 무시 등이 포함됩니다.
-
- 이러한 절전 기능에 앱이 적절히 동작하도록 확실히 해 두려면 이와 같은 저전력 상태를 시뮬레이트하여 앱을 테스트해보아야 합니다.
-
-
-</p>
-
-<h4 id="doze">앱에서 잠자기 모드 테스트하기</h4>
-
-<p>앱에서 잠자기 모드를 테스트하려면:</p>
-
-<ol>
-<li>Android N 시스템 이미지로 하드웨어 기기 또는 가상 기기를 구성합니다.</li>
-<li>기기를 개발 머신에 연결하고 앱을 설치합니다.</li>
-<li>앱을 실행시킨 다음 활성 상태로 그냥 둡니다.</li>
-<li>다음 명령을 실행하여 기기가 잠자기 모드에 들어가는 것을 시뮬레이션합니다.
-
-<pre>
-$ adb shell dumpsys battery unplug
-$ adb shell dumpsys deviceidle step
-$ adb shell dumpsys deviceidle -h
-</pre>
-
-  </li>
-  <li>기기가 다시 활성화되면 앱이 어떻게 동작하는지 살펴봅니다. 기기가 잠자기 모드를 종료할 때 정상적으로 복구되는지 확인해야 합니다.
-</li>
-</ol>
-
-
-<h4 id="standby">앱에서 앱 대기 모드 테스트하기</h4>
-
-<p>앱에서 앱 대기 모드를 테스트하려면:</p>
-
-<ol>
-  <li>Android N 시스템 이미지로 하드웨어 기기 또는 가상 기기를 구성합니다.</li>
-  <li>기기를 개발 머신에 연결하고 앱을 설치합니다.</li>
-  <li>앱을 실행시킨 다음 활성 상태로 그냥 둡니다.</li>
-  <li>다음 명령을 실행하여 앱이 대기 모드에 들어가는 것을 시뮬레이션합니다.
-
-<pre>
-$ adb shell am broadcast -a android.os.action.DISCHARGING
-$ adb shell am set-idle &lt;packageName&gt; true
-</pre>
-
-  </li>
-  <li>다음 명령을 사용하여 앱이 대기 모드에서 해제되는 것을 시뮬레이션합니다.
-    <pre>$ adb shell am set-idle &lt;packageName&gt; false</pre>
-  </li>
-  <li>앱이 대기 모드에서 해제된 상태에서 어떻게 동작하는지 살펴봅니다. 대기 모드에서 정상적으로 복구되는지 확인해야 합니다.
- 특히, 앱의 알림과 배경 작업이 계속 예상했던 대로 기능하는지 확인해야 합니다.
-</li>
-</ol>
-
-<h2 id="ids">앱용 자동 백업 및 기기별 식별자</h2>
-
-<p>앱이 내부 저장소에서 각 기기에 따라 다른 식별자(예: Google Cloud Messaging 등록 ID)를 유지하는 경우, 모범 사례를 따라 저장소 위치를 자동 백업에서 배제해야 합니다. 이 내용은 <a href="{@docRoot}preview/backup/index.html">앱용 자동 백업</a>에 설명되어 있습니다.
-
-
-
- </p>
diff --git a/docs/html-intl/intl/ko/about/versions/nougat/index.jd b/docs/html-intl/intl/ko/about/versions/nougat/index.jd
index 4b0ccc5..6ed065b 100644
--- a/docs/html-intl/intl/ko/about/versions/nougat/index.jd
+++ b/docs/html-intl/intl/ko/about/versions/nougat/index.jd
@@ -1,6 +1,6 @@
-page.title=Android N Developer Preview
-page.tags="preview","developer"
-meta.tags="preview", "android"
+page.title=Android 7.0 Nougat
+page.tags="androidn","versions"
+meta.tags="android n", "nougat", "android 7.0"
 fullpage=true
 forcelocalnav=true
 header.hide=1
@@ -17,62 +17,56 @@
   })
 </script>
 
-<section class="dac-expand dac-hero dac-light" style="background-color:#B2DFDB">
+<section class="dac-expand dac-hero dac-light">
   <div class="wrap" style="max-width:1100px;margin-top:0">
+  <a href="{@docRoot}about/versions/nougat/android-7.0.html">
     <div class="cols dac-hero-content" style="padding-bottom:1em;">
 
-      <div class="col-7of16 col-push-9of16" style="padding-left:2em">
-        <h1 class="dac-hero-title">Android N Developer Preview</h1>
+      <div class="col-7of16 col-push-8of16" style="padding-left:2em">
+        <h1 class="dac-hero-title">Android 7.0 Nougat</h1>
         <p class="dac-hero-description">
-          Android N을 맞이할 준비를 하세요!
+          Android Nougat을 맞이할 준비를 하세요!
           Nexus와 다른 기기에서 <strong>앱을 테스트하세요</strong>. <strong>전력과 메모리를 절약</strong>하는 새로운 시스템
 동작을 지원하세요.
           <strong>다중 창 UI</strong>,
 <strong>직접 회신 알림</strong> 등으로 앱을 확장하세요.
         </p>
 
-        <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+        <a class="dac-hero-cta" href="{@docRoot}about/versions/nougat/android-7.0.html">
           <span class="dac-sprite dac-auto-chevron"></span>
           시작하기
-        </a><!--<br>
-        <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
-          Update to Android N (final SDK)
-        </a><br>-->
+        </a>
       </div>
-      <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
-        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png" srcset="{@docRoot}images/home/n-preview-hero.png 1x,
-             {@docRoot}images/home/n-preview-hero_2x.png 2x">
+      <div class="col-7of16 col-pull-6of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
+        <a  href="{@docRoot}about/versions/nougat/android-7.0.html">
+        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png"
+             srcset="{@docRoot}images/home/n-preview-hero.png 1x,
+             {@docRoot}images/home/n-preview-hero_2x.png 2x" />
+           </a>
       </div>
-    </div>
+    </div></a>
     <div class="dac-section dac-small">
       <div class="resource-widget resource-flow-layout col-16"
-           data-query="collection:preview/landing/resources"
+           data-query="collection:nougat/landing/resources"
            data-cardSizes="6x2"
-           data-maxResults="6"></div>
-    </div>
+           data-maxResults="3"></div>
+         </div>
   </div>
 </section>
 
 <div id="useUpdatedTemplates" style="display:none" class="dac-section dac-slim dac-gray dac-expand">
   <div class="wrap dac-offset-parent">
-    <a class="dac-fab dac-scroll-button" data-scroll-button href="#build-apps">
+    <a class="dac-fab dac-scroll-button" data-scroll-button href="#latest">
       <i class="dac-sprite dac-arrow-down-gray"></i>
     </a>
     <ul class="dac-actions">
       <li class="dac-action">
-        <a class="dac-action-link" href="https://developer.android.com/preview/bug">
+        <a class="dac-action-link" href="https://source.android.com/source/report-bugs.html">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
           문제 보고
         </a>
       </li>
       <li class="dac-action">
-        <a class="dac-action-link" href="{@docRoot}preview/support.html">
-          <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
-          릴리스 노트 보기
-        </a>
-      </li>
-      <li class="dac-action">
         <a class="dac-action-link" href="{@docRoot}preview/dev-community">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
           개발자 커뮤니티 가입
@@ -113,19 +107,34 @@
     data-initial-results="3"></div>
 </div></section>
 
-<section class="dac-section dac-gray"><div class="wrap">
-  <h1 class="dac-section-title">리소스</h1>
+<section class="dac-section dac-gray" id="videos"><div class="wrap">
+  <h1 class="dac-section-title">Videos</h1>
   <div class="dac-section-subtitle">
-    앱을 Android N에서 사용할 수 있도록 준비하는 데 유용한 중요 정보입니다.
+    New Android capabilities and the right way to use them in your apps.
   </div>
 
   <div class="resource-widget resource-flow-layout col-16"
-       data-query="collection:preview/landing/more"
+    data-query="collection:nougat/landing/videos/first,type:youtube+tag:androidn"
+    data-sortOrder="-timestamp"
+    data-cardSizes="6x6"
+    data-items-per-page="6"
+    data-maxResults="15"
+    data-initial-results="3">
+  </div>
+</div></section>
+
+<section class="dac-section dac-light" id="resources"><div class="wrap">
+  <h1 class="dac-section-title">리소스</h1>
+  <div class="dac-section-subtitle">
+    앱을 Android Nougat에서 사용할 수 있도록 준비하는 데 유용한 중요 정보입니다.
+  </div>
+
+  <div class="resource-widget resource-flow-layout col-16"
+       data-query="collection:nougat/landing/more"
        data-cardSizes="6x6"
        data-items-per-page="6"
        data-maxResults="15"
        data-initial-results="6"></div>
 
   </div>
-</section>
-
+</section>
\ No newline at end of file
diff --git a/docs/html-intl/intl/ko/index.jd b/docs/html-intl/intl/ko/index.jd
index 01c8587..e102411 100644
--- a/docs/html-intl/intl/ko/index.jd
+++ b/docs/html-intl/intl/ko/index.jd
@@ -15,33 +15,30 @@
   })
 </script>
 
-<section class="dac-expand dac-hero dac-invert" style="background-color:#455A64">
-  <div class="wrap" style="max-width:1100px;margin-top:0">
-    <div class="col-7of16 col-push-9of16" style="padding-left:2em;">
-      <a href="{@docRoot}preview/index.html">
-        <h1 class="dac-hero-title">Android N Developer Preview</h1>
-        <p class="dac-hero-description">
-          Get ready for the next version of Android!
-          <strong>Test your apps</strong> on Nexus and other devices. Support new system
-          behaviors to <strong>save power and memory</strong>.
+<section class="dac-expand dac-hero" style="background-color:#b2dfdb;">
+  <div class="wrap" style="max-width:1000px;margin-top:0">
+    <div class="col-7of16 col-push-8of16">
+      <a href="{@docRoot}about/versions/nougat/index.html">
+        <h1 class="dac-hero-title" style="color:#004d40">Android 7.0 Nougat!</h1>
+        <p class="dac-hero-description" style="color:#004d40">
+          <strong>Android 7.0 Nougat is here!</strong>
+          Get your apps ready for the latest version of Android, with new system
+          behaviors to <strong>save battery and memory</strong>.
           Extend your apps with <strong>multi-window UI</strong>,
           <strong>direct reply notifications</strong> and more.
         </p>
-        <a class="dac-hero-cta" href="/preview/index.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
+        <a class="dac-hero-cta" href="{@docRoot}about/versions/nougat/index.html" style="color:#004d40">
+          <span class="dac-sprite dac-auto-chevron" style="background-color:#b2dfdb"></span>
           Learn more
-        </a><!--<br>
-        <a class="dac-hero-cta" href="/preview/support.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
-          Update to Developer Preview (final SDK)
-        </a><br>-->
+        </a>
+        </a>
       </a>
     </div>
-    <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:0em;padding-right:1.5em;">
-      <a href="{@docRoot}preview/index.html">
-        <img style="" class="dac-hero-image" src="/images/home/n-preview-hero.png"
-             srcset="/images/home/n-preview-hero.png 1x,
-             /images/home/n-preview-hero_2x.png 2x">
+    <div class="col-6of16 col-pull-6of16 dac-hero-figure" style="padding-left:1em;padding-top:1em;">
+      <a href="{@docRoot}about/versions/nougat/index.html">
+        <img class="dac-hero-image" src="{@docRoot}images/home/nougat_bg.jpg"
+             srcset="{@docRoot}images/home/nougat_bg.jpg 1x,
+             {@docRoot}images/home/nougat_bg_2x.jpg 2x">
         </a>
     </div>
   </div>
diff --git a/docs/html-intl/intl/ko/preview/download_mp2.jd b/docs/html-intl/intl/ko/preview/download_mp2.jd
deleted file mode 100644
index ff9dd7e..0000000
--- a/docs/html-intl/intl/ko/preview/download_mp2.jd
+++ /dev/null
@@ -1,360 +0,0 @@
-page.title=다운로드
-page.image=images/cards/card-download_16-9_2x.png
-
-@jd:body
-
-<div style="position:relative; min-height:600px">
-
-  <div class="wrap" id="tos" style="position:absolute;display:none;width:inherit;">
-
-    <p class="sdk-terms-intro">Android 미리 보기 SDK의 구성 요소를 다운로드하고 설치하기 전에 우선 다음과 같은 사용 약관에 동의해야 합니다.
-</p>
-
-    <h2 class="norule">사용 약관</h2>
-
-    <div class="sdk-terms" onfocus="this.blur()" style="width:678px">
-이것은 Android SDK 미리 보기 라이선스 계약서입니다(이하 "라이선스 계약").
-
-1. 개요
-
-1.1 Android SDK 미리 보기(본 라이선스 계약에서는 "미리 보기"라고 칭하며, 구체적으로 Android 시스템 파일, 패키지 API 및 미리 보기 라이브러리 파일이 이용 가능한 경우 및 이용 가능하게 전환된 경우 이를 포함한 것을 가리킴)는 본 라이선스 계약 조건에 따라 계약자에게 사용을 허여합니다. 본 라이선스 계약은 미리 보기 사용과 관련하여 계약자와 Google 간에 법적 구속력이 있는 계약을 체결합니다.
-
-1.2 "Android"는 기기를 위한 Android 소프트웨어 스택을 의미합니다. 이는 http://source.android.com/ URL에 위치하며 수시로 업데이트되는 Android 오픈 소스 프로젝트에서 제공됩니다.
-
-1.3 "Google"은 미국 1600 Amphitheatre Parkway, Mountain View, CA 94043에 본사를 두고 있는 델라웨어주 법인인 Google Inc.를 의미합니다.
-
-2. 라이선스 계약에 동의
-
-2.1 이 미리 보기를 사용하려면, 먼저 라이선스 계약에 동의해야 합니다. 이 라이선스 계약에 동의하지 않고 미리 보기를 사용해서는 안 됩니다.
-
-2.2 수락을 클릭하고/거나 미리 보기를 사용하면 본 라이선스 계약 조건에 동의하는 것으로 간주됩니다.
-
-2.3 미국법 또는 현재 거주 중이거나 미리 보기를 사용하는 국가를 포함하여 다른 국가의 법에 따라 미리 보기를 받는 것이 금지된 경우, 미리 보기를 사용할 수 없으며 본 라이선스 계약을 수락할 수 없습니다.
-
-2.4 회사 또는 단체 내에서 내부적으로 미리 보기를 사용하며 고용주 또는 기타 단체를 대신하여 본 라이선스 계약 준수에 동의하는 경우, 계약자의 고용주나 그 단체에 본 라이선스 계약에 대한 구속력을 부여할 수 있는 모든 법적 권한을 계약자가 갖고 있음을 진술하고 보증합니다. 구속력을 부여할 수 있는 법적 권한이 없을 경우, 고용주 또는 기타 단체를 대신하여 본 라이선스 계약에 동의하거나 미리 보기를 사용할 수 없습니다.
-
-3. Google이 허하는 미리 보기 라이선스
-
-3.1 본 라이선스 계약의 조건에 따라 Google은 계약자에게 로열티 없고 양도 불가능하며 비독점적이고 2차 인가를 불허하며, 한정되고 무효화할 수 있는 미리 보기 사용 권한을 허용하여 회사 또는 조직 내에서 개인적 또는 내부적으로 사용할 수 있도록 합니다. 이는 Android 플랫폼에서 실행되는 애플리케이션을 개발할 목적으로만 사용해야 합니다.
-
-3.2 계약자는 SDK에 존재하는 지적 재산권을 포함한 SDK에 대한 모든 법적인 권리, 소유권 및 이익이 Google 또는 제3자에게 있음에 동의합니다 "지적 재산권"은 모든 특허법, 저작권법, 영업비밀법, 상표법상 존재하는 모든 권리 및 기타 모든 재산권을 의미합니다. Google은 계약자에게 명시적으로 부여하지 않은 모든 권리를 보유합니다.
-
-3.3 본 라이선스 계약에 명시적으로 허용된 용도 외에는 미리 보기를 사용할 수 없습니다. 해당 제3자 라이선스 요건이 허용하는 범위를 제외하고 계약자는 미리 보기의 일부분을 (a) 복사(백업 목적 제외), 수정, 개작, 재배포, 역컴파일, 리버스 엔지니어링, 분해하거나 이를 통해 파생물을 생성하거나 (b) 개인 컴퓨터를 제외한 모바일 단말기 또는 기타 모든 하드웨어 기기에 미리 보기의 일부를 로드하거나, 미리 보기의 일부를 다른 소프트웨어와 결합하거나 미리 보기의 일부가 통합된 일체의 소프트웨어나 기기를 배포해서는 안 됩니다.
-
-3.4 계약자는 미리 보기에서 파생된 소프트웨어 개발 키트의 배포, 이러한 키트 생성에 참여 또는 홍보를 포함하되 이에 국한되지 않고, Android의 단편화를 야기하는 어떠한 행동도 취하지 않을 것임에 동의합니다.
-
-3.5 오픈 소스 소프트웨어 라이선스에 의거한 미리 보기 구성요소의 사용, 재생산, 배포에는 본 라이선스 계약이 아닌, 해당 오픈 소스 소프트웨어 라이선스의 조건이 적용됩니다. 계약자는 허용된 모든 권한 하에서 그러한 오픈 소스 소프트웨어 라이선스에 관해 충실한 피허가자로서의 자세를 견지할 것이며 그러한 권한을 종료, 일시 중단 또는 침해하는 행위를 삼갈 것을 동의합니다.
-
-3.6 계약자는 Google이 제공하는 SDK의 형태 및 특성이 사전 통지 없이 변경될 수 있음에 동의하며, 이전 버전의 미리 보기에서 개발된 애플리케이션이 이후 버전의 SDK와 호환되지 않을 수 있음에 동의합니다. 계약자는 계약자 또는 사용자에게 사전 통지 없이 SDK(또는 SDK에 포함된 기능) 제공을(영구적 또는 일시적으로) 중단할 수 있는 권한이 Google에게 있음에 동의합니다.
-
-3.7 본 라이선스 계약은 계약자에게 Google의 상표명, 상표, 서비스 표시, 로고, 도메인 이름, 기타 독특한 브랜드 특징에 대한 사용 권한을 부여하지 않습니다.
-
-3.8 계약자는 SDK에 부착되어 있거나 포함되어 있는 모든 소유권 고지 사항(저작권 및 상표 고지 사항 포함)을 제거, 변경 또는 불분명하게 만들지 않을 것에 동의합니다.
-
-4. 계약자의 미리 보기 사용
-
-4.1 Google은 본 라이선스 계약의 어떤 조항도 계약자(또는 계약자의 사용 허가자)가 미리 보기를 사용하여 개발한 소프트웨어 애플리케이션에 대한 권리, 소유권 또는 이익, 그리고 해당 애플리케이션에 존재하는 모든 지적 재산권을 부여하지 않는다는 점에 동의합니다.
-
-4.2 계약자는 (a) 본 라이선스 계약 그리고 (b) 모든 준거법, 규정 또는 관련 관할권 내에서 일반적으로 수용되는 관행 또는 지침(미국 또는 기타 관련 국가로/에서의 데이터 또는 소프트웨어 수출과 관련된 모든 법률 포함)에서 허용하는 용도에 한하여 미리 보기를 사용하고 애플리케이션을 작성하는 것에 동의합니다.
-
-4.3 계약자는 일반 대중 사용자를 대상으로 미리 보기를 사용하여 애플리케이션을 개발하는 경우, 해당 사용자의 프라이버시 및 법적 권리를 보호하는 것에 동의합니다. 사용자가 계약자에게 사용자 이름, 비밀번호 또는 기타 로그인 정보나 개인 정보를 제공하는 경우, 계약자는 제공된 정보가 자신의 애플리케이션에 제공된다는 사실을 사용자에게 알려야 하며, 반드시 법적으로 적절한 개인정보 보호정책 고지 및 보호를 해당 사용자에게 제공해야 합니다. 애플리케이션에서 사용자가 제공한 개인정보나 민감한 정보를 저장하는 경우, 이를 안전하게 처리해야 합니다. 사용자들이 애플리케이션에 Google 계정 정보를 제공하는 경우, 애플리케이션은 해당 사용자의 Google 계정에 액세스하는 목적으로만, 그리고 각 사용자가 허용한 범위 내의 한정된 목적으로만 이러한 정보를 사용해야 합니다.
-
-4.4 계약자는 Google 또는 기타 모든 타사의 서버, 네트워크 또는 기타 모든 재산 또는 서비스를 허가 없이 방해, 교란, 손상 또는 액세스하는 애플리케이션의 개발 또는 배포를 포함한 하등의 행위에 미리 보기를 이용하지 않을 것임을 동의합니다.
-
-4.5 계약자는 자신이 Android 및/또는 Android용 애플리케이션을 통해 생성, 전송 또는 표시하는 모든 데이터, 콘텐츠 또는 리소스 그리고 그로 인한 결과(Google이 입을 수 있는 모든 피해나 손실 포함)에 대해 전적으로 책임이 있다는 것(그리고 Google은 계약자 또는 모든 제3자에 대한 책임이 없다는 것)에 동의합니다.
-
-4.6 계약자는 본 라이선스 계약, 모든 해당 제3자 계약 또는 서비스 약관, 또는 모든 준거법 또는 규정에 의거한 계약자 의무 위반, 그리고 그로 인한 결과(Google 또는 제3자가 입을 수 있는 모든 피해나 손실 포함)에 전적으로 책임이 있다는 것(그리고 Google은 계약자 또는 모든 제3자에 대한 책임이 없다는 것)에 동의합니다.
-
-4.7 이 미리 보기는 현재 개발 단계에 있으며, 계약자의 테스트와 피드백은 그러한 개발 과정에 중요한 부분을 차지합니다. 미리 보기를 사용함으로써 계약자는 일부 기능의 구현은 아직 개발 중인 상태이며 미리 보기가 안정된 릴리스처럼 완벽하게 기능할 것이라 믿고 사용해서는 안 된다는 점을 인지하는 것으로 간주합니다. 계약자는 이 미리 보기를 사용한 애플리케이션을 공개적으로 배포 또는 배송하지 않기로 동의합니다. 이 미리 보기는 공식 Android SDK가 출시된 이후에는 더 이상 지원되지 않기 때문입니다.
-
-5. 계약자의 개발자 자격 증명
-
-5.1 계약자는 Google이 발급했거나 자신이 선택한 모든 개발자 자격 증명에 대한 기밀성을 유지할 책임이 있으며 계약자의 개발자 자격 증명 하에 개발된 모든 애플리케이션에 대한 전적인 책임이 있음에 동의합니다.
-
-6. 개인정보 보호정책 및 정보
-
-6.1 미리 보기를 지속적으로 혁신하고 개선하기 위해, Google은 고유 식별자, 관련 IP 주소, 소프트웨어 버전 번호, 미리 보기에서 사용 중인 도구 및/또는 서비스와 도구의 사용법에 대한 정보를 포함하되 이에 국한되지 않고 소프트웨어에서 특정 사용량 통계 정보를 수집할 수 있습니다. 그러한 정보를 수집하기 전에 미리 보기는 계약자에게 이를 통지하고 동의를 구할 것입니다. 계약자가 동의하지 않을 경우 정보를 수집하지 않습니다.
-
-6.2 수집된 데이터는 모두 취합된 형태로 미리 보기 개선을 위해 검토되며, Google의 개인정보 보호정책에 따라 유지 관리됩니다. 이 정보는 http://www.google.com/policies/privacy/를 참조하십시오.
-
-7. 제3자 애플리케이션
-
-7.1 제3자가 개발한 애플리케이션을 실행하거나 제3자가 제공한 데이터, 콘텐츠 또는 리소스에 액세스하기 위해 미리 보기를 사용하는 경우, 계약자는 Google이 그러한 애플리케이션, 데이터, 콘텐츠 또는 리소스에 대한 책임이 없음에 동의합니다. 계약자는 그러한 제3자 애플리케이션을 통해 자신이 액세스한 모든 데이터, 콘텐츠 또는 리소스에 대한 책임은 그것을 만든 사람에게 있음에 동의합니다. 또한 계약자가 그러한 모든 제3자 애플리케이션, 데이터, 콘텐츠 또는 리소스를 사용하거나 액세스함으로써 비롯된 모든 피해나 손실에 대한 책임이 Google에게 없음에 동의합니다.
-
-7.2 그러한 제3자 애플리케이션을 통해 계약자에게 제공된 데이터, 콘텐츠 그리고 리소스는 그것을 제공한 제공자(또는 제공자를 대신하는 기타 개인 또는 기업)가 소유한 지적 재산권에 의해 보호될 수 있음을 유의해야 합니다. 그러한 데이터, 콘텐츠 또는 리소스(전부 또는 일부)를 수정, 임대, 리스, 대여, 판매, 배포하거나 이를 기반으로 파생물을 생성해서는 안 됩니다. 단, 관련 소유자로부터 그러한 작업을 수행해도 좋다는 허락을 받은 경우에는 예외입니다.
-
-7.3 계약자는 그러한 제3자 애플리케이션, 데이터, 콘텐츠 또는 리소스의 사용은 계약자와 관련 제3자 간에 체결하는 별도의 계약 조건의 적용을 받는다는 것을 인정합니다.
-
-8. Google API 사용
-
-8.1 Google Data API
-
-8.1.1 Google에서 데이터를 검색하기 위해 API를 사용하는 경우, 그러한 데이터가 Google 또는 데이터를 제공하는 당사자(또는 당사자를 대신하는 기타 개인 또는 기업)가 소유한 지적 재산권에 의해 보호될 수 있음을 인정합니다. 그러한 API를 사용하는 경우, 추가적인 서비스 약관의 적용을 받을 수 있습니다. 관련 서비스 약관에 허용되지 않은 한, 그러한 데이터(전부 또는 일부)를 변경, 임대, 리스, 대여, 판매, 배포하거나 이를 기반으로 파생물을 생성해서는 안 됩니다.
-
-8.1.2 Google에서 사용자 데이터를 검색하기 위해 API를 사용하는 경우, 계약자는 사용자로부터 명시적인 동의를 얻은 경우에 한하여, 그리고 해당 사용자가 허용한 범위 내의 한정된 목적으로만 데이터를 검색해야 합니다.
-
-9. 라이선스 계약 종료
-
-9.1 본 라이선스 계약은 계약자 또는 Google에 의해 아래와 같은 조건 하에 종료될 때까지 계속 적용됩니다.
-
-9.2 계약자가 라이선스 계약을 종료하고자 하는 경우, 미리 보기 및 관련 개발자 자격 증명 일체의 사용을 중단하는 것으로 그러한 의사를 피력할 수 있습니다.
-
-9.3 Google은 언제든 이유 여하를 불문하고 계약자에게 통고하여 라이선스 계약을 종료할 수 있습니다.
-
-9.4 본 라이선스 계약은 통보 또는 여타의 행위 없이도 자동으로 종료됩니다. 이에 해당되려면 다음과 같은 조건이 수반되어야 합니다.
-(A) Google이 계약자가 거주하는 국가 또는 계약자가 서비스를 사용하는 지역에서 미리 보기 또는 미리 보기의 특정 부분 제공을 중지하는 경우 및
-(B) Google이 Android SDK의 최종 릴리스 버전을 발행하는 경우.
-
-9.5 본 라이선스 계약이 종료되면 라이선스 계약으로 계약자에게 허용한 라이선스가 취소되며, 이에 따라 계약자는 미리 보기 사용을 즉시 모두 중단해야 하고 제 10, 11, 12 및 14절의 조항이 기한 없이 유지됩니다.
-
-10. 면책 조항
-
-10.1 계약자는 미리 보기 이용에 대한 위험 부담이 전적으로 본인에게 있으며, Google이 일체의 보증 없이 미리 보기를 "있는 그대로" 그리고 "이용 가능한" 상태로 제공한다는 것을 분명히 이해하고 동의합니다.
-
-10.2 미리 보기 이용 및 이용 과정에서 다운로드하거나 얻게 되는 모든 자료를 사용하는 것은 본인의 재량에 따르며 이에 대한 위험 부담이 전적으로 본인에게 있으며, 그러한 사용으로 인해 발생하는 컴퓨터 시스템 또는 다른 기기의 손상 또는 데이터 손실에 대한 책임은 전적으로 본인에게 있습니다. 전술한 조항을 제한하지 않는 범위 내에서 계약자는 미리 보기가 안정된 릴리스가 아니며 오류, 결함 및 보안 취약성이 포함되어 있을 수 있어 그 결과로 중대한 손상을 유발할 수 있다는 점을 이해하는 것으로 간주합니다. 여기에는 계약자의 컴퓨터 시스템 또는 기타 기기의 완전하고 돌이킬 수 없는 손실도 포함됩니다.
-
-10.3 더 나아가, Google은 상품성, 특정 목적에 대한 적합성 및 비침해의 묵시적 보증 등을 포함하되 이에 국한되지 않고 명시적이든 묵시적이든 모든 종류의 보증 및 조건을 명시적으로 부인합니다.
-
-11. 책임 한계
-
-11.1 계약자는 계약자에게 발생할 수 있는 직접, 간접, 부수적, 특별, 결과적 또는 징벌적 손해에 대해 그 어떤 책임 이론에 근거해서도 Google, 해당 자회사, 계열사 및 사용 허가자가 어떠한 책임도 지지 아니함을 분명히 이해하고 동의합니다. 이러한 손해에는 Google 또는 해당 대리자가 이러한 손실 발생 가능성에 대해 통지를 받았거나 이러한 사항을 인식했는지에 상관없이 모든 데이터 손실이 포함됩니다.
-
-12. 면책
-
-12.1 법률에 의해 허용되는 최대한의 범위 안에서 계약자는 (a) 미리 보기 사용, (b) 계약자가 미리 보기에서 개발한 일체의 애플리케이션에서 초래된 모든 사람의 저작권, 상표, 영업비밀, 트레이드 드레스, 특허 또는 기타 지적 재산권의 침해, 또는 어떤 사람의 명예를 훼손하거나 초상권 또는 개인정보 보호정책을 침해함 또는 (C)계약자 본인이 본 라이선스 계약을 위반함으로써 발생하거나 생기는 모든 청구, 조치, 소송 또는 절차, 그리고 모든 손실, 책임, 손해, 경비(합리적인 변호사 비용 포함)로부터 Google을 옹호하고, 면책시키고, Google이 손해를 입지 않도록 하는 데 동의합니다.
-
-13. 라이선스 계약 변경
-
-13.1 미리 보기의 새로운 버전을 배포할 때, Google은 본 라이선스 계약의 내용을 변경할 수 있습니다. 그러한 변경이 이뤄진 경우, Google은 미리 보기가 제공되는 웹사이트에 새로운 라이선스 계약 버전을 게재할 것입니다.
-
-14. 일반 법적 조건
-
-14.1 본 라이선스 계약은 계약자와 Google 간의 모든 법적 계약을 구성하며, 계약자의 미리 보기 사용을 규제하고(별도의 서면 계약을 통해 Google이 계약자에게 제공하는 모든 서비스는 제외), 미리 보기와 관련하여 이전에 계약자와 Google이 맺은 모든 계약을 완전히 대체합니다.
-
-14.2 계약자는 Google이 라이선스 계약에 포함된(또는 관련 법률에 의해 Google이 향유하는) 법적 권리 또는 구제수단을 행사하거나 집행하지 않더라도, Google이 권리를 공식적으로 포기한 것으로 간주하지 않으며, Google이 계속해서 그러한 권리 또는 구제수단을 이용할 수 있음에 동의합니다.
-
-14.3 본 라이선스 계약의 조항이 무효라고 이 사안에 관한 판결을 할 수 있는 관할권을 가진 법원이 판결할 경우, 그 조항은 라이선스 계약의 나머지 조항에 영향을 미치지 않는 형태로 라이선스 계약에서 제거됩니다. 본 라이선스 계약의 나머지 조항은 여전히 유효하며 집행 가능합니다.
-
-14.4 계약자는 Google이 모회사가 되는 회사 그룹에 속한 각 회사가 본 라이선스 계약의 제3수익자이며, 그러한 다른 회사들이 그들에게 이익(또는 유리한 권리)을 부여하는 본 라이선스 계약의 모든 조항을 직접 행사하고 적용할 수 있는 권리를 가진다는 데 동의합니다. 그 외에는 다른 어떤 개인이나 회사도 본 라이선스 계약의 제3수익자가 될 수 없습니다.
-
-14.5 수출 규제. 미리 보기는 미국의 수출법과 규정의 적용을 받습니다. 계약자는 미리 보기에 적용되는 모든 국내 및 국제 수출법과 규정을 준수해야 합니다. 그러한 법에는 수출 대상국, 최종 사용자 및 최종 용도에 대한 제한이 포함됩니다.
-
-14.6 계약자 또는 Google은 상대 당사자의 사전 서면 승인 없이 본 라이선스 계약에서 부여된 권리를 제3자에게 양도하거나 이전할 수 없으며, 그러한 승인 없이 이루어진 양도 시도는 모두 무효입니다. 계약자는 Google의 사전 승인 없이 본 라이선스 계약 상의 책임 또는 의무를 위임할 수 없습니다.
-
-14.7 본 라이선스 계약, 그리고 본 라이선스 계약 상의 계약자와 Google의 관계는 법률 조항 간의 충돌과는 무관하게 캘리포니아주법에 의한 규제를 받습니다. 계약자와 Google은 본 라이선스 계약으로부터 발생하는 모든 법적 문제 해결을 캘리포니아주 산타 클라라(Santa Clara) 카운티 내에 소재한 전속 관할 법원에 의뢰하는 것에 동의합니다. 위 규정에도 불구하고, 계약자는 Google이 여전히 모든 관할권에서 강제 구제책(또는 동등한 유형의 긴급 법적 구제)을 신청할 수 있음에 동의합니다.
-  </div><!-- sdk terms -->
-
-
-
-    <div id="sdk-terms-form">
-      <p>
-        <input id="agree" type="checkbox" name="agree" value="1" onclick="onAgreeChecked()" />
-        <label id="agreeLabel" for="agree">본인은 상기 사용 약관을 읽었으며 이에 동의합니다.</label>
-      </p>
-      <p><a href="" class="button disabled" id="downloadForRealz" onclick="return onDownloadForRealz(this);"></a></p>
-    </div>
-
-
-  </div><!-- end TOS -->
-
-
-  <div id="landing">
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>이 문서의 내용</h2>
-      <ol>
-        <li><a href="#sdk">미리 보기 SDK</a></li>
-        <li><a href="#docs">개발자 관련 문서</a></li>
-        <li><a href="#images">하드웨어 시스템 이미지</a></li>
-      </ol>
-
-     <h2>Legacy downloads</h2>
-        <ol>
-           <li><a href="{@docRoot}preview/download_mp1.html">Developer Preview Archive</a></li>
-        </ol>
-  </div>
-</div>
-
-
-<p>
-  Android M 미리 보기 SDK에는 개발 도구, Android 시스템 파일 및 라이브러리 파일이 포함되어 있어 앱을 테스트하고 플랫폼의 다음 릴리스에 도입되는 새 API를 테스트하는 데 유용합니다.
- 이 문서에서는 미리 보기의 다운로드할 수 있는 구성 요소를 가져와 앱을 테스트하는 방법에 대해 설명합니다.
-
-</p>
-
-
-<h2 id="sdk">미리 보기 SDK</h2>
-
-<p>
-  미리 보기 SDK는 <a href="{@docRoot}tools/help/sdk-manager.html">Android SDK Manager</a>를 통해 다운로드할 수 있습니다. 미리 보기 SDK를 다운로드하고 구성하는 데 관한 자세한 정보는 <a href="{@docRoot}preview/setup-sdk.html#downloadSdk">미리 보기 SDK 설정하기</a>를 참조하십시오.
-
-</p>
-
-
-<h2 id="docs">개발자 관련 문서</h2>
-
-<p>
-  개발자 관련 문서 다운로드 패키지에서는 자세한 API 참조 정보와 미리 보기에 대한 API 차이점 보고서를 제공합니다.
-</p>
-
-<table>
-  <tr>
-    <th scope="col">Description</th>
-    <th scope="col">Download / Checksums</th>
-  </tr>
-  <tr id="docs-dl">
-    <td>Android M Preview 2<br>Developer Docs</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >m-preview-2-developer-docs.zip</a><br>
-      MD5: 1db6fff9c722b0339757e1cdf43663a8<br>
-      SHA-1: 5a4ae88d644e63824d21b0e18f8e3977a7665157
-    </td>
-  </tr>
-</table>
-
-
-<h2 id="images">하드웨어 시스템 이미지</h2>
-
-<p>
-  이러한 시스템 이미지를 사용하면 물리적인 기기에서 플랫폼의 미리 보기 버전을 설치하여 테스트할 수 있게 해줍니다.
- 이러한 이미지 중 한 가지로 기기를 구성하면, 앱을 설치하고 테스트하여 앱이 플랫폼의 다음 버전에서 어떤 성능을 보일지 확인할 수 있습니다.
- 기기에 시스템 이미지를 설치하는 과정은<em>기기에서 모든 데이터를 제거하므로</em>, 시스템 이미지를 설치하기에 앞서 데이터를 백업하는 것이 좋습니다.
-
-
-</p>
-
-<p class="warning">
-  <b>경고:</b> 다음 Android 시스템 이미지는 미리 보기이며 사정에 따라 변동될 수 있습니다. 이러한 시스템 이미지를 사용할 때에는 Android SDK 미리 보기 라이선스 계약을 따라야 합니다.
- Android 미리 보기 시스템 이미지는 안정된 릴리스가 아니며, 오류나 결함이 들어있을 수 있고 이 때문에 컴퓨터 시스템, 기기 및 데이터에 손상을 초래할 수 있습니다.
-
- 미리 보기 Android 시스템 이미지는 공장 OS와 같은 테스트를 거치며 전화기 및 설치된 서비스와 애플리케이션의 작동이 중단되는 결과를 낳을 수 있습니다.
-
-
-</p>
-
-<table>
-  <tr>
-    <th scope="col">Device</th>
-    <th scope="col">Download / Checksums</th>
-  </tr>
-  <tr id="hammerhead">
-    <td>Nexus 5 (GSM/LTE) <br>"hammerhead"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >hammerhead-MPZ79M-preview-b1f4bde4.tgz</a><br>
-      MD5: 2ca9f18bf47a061b339bab52647ceb0d<br>
-      SHA-1: b1f4bde447eccbf8ce5d9b8b8ba954e3eac8e939
-    </td>
-  </tr>
-  <tr id="shamu">
-    <td>Nexus 6 <br>"shamu"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >shamu-MPZ79M-preview-e1024040.tgz</a><br>
-      MD5: 24a2118da340b9afedfbdfc026f6ff81<br>
-      SHA-1: e10240408859d5188c4aae140e1c539130ba614b
-    </td>
-  </tr>
-  <tr id="volantis">
-    <td>Nexus 9 <br>"volantis"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >volantis-MPZ79M-preview-9f305342.tgz</a><br>
-      MD5: 9edabf0a4c61b247f1cbb9dfdc0a899e<br>
-      SHA-1: 9f30534216f10899a6a75495fc7e92408ea333a7
-    </td>
-  </tr>
-
-  <tr id="fugu">
-    <td>Nexus Player <br>"fugu"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >fugu-MPZ79N-preview-fb63af98.tgz</a><br>
-      MD5: e8d081137a20b66df595ee69523314b5<br>
-      SHA-1: fb63af98302dd97be8de9313734d389ccdcce250
-    </td>
-  </tr>
-
-</table>
-
-<h3 id="install-image">기기에 이미지 설치</h3>
-
-<p>
-  기기 이미지를 테스트용으로 사용하려면, 이를 호환되는 기기에 설치해야만 합니다. 시스템 이미지를 설치하려면 아래의 지침을 따르십시오.
-
-</p>
-
-<ol>
-  <li>여기 목록에 나열된 시스템 이미지 중 하나를 다운로드하여 압축을 해제합니다.</li>
-  <li>기기에서 보존하고자 하는 데이터를 모두 백업합니다.</li>
-  <li>이미지를 기기에 플래시하려면 <a href="https://developers.google.com/android/nexus/images#instructions">developers.google.com/android</a>에 있는 지침을 따릅니다.
-
-</li>
-</ol>
-
-<p class="note">
-  <strong>참고:</strong> 일단 개발 기기에 미리 보기 시스템 이미지를 플래시하고 나면 이것은 OTA(over-the-air) 업데이트를 통해 다음 미리 보기 릴리스에 맞춰 자동으로 업그레이드됩니다.
-
-</p>
-
-<h3 id="revertDevice">기기를 공장 사양으로 되돌리기</h3>
-
-<p>
-  미리 보기의 설치를 제거하고 기기를 공장 사양으로 되돌리고자 하는 경우, <a href="http://developers.google.com/android/nexus/images">developers.google.com/android</a>를 방문하여 기기에 플래시하고자 하는 이미지를 다운로드하십시오.
-
- 해당 페이지에 있는 지침을 따라 기기에 이미지를 플래시하면 됩니다.
-
-</p>
-
-  </div><!-- landing -->
-
-</div><!-- relative wrapper -->
-
-
-
-<script>
-  var urlRoot = "http://storage.googleapis.com/androiddevelopers/shareables/preview/";
-  function onDownload(link) {
-
-    $("#downloadForRealz").html("Download " + $(link).text());
-    $("#downloadForRealz").attr('href', urlRoot + $(link).text());
-
-    $("#tos").fadeIn('fast');
-    $("#landing").fadeOut('fast');
-
-    return true;
-  }
-
-
-  function onAgreeChecked() {
-    /* verify that the TOS is agreed */
-    if ($("input#agree").is(":checked")) {
-      /* reveal the download button */
-      $("a#downloadForRealz").removeClass('disabled');
-    } else {
-      $("a#downloadForRealz").addClass('disabled');
-    }
-  }
-
-  function onDownloadForRealz(link) {
-    if ($("input#agree").is(':checked')) {
-    /*
-      $("#tos").fadeOut('fast');
-      $("#landing").fadeIn('fast');
-    */
-
-      ga('send', 'event', 'M Preview', 'System Image', $("#downloadForRealz").html());
-
-    /*
-      location.hash = "";
-    */
-      return true;
-    } else {
-      return false;
-    }
-  }
-
-  $(window).hashchange( function(){
-    if (location.hash == "") {
-      location.reload();
-    }
-  });
-
-</script>
diff --git a/docs/html-intl/intl/ko/preview/features/background-optimization.jd b/docs/html-intl/intl/ko/preview/features/background-optimization.jd
deleted file mode 100644
index 3bbc474..0000000
--- a/docs/html-intl/intl/ko/preview/features/background-optimization.jd
+++ /dev/null
@@ -1,391 +0,0 @@
-page.title=백그라운드 최적화
-page.metaDescription=암시적 브로드캐스트에 대한 새로운 제한.
-page.keywords="android N", "implicit broadcasts", "job scheduler"
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>
-      이 문서의 내용
-    </h2>
-
-    <ol>
-      <li>
-        <a href="#connectivity-action">CONNECTIVITY_ACTION에 대한 제한</a>
-      </li>
-
-      <li>
-        <a href="#sched-jobs">무제한 연결에서 네트워크 작업
-예약</a>
-      </li>
-
-      <li>
-        <a href="#monitor-conn">앱이 실행되는 중에 네트워크 연결
-모니터링</a>
-      </li>
-
-      <li>
-        <a href="#media-broadcasts">NEW_PICTURE 및 NEW_VIDEO에
-대한 제한</a>
-      </li>
-
-      <li>
-        <a href="#new-jobinfo">새로운 JobInfo 메서드</a>
-      </li>
-
-      <li>
-        <a href="#new-jobparam">새로운 JobParameter 메서드</a>
-      </li>
-
-      <li>
-        <a href="#further-optimization">추가적인 앱 최적화</a>
-      </li>
-    </ol>
-  </div>
-</div>
-
-<p>
-  백그라운드 프로세스는 메모리와 배터리를 많이 소모할 수 있습니다. 예를 들어, 암시적 브로드캐스트는
-이 브로드캐스트를 수신하도록 등록된 많은 백그라운드 프로세스를 시작할 수 있지만
-해당 프로세스가 많은 작업을 수행하지 못할 경우가 있습니다. 이로 인해 기기 성능과
- 사용자 환경에 모두 상당한 영향을 미칠 수 있습니다.
-</p>
-
-<p>
-  이 문제를 완화하기 위해, Android N은 다음과 같은 제한을
-적용합니다.
-</p>
-
-<ul>
-  <li>브로드캐스트를 수신하도록 매니페스트에 등록되어 있더라도, Preview를 대상으로 하는 앱은 {@link
- android.net.ConnectivityManager#CONNECTIVITY_ACTION}
- 브로드캐스트를 수신하지 않습니다. 실행 중인 앱은 {@link android.content.Context#registerReceiver Context.registerReceiver()}로
-{@link android.content.BroadcastReceiver}를 등록하여
-여전히 기본 스레드에서 {@code CONNECTIVITY_CHANGE}를 수신할
- 수 있습니다.
-  </li>
-
-  <li>앱은 {@link
- android.hardware.Camera#ACTION_NEW_PICTURE} 또는 {@link
- android.hardware.Camera#ACTION_NEW_VIDEO} 브로드캐스트를 송수신할 수 없습니다. 이 최적화는 Preview를 대상으로
- 하는 앱뿐 아니라 모든 앱에 영향을 미칩니다.
-  </li>
-</ul>
-
-<p>
-  앱이 이들 인텐트 중 하나라도 사용하는 경우에는,
-Android N 기기를 올바로 대상으로 삼을 수 있도록 이들 인텐트에 대한 종속성을 최대한 빨리 제거해야 합니다.
-  Android 프레임워크는 이러한 암시적 브로드캐스트의
- 필요성을 줄이기 위한 여러 가지 해결책을 제공합니다. 예를 들어, {@link android.app.job.JobScheduler}
-및 <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-  {@code GcmNetworkManager}</a>는 지정된
-조건(예: 비 데이터 통신 네트워크에 연결)이 충족될 경우 네트워크 작업을
-예약할 수 있는 강력한 메커니즘을 제공합니다. 이제 {@link android.app.job.JobScheduler}를
-사용하여 콘텐츠 제공자의 변경에 대응할 수도 있습니다. {@link android.app.job.JobInfo}
-객체는 {@link android.app.job.JobScheduler}가
-작업 예약에 사용하는 매개변수를 캡슐화합니다. 작업 조건이 충족되면 시스템은
-이 작업을 앱의 {@link android.app.job.JobService}에서 실행합니다.
-</p>
-
-<p>
-  이 문서에서는 대체 메서드(예: {@link android.app.job.JobScheduler})를
-사용하여 이러한 새로운 제한에 맞게 앱을 적용하는 방법에 대해
-배워보겠습니다.
-</p>
-
-<h2 id="connectivity-action">
-  CONNECTIVITY_ACTION에 대한 제한
-</h2>
-
-<p>
-  Android N을 대상으로 하는 앱은 {@link
- android.net.ConnectivityManager#CONNECTIVITY_ACTION} 브로드캐스트를 수신하지 않으며(이 브로드캐스트를 수신하도록 매니페스트에 등록하는 경우), 이
-브로드캐스트에 의존하는 프로세스는
-시작되지 않습니다. 이 경우에는 기기가 고정 요금제 네트워크에 연결될 때,
-네트워크 변경 사항을 수신하려는 앱이나 대량의 네트워크 액티비티를
-수행하려는 앱에 문제가 생길 수 있습니다. 이 제한을 해결하기 위한 여러 가지
-해결책이 Android 프레임워크에 이미 있지만, 올바른 해결책을 선택하는 것은
-앱의 용도에 따라 다릅니다.
-</p>
-
-<p class="note">
-  <strong>참고:</strong> {@link android.content.Context#registerReceiver Context.registerReceiver()}로
- 등록된 {@link android.content.BroadcastReceiver}는 앱이
- 실행되는 중에 계속해서 이 브로드캐스트를 수신합니다.
-</p>
-
-<h3 id="sched-jobs">
-  고정 요금제 연결에서 네트워크 작업 예약
-</h3>
-
-<p>
-  {@link android.app.job.JobInfo.Builder JobInfo.Builder} 클래스를
-사용하여 {@link android.app.job.JobInfo} 객체를 빌드하는 경우, {@link
-  android.app.job.JobInfo.Builder#setRequiredNetworkType
-  setRequiredNetworkType()} 메서드를 적용하고 {@link android.app.job.JobInfo
-  JobInfo.NETWORK_TYPE_UNMETERED}를 작업 매개변수로 전달합니다. 다음의 코드 샘플에서는 기기가 비 데이터 통신
-네트워크에 연결되어 충전 중일 때 실행할 서비스를
-예약합니다.
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-      (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo job = new JobInfo.Builder(
-    MY_BACKGROUND_JOB,
-    new ComponentName(context, MyJobService.class))
-      .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
-      .setRequiresCharging(true)
-      .build();
-  js.schedule(job);
-}
-</pre>
-
-<p>
-  작업의 조건이 충족되면, 앱은
-{@link android.app.job.JobService#onStartJob onStartJob()} 메서드를 지정된 {@code JobService.class}에서 실행하기 위한 콜백을
-수신합니다. {@link
-  android.app.job.JobScheduler} 구현의 더 많은 예를 보려면, <a href="{@docRoot}samples/JobScheduler/index.html">JobScheduler 샘플 앱</a>을 참조하세요.
-</p>
-
-<p>
-  GMSCore 서비스를 사용하고 Android 5.0(API 레벨 21) 이하를 대상으로 하는 앱은 <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-{@code GcmNetworkManager}</a>를 사용하고 {@code Task.NETWORK_STATE_UNMETERED}를
-지정할 수 있습니다.
-</p>
-
-<h3 id="monitor-conn">
-  앱이 실행되는 중에 네트워크 연결 모니터링
-</h3>
-
-<p>
-  실행 중인 앱은 등록된 {@link android.content.BroadcastReceiver}로 {@code CONNECTIVITY_CHANGE}를 여전히 수신할 수
-있습니다. 하지만 {@link
- android.net.ConnectivityManager} API는 지정된 네트워크 조건이 충족될 경우에만 콜백을 요청하는
- 더욱 강력한 메서드를 제공합니다.
-</p>
-
-<p>
-  {@link android.net.NetworkRequest} 객체는 {@link android.net.NetworkCapabilities}의
-관점에서 네트워크 콜백의 매개변수를 정의합니다. {@link
-  android.net.NetworkRequest.Builder NetworkRequest.Builder} 클래스로 {@link android.net.NetworkRequest} 객체를
-생성합니다. 이어서 {@link
-  android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,
-  android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()}
-이 {@link android.net.NetworkRequest} 객체를 시스템에 전달합니다. 네트워크 조건이 충족되면, 앱은 {@link
-  android.net.ConnectivityManager.NetworkCallback} 클래스에 정의된 {@link android.net.ConnectivityManager.NetworkCallback#onAvailable
-  onAvailable()} 메서드를
-실행하기 위한 콜백을
-수신합니다.
-</p>
-
-<p>
-  앱이 종료되거나 앱이 {@link android.net.ConnectivityManager#unregisterNetworkCallback
-  unregisterNetworkCallback()}을 호출할 때까지 계속해서
-콜백을 수신합니다.
-</p>
-
-<h2 id="media-broadcasts">
-  NEW_PICTURE 및 NEW_VIDEO에 대한 제한
-</h2>
-
-<p>
-  Android N에서 앱은 {@link
- android.hardware.Camera#ACTION_NEW_PICTURE} 또는 {@link
- android.hardware.Camera#ACTION_NEW_VIDEO} 브로드캐스트를 송수신할 수 없습니다. 이 제한은 새로운 이미지나
- 동영상을 처리하기 위해 여러 앱을 깨워야 하는 경우, 성능 및 사용자 환경에
- 미치는 영향을 줄여줍니다. Android N은
- {@link android.app.job.JobInfo} 및 {@link
- android.app.job.JobParameters}를 확장하여 대체 해결책을 제공합니다.
-</p>
-
-<h3 id="new-jobinfo">
-  새로운 JobInfo 메서드
-</h3>
-
-<p>
-  콘텐츠 URI 변경에 대한 작업을 트리거하기 위해, Android N은
- 다음과 같은 메서드로 {@link android.app.job.JobInfo} API를 확장합니다.
-</p>
-
-<dl>
-  <dt>
-    {@code JobInfo.TriggerContentUri()}
-  </dt>
-
-  <dd>
-    콘텐츠 URI 변경에 대한 작업을 트리거하는 데 필요한 매개변수를 캡슐화합니다.
-  </dd>
-
-  <dt>
-    {@code JobInfo.Builder.addTriggerContentUri()}
-  </dt>
-
-  <dd>
-    {@code TriggerContentUri} 객체를 {@link
-    android.app.job.JobInfo}에 전달합니다. {@link android.database.ContentObserver}는
-캡슐화된 콘텐츠 URI를 모니터링합니다. 하나의 작업과 연관된 여러 {@code
-    TriggerContentUri} 객체가 있는 경우, 콘텐츠 URI 중 하나에서만 변경이 보고되더라도 시스템이
-콜백을 제공합니다.
-  </dd>
-
-  <dd>
-    지정된 URI의 하위 항목이 하나라도 변경되면, {@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS} 플래그를
-추가하여 작업을 트리거합니다. 이 플래그는
-{@link
-    android.content.ContentResolver#registerContentObserver
-    registerContentObserver()}로 전달된 {@code notifyForDescendants} 매개변수에 해당합니다.
-  </dd>
-</dl>
-
-<p class="note">
-  <strong>참고:</strong> {@code TriggerContentUri()}는 {@link android.app.job.JobInfo.Builder#setPeriodic
-  setPeriodic()} 또는 {@link android.app.job.JobInfo.Builder#setPersisted
-  setPersisted()}와
-조합으로 사용될 수 없습니다. 콘텐츠 변경을 계속해서 모니터링하려면, 앱의 {@link
-  android.app.job.JobService}가 가장 최근 콜백의 처리를 완료하기 전에 새로운
-{@link android.app.job.JobInfo}를 예약하세요.
-</p>
-
-<p>
-  다음 샘플 코드에서는 콘텐츠 URI, {@code MEDIA_URI}의
-변경을 시스템이 보고할 때 트리거할 작업을 예약합니다.
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-          (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo.Builder builder = new JobInfo.Builder(
-          MY_BACKGROUND_JOB,
-          new ComponentName(context, MediaContentJob.class));
-  builder.addTriggerContentUri(
-          new JobInfo.TriggerContentUri(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
-          JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
-  js.schedule(builder.build());
-}
-</pre>
-<p>
-  지정된 콘텐츠 URI에서의 변경을 시스템이 보고할 때,
-앱이 콜백을 수신하고 {@link android.app.job.JobParameters} 객체가
-{@code MediaContentJob.class}의 {@link android.app.job.JobService#onStartJob onStartJob()}메서드에
-전달됩니다.
-</p>
-
-<h3 id="new-jobparam">
-  새로운 JobParameter 메서드
-</h3>
-
-<p>
-  또한, Android N에서는 어떤 콘텐츠 기관과
- URI가 해당 작업을 트리거했는지에 대한 유용한 정보를 앱이
- 수신할 수 있도록 {@link android.app.job.JobParameters}를 확장합니다.
-</p>
-
-<dl>
-  <dt>
-    {@code Uri[] getTriggeredContentUris()}
-  </dt>
-
-  <dd>
-    작업을 트리거한 URI의 배열을 반환합니다. 작업을 트리거한
-URI가 없거나(예: 시한 또는 기타 이유로 인해 작업이 트리거된 경우) 또는
-변경된 URI의 수가 50보다 크면 {@code
-    null}이 됩니다.
-  </dd>
-
-  <dt>
-    {@code String[] getTriggeredContentAuthorities()}
-  </dt>
-
-  <dd>
-    작업을 트리거한 콘텐츠 기관의 문자열 배열을 반환합니다.
-    반환된 배열이 {@code null}이 아닌 경우, {@code getTriggeredContentUris()}를
-사용하여 변경된 URI의 세부정보를 검색합니다.
-  </dd>
-</dl>
-
-<p>
-  다음 샘플 코드에서는 {@link
-  android.app.job.JobService#onStartJob JobService.onStartJob()} 메서드를 재정의하고
-, 작업을 트리거한 콘텐츠 기관과 URI를 기록합니다.
-</p>
-
-<pre>
-&#64;Override
-public boolean onStartJob(JobParameters params) {
-  StringBuilder sb = new StringBuilder();
-  sb.append("Media content has changed:\n");
-  if (params.getTriggeredContentAuthorities() != null) {
-      sb.append("Authorities: ");
-      boolean first = true;
-      for (String auth :
-          params.getTriggeredContentAuthorities()) {
-          if (first) {
-              first = false;
-          } else {
-             sb.append(", ");
-          }
-           sb.append(auth);
-      }
-      if (params.getTriggeredContentUris() != null) {
-          for (Uri uri : params.getTriggeredContentUris()) {
-              sb.append("\n");
-              sb.append(uri);
-          }
-      }
-  } else {
-      sb.append("(No content)");
-  }
-  Log.i(TAG, sb.toString());
-  return true;
-}
-</pre>
-
-<h2 id="further-optimization">
-  추가적인 앱 최적화
-</h2>
-
-<p>
-  저용량 메모리 기기나 저용량 메모리 조건에서
-앱이 실행되도록 최적화하면 성능과 사용자 환경을 개선할 수 있습니다. 백그라운드 서비스에 대한 종속성과 정적으로 등록된
- 암시적 브로드캐스트 수신기에 대한 종속성을 제거하면 해당 기기에서 앱을
- 더욱 빨리 실행할 수 있습니다. Android N은 이러한 문제 중 일부를 줄이기 위한
- 조치를 취하고 있지만, 백그라운드
- 프로세스를 전혀 사용하지 않고 앱이 실행되도록
- 최적화하는 것이 좋습니다.
-</p>
-
-<p>
-  Android N에서는 백그라운드 프로세스를
-비활성화하고 앱 동작을 테스트하는 데 사용할 수 있는 몇 가지 추가적인 <a href="{@docRoot}tools/help/adb.html">ADB(Android 디버그 브리지)</a> 명령을 도입했습니다.
-</p>
-
-<ul>
-  <li>암시적 브로드캐스트와 백그라운드 서비스를 사용할
-수 없는 조건을 시뮬레이션하려면 다음 명령을 입력합니다.
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set &lt;package&gt; RUN_IN_BACKGROUND ignore}
-</pre>
-  </li>
-
-  <li>암시적 브로드캐스트와 백그라운드 서비스를 다시 활성화하려면
-다음 명령을 입력합니다.
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set &lt;package&gt; RUN_IN_BACKGROUND allow}
-</pre>
-  </li>
-</ul>
diff --git a/docs/html-intl/intl/ko/preview/features/icu4j-framework.jd b/docs/html-intl/intl/ko/preview/features/icu4j-framework.jd
deleted file mode 100644
index 921873d..0000000
--- a/docs/html-intl/intl/ko/preview/features/icu4j-framework.jd
+++ /dev/null
@@ -1,159 +0,0 @@
-page.title=ICU4J Android 프레임워크 API
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>이 문서의 내용</h2>
-<ol>
-    <li><a href="#relation">ICU4J와의 관계</a></li>
-    <li><a href="#migration">android.icu API에서 ICU4J로 마이그레이션</a></li>
-    <li><a href="#licence">라이선스</a></li>
-</ol>
-
-<h2>참고 항목</h2>
-<ol>
-  <li>
-    <a class="external-link" href="http://userguide.icu-project.org">ICU4J 문서</a>
-  </li>
-
-  <li>
-    <a class="external-link" href="http://site.icu-project.org/#TOC-What-is-ICU-">
-ICU4J가 지원하는 최신 표준</a>
-  </li>
-</ol>
-</div>
-</div>
-
-<p>
-  ICU4J는 오픈 소스이며 널리 사용되는 Java 라이브러리 세트로, 소프트웨어 애플리케이션에 유니코드와
-세계화 지원을 제공합니다. Android N은
-Android 프레임워크에서 앱 개발자가
-{@code android.icu} 패키지에서 사용할 수 있는 ICU4J API의 하위 세트를 노출합니다. 이 API는
-기기의 현지화 데이터를 사용합니다. 따라서 ICU4J 라이브러리를 APK로 컴파일하지 않고
-프레임워크에서 호출하여APK
-풋프린트를 줄일 수 있습니다. (이 경우, Android N 이하 버전의 Android를
-실행하는 사용자가 ICU4J 라이브러리를 포함한 앱 버전을 다운로드할 수 있도록
-<a href="{@docRoot}google/play/publishing/multiple-apks.html">여러 버전의
-APK</a>를 제공해야 할 수도 있습니다.)
-</p>
-
-<p>
-  이 문서에서는 먼저 이 라이브러리 지원에 필요한 최소
-Android API 레벨과 관련된 몇 가지 기본 정보를 제공합니다. 그 후,
-각 Android에서 ICU4J를 구현하는 데 무엇이 필요한지 설명합니다. 마지막으로,
-Android 프레임워크에서 ICU4J API를 사용하는 방법을 설명합니다.
-</p>
-
-<h2 id="relation">ICU4J와의 관계</h2>
-
-<p>
-  Android N은
-<code>com.ibm.icu</code>가 아니라 <code>android.icu</code> 패키지를 통해 ICU4J API의 하위 세트를 노출합니다.
-Android 프레임워크는 여러 가지 이유로
-ICU4J API를 노출하지 않을 수 있습니다. 예컨대 Android N은
-일부 사용 중단된 API나 ICU 팀에서 안정적이라고 선언하지 않은 API를
-노출하지 않습니다. ICU 팀이 이후 API의 사용을 중단하면, Android도
-이를 사용 중단됨으로 표시하지만 계속 포함합니다.
-</p>
-
-<p class="table-caption"><strong>표 1.</strong>
-Android N에서 사용된 ICU 및 CLDR 버전.</p>
-<table>
-<tr>
-<th>Android API 레벨</th>
-<th>ICU 버전</th>
-<th>CLDR 버전</th>
-</tr>
-<tr>
-<td>Android N</td>
-<td>56</td>
-<td>28</td>
-</tr>
-</table>
-
-<p>중요한 참고 사항:</p>
-
-<ul>
-<li>ICU4J Android 프레임워크 API에는 모든 ICU4J API가 포함되지 않습니다.</li>
-<li>NDK 개발자는 Android ICU4C가 지원되지 않는다는 것을 알아야 합니다.</li>
-<li>Android 프레임워크의 API는 Android의
-<a href="{@docRoot}guide/topics/resources/localization.html">리소스로
-현지화</a> 지원을 대체하지 못합니다.</li>
-</ul>
-
-<h2 id="migration">com.ibm.icu에서 android.icu 패키지로 마이그레이션</h2>
-
-<p>
-  앱에서 이미 ICU4J API를 사용하고 있고
-<code>android.icu</code> API가 요구사항을 충족한다면
-프레임워크 API로 마이그레이션할 때 Java 가져오기를
-<code>com.ibm.icu</code>에서 <code>android.icu</code>로 변경해야 합니다. 그러면 APK에서
-ICU4J 파일 사본을 삭제할 수 있습니다.
-</p>
-
-<p class="note">
-  <b>참고</b>: ICU4J 프레임워크 API는 {@code com.ibm.icu} 대신 {@code android.icu}
-네임스페이스를 사용합니다. 이는 자체 {@code com.ibm.icu} 라이브러리가 포함된 APK에서
-네임스페이스 충돌을 피하기 위해서입니다.
-</p>
-
-<h3 id="migrate-from-android">
-  다른 Android SDK API에서 android.icu API로 마이그레이션
-</h3>
-
-<p>
-  <code>java</code>와 <code>android</code> 패키지의 일부 클래스는
-ICU4J의 클래스와 같습니다. 그러나 ICU4J는 종종 더욱 폭넓은
-표준과 언어를 지원합니다.
-</p>
-<p>시작하기 위한 몇 가지 예시는 다음과 같습니다.</p>
-<table>
-<tr>
-<th>클래스</th>
-<th>대체</th>
-</tr>
-<tr>
-<td><code>java.lang.Character</code> </td>
-<td><code>android.icu.lang.UCharacter</code> </td>
-</tr>
-<tr>
-<td><code>java.text.BreakIterator</code> </td>
-<td><code>android.icu.text.BreakIterator</code> </td>
-</tr>
-<tr>
-<td><code>java.text.DecimalFormat</code> </td>
-<td><code>android.icu.text.DecimalFormat</code> </td>
-</tr>
-<tr>
-<td><code>java.util.Calendar</code></td>
-<td>
-<code>android.icu.util.Calendar</code></td>
-</tr>
-<tr>
-<td><code>android.text.BidiFormatter</code>
- </td>
-<td><code>android.icu.text.Bidi</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateFormat</code>
- </td>
-<td><code>android.icu.text.DateFormat</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateUtils</code> </td>
-<td><code>android.icu.text.DateFormat</code>
-<code>android.icu.text.RelativeDateTimeFormatter</code>
-</td>
-</tr>
-</table>
-
-<h2 id="licence">라이선스</h2>
-
-<p>
-  ICU4J는 ICU 라이선스에 따라 배포됩니다. 자세한 내용은 <a class="external-link" href="http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-">ICU
- 사용자 가이드</a>를 참조하세요.
-</p>
diff --git a/docs/html-intl/intl/ko/preview/features/multilingual-support.jd b/docs/html-intl/intl/ko/preview/features/multilingual-support.jd
deleted file mode 100644
index 6b3e999..0000000
--- a/docs/html-intl/intl/ko/preview/features/multilingual-support.jd
+++ /dev/null
@@ -1,221 +0,0 @@
-page.title=언어 및 로케일
-page.tags=androidn
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>이 문서의 내용</h2>
-<ol>
-	  <li><a href="#preN">언어 리소스 결정에서의 과제</a></li>
-    <li><a href="#postN">리소스 결정 전략 개선</a></li>
-    <li><a href="#design">추가 로케일 지원을 위한
-앱 설계</a></li>
-
-</ol>
-
-</div>
-</div>
-
-<p>Android N에서는 다국어 사용자를 위한 지원이 개선되었으므로
-이러한 사용자가 이제 설정에서 여러 로케일을 선택할 수 있습니다. Android N은
-지원되는 로케일 수를 대폭 확대하고
-시스템이 리소스를 결정하는 방식을 변경하여 이 기능을 제공합니다. 새로 도입된 리소스 결정 방법은
-더욱 안정적이고 기존 APK와 호환되도록 설계되어 있지만
-예상치 못한 동작이 없는지 신중히 살펴봐야 합니다. 예를 들어,
-앱이 예상 언어로 기본 설정되어 있는지 테스트해야 합니다. 또한,
-앱이 여러 언어를 지원한다면
-원하는 대로 작동하는지 확인해야 합니다. 마지막으로
-앱이 지원하도록 명시하지 않은 언어를 무리 없이 처리하는지 확인해야 합니다.</p>
-
-<p>이 문서에서는
-Android N 이전의 리소스 결정 전략을 설명한 뒤에, Android N의 개선된
-리소스 결정 전략을 설명합니다. 마지막으로
-더 많은 다국어 사용자를 지원하기 위해 확장된 로케일을 활용하는 방법을 설명합니다.</p>
-
-<h2 id="preN">언어 리소스 결정에서의 과제</h2>
-
-<p>Android N 이전의 Android에서는
- 앱과 시스템 로케일을 매칭하지 못하는 경우가 가끔 있었습니다.</p>
-
- <p>예를 들어, 다음과 같은 상황이라고 가정해 봅시다.</p>
- <ul>
- <li>앱의 기본 언어가 {@code en_US}(미국 영어)인데
-, {@code es_ES}
- 리소스 파일에 스페인어 문자열도 현지화했습니다.</li>
- <li> 기기는 {@code es_MX}로 설정되어 있습니다. </li>
-
-<p>Java 코드가 문자열을 참조할 때
-앱에서 {@code es_ES} 아래에 스페인어 리소스를 현지화했더라도, 시스템은 기본({@code en_US}) 리소스 파일로부터 문자열을
-로드합니다. 그 이유는 시스템이
-정확한 일치 항목을 찾을 수 없을 때 해당 로케일에서 국가 코드를
-제거하여 리소스를 계속 찾기 때문입니다. 마지막으로, 일치 항목을 찾지 못한 경우 시스템은 기본값({@code en_US})으로 다시
-돌아갑니다. </p>
-
-
-<p>또한, 앱에서 전혀 지원하지 않는 언어(예: 프랑스어)를 사용자가 선택하면 시스템은 기본값을 {@code en_US}로
-설정합니다. 예를 들면 다음과 같습니다.</p>
-
-<p class="table-caption" id="t-resource-res">
-<strong>표 1.</strong> 정확한 로케일 일치가 없는 경우 리소스 결정.
-</p>
-<table>
-<tbody>
-<tr>
-<th>사용자 설정</th>
-<th>앱 리소스</th>
-<th>리소스 결정</th>
-</tr>
-<tr>
-<td>fr_CH</td>
-<td>
-기본값(en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
- <td>
-fr_CH 시도 =&gt; 실패<br>
-fr 시도 =&gt; 실패<br>
-기본값(en) 사용
-</td>
- </tr>
- </tbody>
-</table>
-
-
-<p>이 예시에서 시스템은
-사용자가 영어를 이해할 수 있는지 여부와 관계없이 영어 문자열을 표시합니다. 현재 이러한 동작이 상당히
-일반적입니다. Android N은 이런
-결과가 나타나는 빈도를 상당히 낮추었습니다.</p>
-
-<h2 id="postN">리소스 결정 전략 개선</h2>
-<p>Android N은 더욱 안정적인 리소스 결정을 사용하고
-자동으로 더욱 알맞은 대안책을 찾습니다. 그러나 결정 속도를 높이고
-관리성을 개선하려면 가장 일반적인 상위 방언에 리소스를 저장해야 합니다.
- 예를 들어, 전에 {@code es-US} 디렉터리에
-스페인어 리소스를 저장했다면 남미 스페인어가 있는 {@code es-419} 디렉터리로 이동합니다.
- 마찬가지로 {@code en-GB}란 폴더에 리소스 문자열이 있다면
-폴더 이름을 {@code en-001}(국제 영어)로 변경합니다.
-<code>en-GB</code> 문자열의 가장 일반적인 상위 리소스는 {@code en-001}이기 때문입니다.
- 다음은 이러한 방법이
-성능과 리소스 결정의 신뢰성을 개선하는 이유를 설명하는 예시입니다.</p>
-
-<h3>리소스 결정 예시</h3>
-
-<p>Android N의 경우, <strong>표 1</strong>의 사례는
-다르게 결정됩니다.</p>
-
-<p class="table-caption" id="t-improved-res">
-<strong>표 2.</strong> 정확한 로케일 일치가 없을 경우
-개선된 결정 전략.</p>
-<table>
-<tr>
-<th>사용자 설정</th>
-<th>앱 리소스</th>
-<th>리소스 결정</th>
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-</ol>
-</td>
-<td>
-기본값(en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
-<td>
-fr_CH 시도 =&gt; 실패<br>
-fr 시도 =&gt; 실패<br>
-Fr의 하위 리소스 시도 =&gt; fr_FR<br>
-fr_FR 사용
-</td>
-</tr>
-
-</table>
-
-
-<p>이제 사용자는 영어 대신 프랑스어 리소스를 보게 됩니다. 이 예시에서는
-Android N에서 프랑스어 문자열을 {@code fr_FR}
-이 아니라 {@code fr}에 저장해야 하는 이유를 알 수 있습니다. 이러한 동작을 통해 가장 가까운 상위 방언과 일치시켜서
-더욱 빠르고 예측 가능하게 결정합니다.</p>
-
-<p>Android는 이러한 결정 논리를 개선했을 뿐만 아니라
-선택 가능한 언어를 더 많이 제공합니다. 위의 예시에 이탈리아어가 추가 사용자 언어로 지정되었지만
-앱에서 프랑스어를 지정하지 않는 경우를 적용해 보겠습니다.  </p>
-
-<p class="table-caption" id="t-2d-choice">
-<strong>표 3.</strong> 앱이 사용자의 두 번째 선호 로케일 설정에만 일치할 때
-리소스 결정.</p>
-<table>
-<tr>
-<th>사용자 설정</th>
-<th>앱 리소스</th>
-<th>리소스 결정</th>
-
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-<li> it_CH</li>
-</ol>
-</td>
-<td>
-기본값(en)<br>
-de_DE<br>
-es_ES<br>
-it_IT<br>
-</td>
-<td>
-fr_CH 시도 =&gt; 실패<br>
-fr 시도 =&gt; 실패<br>
-fr의 하위 리소스 시도 =&gt; 실패<br>
-it_CH 시도 =&gt; 실패<br>
-it 시도 =&gt; 실패<br>
-it의 하위 리소스 시도 =&gt; it_IT<br>
-it_IT 사용
-</td>
-
-</tr>
-
-</table>
-<p>앱이 프랑스어를 지원하지 않지만
-사용자는 여전히 자신이 이해하는 언어를 볼 수 있습니다.</p>
-
-
-<h2 id="design">추가 로케일 지원을 위한 앱 설계</h2>
-<h3>LocaleList API</h3>
-
-<p>Android N에서는 앱이 사용자가 지정한 언어 목록을 직접 쿼리할 수 있는 새로운 API {@code LocaleList.getDefault()}가
-추가되었습니다. 이 API는
-앱 동작을 더욱 정교하게 해주고
- 콘텐츠 표시를 더 최적화해 줍니다. 예를 들어, 검색 시
-사용자 설정에 따라 여러 언어로 결과를 표시할 수 있습니다.  브라우저 앱은
-사용자가 이미 알고 있는 언어로
-번역 페이지를 제공하지 않고, 키보드 앱은 모든 적절한 레이아웃을 자동 활성화할 수 있습니다. </p>
-
-<h3>포맷터</h3>
-
-<p>Android 6.0(API 레벨 23)까지 Android는 많은 공통 언어(en, es, ar, fr, ru)에 대해
-1~2개의 로케일만
-지원했습니다. 각 언어의 변종은 몇 개뿐이기 때문에
-리소스 파일에 하드코딩된 문자열로 몇 개의 숫자와 날짜를 저장하는 것만으로
-충분했습니다.  그러나 Android에서 지원되는 로케일 세트가 확장되면서
-단일 로케일 내에서조차
-날짜, 시간, 통화 및 유사 정보에
-큰 차이가 생길 수 있게 되었습니다. 형식 하드코딩은
-최종 사용자에게 혼란을 줄 수 있습니다.  그러므로 Android N을 개발할 때는
-숫자와 날짜 문자열을 하드코딩하는 대신 포맷터를 사용하도록 하세요.</p>
-
-<p>가장 좋은 예시로는 아랍어가 있습니다. Android N에서 아랍어 지원이
-{@code ar_EG} 1개에서 27개 아랍어 로케일로 확장되었습니다. 이러한 로케일은 대부분의 리소스를 공유할 수 있지만
-어떤 로케일은 ASCII 숫자를 선호하고 어떤 로케일은 네이티브 숫자를 선호합니다. 예를 들어,
-"4자리 PIN 선택"과 같은 숫자 변수가 포함된 문장을 생성하려면
-아래와 같이 포맷터를 사용합니다.</p>
-
-<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>
diff --git a/docs/html-intl/intl/ko/preview/features/notification-updates.jd b/docs/html-intl/intl/ko/preview/features/notification-updates.jd
deleted file mode 100644
index 480eda0..0000000
--- a/docs/html-intl/intl/ko/preview/features/notification-updates.jd
+++ /dev/null
@@ -1,393 +0,0 @@
-page.title=알림
-page.tags=알림
-helpoutsWidget=true
-page.image=/preview/images/notifications-card.png
-
-trainingnavtop=true
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-
-<!-- table of contents -->
-<h2>이 문서의 내용</h2>
-<ol>
-  <li><a href="#direct">직접 회신</a></li>
-  <li><a href="#bundle">묶음 알림</a></li>
-  <li><a href="#custom">사용자 지정 뷰</a></li>
-  <li><a href="#style">메시지 스타일</a></li>
-</ol>
-
-</div>
-</div>
-
-<p>Android N에서는 가시성과 상호 작용이 뛰어난 알림을
-앱이 게시할 수 있도록 여러 가지 새로운 API를 도입했습니다.</p>
-
-<p>Android N에서는 핸드셋에서 인라인 회신을 지원하기 위해 기존의 {@link android.support.v4.app.RemoteInput}
-알림 API를 확장합니다. 이 기능을 사용하면 앱을 방문하지 않고도 알림 창에서
-신속하게 응답할 수 있습니다.</p>
-
-<p>
-  Android N에서는 또한 비슷한 알림을 묶어서 단일 알림으로
-표시할 수도 있습니다. 이것이 가능하도록, Android N에서는 기존의 {@link
-  android.support.v4.app.NotificationCompat.Builder#setGroup
-  NotificationCompat.Builder.setGroup()} 메서드를 사용합니다. 사용자가 각 알림을 확장할 수 있으며, 각 알림에 대해 회신 및
-닫기와 같은 동작을 알림 창에서 개별적으로 수행할
-수 있습니다.
-</p>
-
-<p>마지막으로, Android N에서는 또한 앱의 사용자 지정된 알림
-뷰에서 시스템 장식을 활용할 수 있는 새 API를 추가합니다. 이들 API는 표준 템플릿을 통해 알림 뷰가
-일관된 프레젠테이션을 공유하도록 보장해
-줍니다.</p>
-
-<p>이 문서에서는 새 알림 기능을 앱에서 사용할 때 고려해야
-하는 몇 가지 주요 변경 사항을 중점적으로 다룹니다.</p>
-
-<h2 id="direct">직접 회신</h2>
-
-<p>Android N에 있는 직접 회신 기능을 사용하여, 사용자가 문자
-메시지에 신속하게 응답하거나 알림 인터페이스 내에서 직접
-작업 목록을 업데이트할 수 있습니다. 핸드헬드에서 인라인 회신 동작은 알림에 연결된 추가적인
-버튼으로 나타납니다. 사용자가 키보드를 통해 회신하면
-시스템은 여러분이 알림 동작에 지정했던
-인텐트에 텍스트 응답을 첨부하고 이 인텐트를
- 핸드헬드 앱으로 보냅니다.
-
-
-<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
-  {@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
-<p class="img-caption">
-  <strong>그림 1.</strong> Android N이 <strong>Reply</strong>
- 동작 버튼을 추가합니다.
-</p>
-
-<h3>인라인 회신 동작 추가</h3>
-
-<p>직접 회신을 지원하는 알림 동작을 만들려면:
-</p>
-
-<ol>
-<li>알림 동작에 추가할 수 있는 {@link android.support.v4.app.RemoteInput.Builder}의
-인스턴스를
-만듭니다. 이 클래스의 생성자는 시스템이 텍스트 입력의 키로
- 사용하는 문자열을 수락합니다. 나중에 핸드헬드 앱은 이 키를 사용하여 입력 텍스트를
-검색합니다.
-
-<pre>
-// Key for the string that's delivered in the action's intent.
-private static final String KEY_TEXT_REPLY = "key_text_reply";
-String replyLabel = getResources().getString(R.string.reply_label);
-RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
-        .setLabel(replyLabel)
-        .build();
-</pre>
-</li>
-<li><code>addRemoteInput()</code>을 사용하여 {@link android.support.v4.app.RemoteInput}
-객체를 동작에 첨부합니다.
-
-<pre>
-// Create the reply action and add the remote input.
-Notification.Action action =
-        new Notification.Action.Builder(R.drawable.ic_reply_icon,
-                getString(R.string.label), replyPendingIntent)
-                .addRemoteInput(remoteInput)
-                .build();
-</pre>
-</li>
-
-<li>동작을 알림에 적용하고 알림을 발생합니다.
-
-<pre>
-// Build the notification and add the action.
-Notification newMessageNotification =
-        new Notification.Builder(mContext)
-                .setSmallIcon(R.drawable.ic_message)
-                .setContentTitle(getString(R.string.title))
-                .setContentText(getString(R.string.content))
-                .addAction(action))
-                .build();
-
-// Issue the notification.
-NotificationManager notificationManager =
-        NotificationManager.from(mContext);
-notificationManager.notify(notificationId, newMessageNotification);
-
-</pre>
-</li>
-
-</ol>
-
-
-<p> 시스템이 사용자에게 알림 동작이 트리거될 때 응답을 입력하라는
-메시지를 표시합니다. </p>
-
-<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
-    {@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>그림 2.</strong> 사용자가 알림 창에서 텍스트를 입력합니다.
-</p>
-
-<h3>
-  인라인 회신에서 사용자 입력을 검색
-</h3>
-
-<p>
-  회신 동작의 인텐트에 선언하셨던 액티비티에 대해 알림
- 인터페이스로부터 사용자 입력을 수신하려면:
-</p>
-
-<ol>
-  <li>알림 동작의 인텐트를 입력 매개변수로서 전달하여 {@link android.support.v4.app.RemoteInput#getResultsFromIntent
- getResultsFromIntent()}를
- 호출합니다. 이 메서드는 텍스트 응답이 포함된 {@link android.os.Bundle}을
- 반환합니다.
-
-    <pre>
-Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-</pre>
-  </li>
-
-  <li>({@link
- android.support.v4.app.RemoteInput.Builder} 생성자에 제공된) 결과 키를 사용하여 번들에 쿼리를 수행합니다. 다음 코드 조각에서처럼, 메서드를 만들어 이 프로세스를
-완료하고 입력 텍스트를
-검색할 수 있습니다.
-
-    <pre>
-// Obtain the intent that started this activity by calling
-// Activity.getIntent() and pass it into this method to
-// get the associated string.
-
-private CharSequence getMessageText(Intent intent) {
-    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-    if (remoteInput != null) {
-        return remoteInput.getCharSequence(KEY_TEXT_REPLY);
-    }
-    return null;
- }
-</pre>
-  </li>
-
-  <li>이전 알림에 대해 제공했던 것과 동일한 알림 ID를
- 사용하여, 다른 알림을 작성하고 발급합니다. 사용자에게 성공적으로 회신했음을
-알려주기 위해 알림 인터페이스에서
-알림 표시기가 사라집니다. 이 새로운 알림으로 작업할 때, 수신기의
-{@code onReceive()} 메서드로 전달되는 컨텍스트를 사용하세요.
-
-    <pre>
-// Build a new notification, which informs the user that the system
-// handled their interaction with the previous notification.
-Notification repliedNotification =
-        new Notification.Builder(context)
-                .setSmallIcon(R.drawable.ic_message)
-                .setContentText(getString(R.string.replied))
-                .build();
-
-// Issue the new notification.
-NotificationManager notificationManager =
-        NotificationManager.from(context);
-notificationManager.notify(notificationId, repliedNotification);
-</pre>
-  </li>
-</ol>
-
-<p>
-  채팅과 같은 대화형 앱의 경우, 검색된 텍스트를 처리할 때
- 추가 컨텍스트를 포함하는 것이 유용할 수 있습니다. 예를 들어, 이들 앱은 여러 줄의 채팅 기록을
-표시할 수 있습니다. 사용자가 {@link
- android.support.v4.app.RemoteInput}을 통해 응답하는 경우,
-{@code setRemoteInputHistory()} 메서드를 사용하여 회신 기록을 업데이트할 수 있습니다.
-</p>
-
-<p>
-  앱이 원격 입력을 수신한 후에는 알림이 업데이트되거나
- 취소되어야 합니다. 사용자가 Direct Reply를 사용하여 원격 업데이트에
-회신할 때는 알림을
-취소하지 마세요. 그 대신, 사용자의 회신을 표시하도록 알림을 업데이트하세요.
-{@code MessagingStyle}을 사용하는 알림의 경우, 회신을 최신 메시지로서
-추가해야 합니다. 다른 템플릿을 사용할 경우 사용자의
-회신을 원격 입력 기록에 추가할 수 있습니다.
-</p>
-
-<h2 id="bundle">묶음 알림</h2>
-
-<p>Android N에서는 일련의 알림을 표시하기 위한 새로운 방식을
-개발자에게 제공합니다. <i>묶음 알림</i>. 이것은
-Android Wear의 <a href="{@docRoot}training/wearables/notifications/stacks.html">알림
-스택</a> 기능과 유사합니다. 예를 들어, 수신된 메시지에 대해 앱이 알림을 생성하는 경우,
-둘 이상의 메시지가 수신되면 그 알림을 하나의
-단일 그룹으로 묶습니다. 기존의
-{@link android.support.v4.app.NotificationCompat.Builder#setGroup
-Builder.setGroup()} 메서드를 사용하여 유사한 알림을 묶을 수 있습니다.</p>
-
-<p>
-  알림 그룹은 이 그룹을 구성하는 알림을 계층 구조로 만듭니다.
-  계층 구조의 맨 위는 그룹의 요약 정보가 표시되는 상위
-알림입니다. 사용자는 알림 그룹을 점진적으로 확장할 수 있으며, 시스템은
-사용자가 더 깊이 파고들수록 더 많은 정보를
-표시합니다. 사용자가 번들을 확장하면 시스템은 모든 하위 알림에 대해
-더 많은 정보를 표시하며, 사용자가 이들 알림 중 하나를 확장하면
-시스템은 알림의 전체 콘텐츠를 표시합니다.
-</p>
-
-<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
-          {@docRoot}preview/images/bundles_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>그림 3.</strong> 사용자는 알림 그룹을 점진적으로 확장할 수
- 있습니다.
-</p>
-
-<p class="note">
-  <strong>참고:</strong> 동일 앱이 4개 이상의 알림을 보내면서
-그룹화를 지정하지 않으면,
-시스템에서 이들 알림을 자동으로 그룹화합니다.
-</p>
-
-<p>알림을 그룹에 추가하는 방법을 알아보려면
-<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">각
-알림을 그룹에 추가</a>를 참조하세요.</p>
-
-
-<h3 id="best-practices">묶음 알림의 모범 사례</h3>
-<p>이 섹션에서는 이전 버전의 Android 플랫폼에서
-사용되었던 {@link android.app.Notification.InboxStyle InboxStyle}
-알림 대신에 알림 그룹을 사용할 때의 지침을
-제공합니다.</p>
-
-<h3>묶음 알림을 사용하는 경우</h3>
-
-<p>자신의 사용 사례에서 다음의 모든 조건이 충족되는 경우에만
-알림 그룹을 사용해야 합니다.</p>
-
-<ul>
-  <li>하위 알림은 완전한 알림이며 그룹 요약이 필요 없이
-개별적으로 표시될 수 있습니다.</li>
-  <li>하위 알림을 개별적으로 표시하는 경우 이점이 있습니다. 예를 들면 다음과 같습니다.
-
-  </li>
-  <ul>
-    <li>알림이 실행 가능하며, 각 하위 알림에 맞는 동작이 있습니다.</li>
-    <li>사용자가 읽고 싶어하는 하위 알림에 더 많은 정보가 있습니다.</li>
-  </ul>
-</ul>
-
-<p>알림 그룹의 사용 사례에 대한 좋은 예로는, 수신 메시지의
-목록을 표시하는 메시징 앱이나 수신된 이메일의 목록을 표시하는
-이메일 앱이 있습니다.</p>
-
-<p>
-단일 알림이 바람직한 사례의 예로는, 한 사람이 보낸
-개별 메시지나 1줄 텍스트 항목의 목록 표시가
-있습니다. 이를 수행하기 위해
-({@link android.app.Notification.InboxStyle InboxStyle} 또는
-{@link android.app.Notification.BigTextStyle BigTextStyle})을 사용할
-수 있습니다.
-</p>
-
-<h3 id ="post">묶음 알림 표시</h3>
-
-<p>
-  그룹에 하나의 하위 항목만 포함되어 있더라도 앱은
-항상 그룹 요약을 게시해야 합니다. 하나의 알림만 포함된 경우에는 시스템이 요약을
-억제하고 하위 알림을 직접 표시합니다. 이렇게 하면 사용자가 그룹의
-하위 항목을 스와이프할 때 시스템이 일관된 경험을 제공할 수
-있습니다.
-</p>
-
-<p class="note">
-  <strong>참고:</strong> 이 버전의 Android N에서는 아직 단일 하위
-항목이 포함된 알림 그룹에 대해 요약을 억제하지 않습니다. 이
-기능은 이후 버전의 Android N에 추가될 것입니다.
-</p>
-
-<h3>피킹 알림</h3>
-
-<p>시스템은
-일반적으로 하위 알림을 그룹으로 표시하지만,
-이 알림이 일시적으로 <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">헤드업 알림</a>으로
-나타나도록 설정할 수 있습니다. 이 기능을 사용하면 가장 최근의 하위 항목과 이에
-관련된 동작에 즉시 액세스할 수 있으므로 특히 유용합니다.
-</p>
-
-
-<h3>이전 버전과의 호환성</h3>
-
-<p>
-  Android 5.0(API 레벨 21) 이후로, 알림 그룹과
-원격 입력은 Android Wear 기기를 지원하기 위한 {@link
-  android.app.Notification} API의 일부였습니다. 이미 이들 API로 알림을 작성한 경우 수행할 조치는,
-앱 동작이 위에 설명된 지침과 일치하는지 확인하고 {@code
-  setRemoteInputHistory()} 구현을
-고려하는 것입니다.
-</p>
-
-<p>
-  이전 버전과의 호환성을 지원하기 위해,
-지원 라이브러리의 {@link android.support.v4.app.NotificationCompat}
-클래스로 동일한 API를 사용할 수 있으며, 이전 Android 버전에서 작동하는 알림을 작성할
-수 있습니다. 핸드헬드와 태블릿에서는 요약 알림만 사용자에게 보이므로,
-앱은 해당 그룹의 전체 정보 콘텐츠에 대해 받은편지함
-스타일이나 이와 동등한 알림 표시를 계속 가져야 합니다. Android
-Wear 기기에서는 구형 플랫폼 레벨에서도
-사용자가 모든 하위 알림을 볼 수 있으므로, API 레벨에 상관없이 하위 알림을
-작성해야 합니다.
-</p>
-
-<h2 id="custom"> 사용자 지정 뷰</h2>
-<p>Android N부터는 알림 뷰를 사용자 지정할 수 있으며
-알림 헤더, 동작 및 확장 가능한 레이아웃과 같은 시스템 장식을 계속
-획득할 수 있습니다.</p>
-
-<p>이 기능을 활성화하기 위해, Android N에서는 다음과
-같은 API를 추가하여 사용자 지정 뷰의 스타일을 지정합니다.</p>
-
-<dl>
-<dt>
-{@code DecoratedCustomViewStyle()}</dt>
-<dd> 미디어 알림 이외의 스타일
-알림.</dd>
-<dt>
-{@code DecoratedMediaCustomViewStyle()}</dt>
-<dd> 스타일 미디어 알림.</dd>
-</dl>
-
-<p>이 새로운 API를 사용하려면, {@code setStyle()} 메서드를 호출하여,
-원하는 사용자 지정 뷰 스타일에 전달합니다.</p>
-
-<p>이 조각에서는
-{@code DecoratedCustomViewStyle()} 메서드로 사용자 지정 알림 객체를 구성하는 방법을 보여줍니다.</p>
-
-<pre>
-Notification notification = new Notification.Builder()
-           .setSmallIcon(R.drawable.ic_stat_player)
-           .setLargeIcon(albumArtBitmap))
-           .setCustomContentView(contentView);
-           .setStyle(new Notification.DecoratedCustomViewStyle())
-           .build();
-
-</pre>
-
-<h2 id="style">메시징 스타일</h2>
-<p>
-  Android N에서는 알림 메시지의 스타일을 사용자 지정하기 위한 새로운 API를 도입했습니다.
-  <code>MessageStyle</code> 클래스를 사용하면 대화 제목, 추가 메시지 및 알림에 대한 콘텐츠 뷰를 비롯하여
-알림 메시지에 표시되는 여러 가지 레이블을
-변경할 수 있습니다.
-</p>
-
-<p>
-  다음 코드 조각에서는
- <code>MessageStyle</code> 클래스를 사용하여 알림 스타일을 사용자 지정하는 방법을 보여 줍니다.
-</p>
-
-<pre>
-  Notification notification = new Notification.Builder()
-             .setStyle(new Notification.MessagingStyle("Me")
-                 .setConversationTitle("Team lunch")
-                 .addMessage("Hi", timestamp1, null) // Pass in null for user.
-                 .addMessage("What's up?", timestamp2, "Coworker")
-                 .addMessage("Not much", timestamp3, null)
-                 .addMessage("How about lunch?", timestamp4, "Coworker"));
-</pre>
diff --git a/docs/html-intl/intl/pt-br/about/versions/nougat/android-7.0-testing.jd b/docs/html-intl/intl/pt-br/about/versions/nougat/android-7.0-testing.jd
deleted file mode 100644
index c00fd21..0000000
--- a/docs/html-intl/intl/pt-br/about/versions/nougat/android-7.0-testing.jd
+++ /dev/null
@@ -1,190 +0,0 @@
-page.title=Guia de teste
-page.image=images/cards/card-n-guide_2x.png
-meta.tags="preview", "testing"
-page.tags="preview", "developer preview"
-
-@jd:body
-
-<div id="tb-wrapper">
-  <div id="tb">
-    <h2>Neste documento</h2>
-      <ol>
-        <li><a href="#runtime-permissions">Teste de permissões</a></li>
-        <li><a href="#doze-standby">Teste de soneca e App em espera</a></li>
-        <li><a href="#ids">Identificadores de dispositivo e backup automático</a></li>
-      </ol>
-  </div>
-</div>
-
-<p>
-  O Android N fornece uma oportunidade de garantir que os aplicativos funcionem
- na próxima versão da plataforma. Esta prévia inclui uma série de mudanças de comportamento e APIs que podem
- ter impacto no aplicativo, como descrito em <a href="{@docRoot}preview/api-overview.html">Visão geral da API
-</a> e <a href="{@docRoot}preview/behavior-changes.html">Mudanças de comportamento</a>. No teste
- do aplicativo com a prévia, há algumas alterações de sistema específicas em que você deve se concentrar
- para garantir que os usuários tenham uma boa experiência.
-</p>
-
-<p>
-  Este guia descreve quais recursos de prévia testar e como testá-los com o aplicativo. Você deve
- priorizar o teste destes recursos de prévia específicos devido ao grande impacto potencial no
- comportamento do aplicativo:
-</p>
-
-<ul>
-  <li><a href="#runtime-permissions">Permissões</a>
-  </li>
-  <li><a href="#doze-standby">Soneca e App em espera</a>
-  </li>
-  <li><a href="#ids">Identificadores de dispositivo e backup automático</a></li>
-</ul>
-
-<p>
-  Para obter mais informações sobre como configurar dispositivos físicos ou virtuais com uma imagem do sistema de prévia
- para teste, consulte <a href="{@docRoot}preview/setup-sdk.html">Configuração
-do Android N SDK</a>.
-</p>
-
-
-<h2 id="runtime-permissions">Teste de permissões</h2>
-
-<p>
-  O novo modelo de <a href="{@docRoot}preview/features/runtime-permissions.html">permissões</a>
- altera a maneira que as permissões são alocadas ao aplicativo pelo usuário. Em vez de conceder todas as permissões
- durante o procedimento de instalação, o aplicativo deve pedir ao usuário permissões individuais
- em tempo de execução. Para os usuários, este comportamento fornece um controle mais granular sobre as atividades de cada aplicativo, bem
- como um melhor contexto para entender o porquê do aplicativo estar solicitando uma permissão específica. Os usuários
- podem conceder ou revogar as permissões concedidas a um aplicativo individualmente a qualquer momento. É provável que este recurso
- da prévia tenha um impacto no comportamento do aplicativo e pode impedir que alguns
- dos recursos do aplicativo funcionem, ou funcionem em um estado degradado.
-</p>
-
-<p class="caution">
-  Esta alteração afeta todos os aplicativos em execução na nova plataforma, mesmo aqueles que não são destinados
- para a versão nova da plataforma. A plataforma fornece um comportamento de compatibilidade limitado para aplicativos legados. No entanto,
- você deve começar a planejar a migração do aplicativo para o novo modelo de permissões agora, com o objetivo
- de publicar uma versão atualizada do aplicativo no lançamento oficial da plataforma.
-</p>
-
-
-<h3 id="permission-test-tips">Dicas de teste</h3>
-
-<p>
-  Use as seguintes dicas de teste para ajudar você a planejar e executar os testes do aplicativo com o novo
- comportamento de permissões.
-</p>
-
-<ul>
-  <li>Identifique as permissões atuais do aplicativo e os caminhos de código relacionados.</li>
-  <li>Teste o fluxo de usuário entre serviços protegidos por permissão e dados.</li>
-  <li>Teste com várias combinações de permissões revogadas/concedidas.</li>
-  <li>Use a ferramenta {@code adb} para gerenciar as permissões da linha de comando:
-    <ul>
-      <li>Liste as permissões e o status por grupos:
-        <pre>adb shell pm list permissions -d -g</pre>
-      </li>
-      <li>Conceda ou revogue uma ou mais permissões usando a seguinte sintaxe:<br>
-        <pre>adb shell pm [grant|revoke] &lt;permission.name&gt; ...</pre>
-      </li>
-    </ul>
-  </li>
-  <li>Analise o aplicativo para encontrar os serviços que usam permissões.</li>
-</ul>
-
-<h3 id="permission-test-strategy">Estratégia de teste</h3>
-
-<p>
-  A mudança de permissões afeta a estrutura e o projeto do aplicativo, bem como
- a experiência do usuário e os fluxos fornecidos a eles. Você deve avaliar o uso das permissões atuais
- do aplicativo e começar a planejar novos fluxos que deseja oferecer. O lançamento oficial
- da plataforma fornece comportamento de compatibilidade, mas deve-se planejar a atualização do aplicativo e
- não confiar nestes comportamentos.
-</p>
-
-<p>
-  Identifique as permissões que o aplicativo realmente precisa e usa e, em seguida, encontre os vários caminhos
- de código que usam os serviços protegidos por permissões. É possível fazer isto por meio de uma combinação de
- testes na nova plataforma e análise de códigos. Nos testes, você deve se concentrar em usar
- as permissões em tempo de execução alterando {@code targetSdkVersion} do aplicativo para a versão da prévia. Para
- obter mais informações, consulte <a href="{@docRoot}preview/setup-sdk.html#">Configuração
-do Android N SDK</a>.
-</p>
-
-<p>
-  Teste com várias combinações de permissões revogadas e concedidas para destacar os fluxos de usuário
-que dependem de permissões. Onde uma dependência não for óbvia ou lógica, considere
-refatorar ou compartimentalizar este fluxo para eliminar a dependência ou para esclarecer por que
-a permissão é necessária.
-</p>
-
-<p>
-  Para obter mais informações sobre o comportamento das permissões em tempo de execução, de testes e de melhores práticas, consulte a página
- <a href="{@docRoot}preview/features/runtime-permissions.html">Permissões</a> do Developer
- Preview.
-</p>
-
-
-<h2 id="doze-standby">Teste de soneca e App em espera</h2>
-
-<p>
-  Os recursos de economia de energia de App em espera e soneca limitam a quantidade de processamento de segundo plano que o aplicativo
- pode realizar quando um dispositivo está no estado ocioso ou enquanto não está em foco. As
- restrições que o sistema pode impor nos aplicativos inclui acesso a rede limitado ou restrito,
- tarefas de segundo plano suspensas, notificações suspensas, solicitações de soneca ignoradas e despertadores. Para garantir
- que o aplicativo se comportará adequadamente com essas otimizações de economia de energia, deve-se testá-lo
- simulando estes estados de baixa energia.
-</p>
-
-<h4 id="doze">Testar o aplicativo com Soneca</h4>
-
-<p>Para testar a Soneca com o aplicativo:</p>
-
-<ol>
-<li>Configure um dispositivo de hardware ou virtual com uma imagem do sistema Android N.</li>
-<li>Conecte o dispositivo à máquina de desenvolvimento e instale o aplicativo.</li>
-<li>Execute o aplicativo e deixe-o ativo.</li>
-<li>Simule o dispositivo acessando o modo Soneca executando os seguintes comandos:
-
-<pre>
-$ adb shell dumpsys battery unplug
-$ adb shell dumpsys deviceidle step
-$ adb shell dumpsys deviceidle -h
-</pre>
-
-  </li>
-  <li>Observe o comportamento do aplicativo quando o dispositivo é reativado. Certifique-se de que
- ele se recupere corretamente quando o dispositivo sai do modo Soneca.</li>
-</ol>
-
-
-<h4 id="standby">Testar aplicativos com App em espera</h4>
-
-<p>Para testar o modo de espera do aplicativo:</p>
-
-<ol>
-  <li>Configure um dispositivo de hardware ou virtual com uma imagem do sistema Android N.</li>
-  <li>Conecte o dispositivo à máquina de desenvolvimento e instale o aplicativo.</li>
-  <li>Execute o aplicativo e deixe-o ativo.</li>
-  <li>Simule o aplicativo acessando o modo de espera executando os seguintes comandos:
-
-<pre>
-$ adb shell am broadcast -a android.os.action.DISCHARGING
-$ adb shell am set-idle &lt;packageName&gt; true
-</pre>
-
-  </li>
-  <li>Simule o despertar do aplicativo usando o seguinte comando:
-    <pre>$ adb shell am set-idle &lt;packageName&gt; false</pre>
-  </li>
-  <li>Observe o comportamento do aplicativo quando ele é despertado. Certifique-se de que ele se recupere corretamente
- do modo de espera. Particularmente, deve-se verificar se as notificações e os trabalho de segundo plano
- do aplicativo continuam a funcionar como o esperado.</li>
-</ol>
-
-<h2 id="ids">Backup automático para aplicativos e identificadores específicos do dispositivo</h2>
-
-<p>Caso o aplicativo esteja persistindo qualquer identificador específico do dispositivo, como o ID de registro do Google
-Cloud Messaging, no armazenamento interno,
-certifique-se de seguir as práticas recomendadas para excluir o local de armazenamento
-do backup automático, como descrito em <a href="{@docRoot}preview/backup/index.html">Backup automático
-para aplicativos</a>. </p>
diff --git a/docs/html-intl/intl/pt-br/about/versions/nougat/index.jd b/docs/html-intl/intl/pt-br/about/versions/nougat/index.jd
index 58b2408..c7aee2a 100644
--- a/docs/html-intl/intl/pt-br/about/versions/nougat/index.jd
+++ b/docs/html-intl/intl/pt-br/about/versions/nougat/index.jd
@@ -1,6 +1,6 @@
-page.title=Android N Developer Preview
-page.tags="preview","developer"
-meta.tags="preview", "android"
+page.title=Android 7.0 Nougat
+page.tags="androidn","versions"
+meta.tags="android n", "nougat", "android 7.0"
 fullpage=true
 forcelocalnav=true
 header.hide=1
@@ -17,62 +17,56 @@
   })
 </script>
 
-<section class="dac-expand dac-hero dac-light" style="background-color:#B2DFDB">
+<section class="dac-expand dac-hero dac-light">
   <div class="wrap" style="max-width:1100px;margin-top:0">
+  <a href="{@docRoot}about/versions/nougat/android-7.0.html">
     <div class="cols dac-hero-content" style="padding-bottom:1em;">
 
-      <div class="col-7of16 col-push-9of16" style="padding-left:2em">
-        <h1 class="dac-hero-title">Android N Developer Preview</h1>
+      <div class="col-7of16 col-push-8of16" style="padding-left:2em">
+        <h1 class="dac-hero-title">Android 7.0 Nougat</h1>
         <p class="dac-hero-description">
-          Prepare-se para o Android N!
+          Prepare-se para o Android Nougat!
           <strong>Teste os aplicativos</strong> no Nexus e outros dispositivos. Ofereça suporte aos novos
  comportamentos do sistema para <strong>economizar energia e memória</strong>.
           Estenda seus aplicativos com a <strong>IU de várias janelas</strong>,
  <strong>direcione notificações de resposta</strong> e muito mais.
         </p>
 
-        <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+        <a class="dac-hero-cta" href="{@docRoot}about/versions/nougat/android-7.0.html">
           <span class="dac-sprite dac-auto-chevron"></span>
           Primeiros passos
-        </a><!--<br>
-        <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
-          Update to Android N (final SDK)
-        </a><br>-->
+        </a>
       </div>
-      <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
-        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png" srcset="{@docRoot}images/home/n-preview-hero.png 1x,
-             {@docRoot}images/home/n-preview-hero_2x.png 2x">
+      <div class="col-7of16 col-pull-6of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
+        <a  href="{@docRoot}about/versions/nougat/android-7.0.html">
+        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png"
+             srcset="{@docRoot}images/home/n-preview-hero.png 1x,
+             {@docRoot}images/home/n-preview-hero_2x.png 2x" />
+           </a>
       </div>
-    </div>
+    </div></a>
     <div class="dac-section dac-small">
       <div class="resource-widget resource-flow-layout col-16"
-           data-query="collection:preview/landing/resources"
+           data-query="collection:nougat/landing/resources"
            data-cardSizes="6x2"
-           data-maxResults="6"></div>
-    </div>
+           data-maxResults="3"></div>
+         </div>
   </div>
 </section>
 
 <div id="useUpdatedTemplates" style="display:none" class="dac-section dac-slim dac-gray dac-expand">
   <div class="wrap dac-offset-parent">
-    <a class="dac-fab dac-scroll-button" data-scroll-button href="#build-apps">
+    <a class="dac-fab dac-scroll-button" data-scroll-button href="#latest">
       <i class="dac-sprite dac-arrow-down-gray"></i>
     </a>
     <ul class="dac-actions">
       <li class="dac-action">
-        <a class="dac-action-link" href="https://developer.android.com/preview/bug">
+        <a class="dac-action-link" href="https://source.android.com/source/report-bugs.html">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
           Informe um problema
         </a>
       </li>
       <li class="dac-action">
-        <a class="dac-action-link" href="{@docRoot}preview/support.html">
-          <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
-          Veja as notas de versão
-        </a>
-      </li>
-      <li class="dac-action">
         <a class="dac-action-link" href="{@docRoot}preview/dev-community">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
           Participe da comunidade de desenvolvedores
@@ -82,26 +76,6 @@
   </div><!-- end .wrap -->
 </div><!-- end .dac-actions -->
 
-<div id="useOldTemplates" style="display:none;color:black" class="actions-bar dac-expand dac-invert">
-  <div class="wrap dac-offset-parent">
-
-    <div class="actions">
-      <div><a href="https://developer.android.com/preview/bug">
-        <span class="dac-sprite dac-auto-chevron-large"></span>
-        Informe um problema
-      </a></div>
-      <div><a href="{@docRoot}preview/support.html">
-        <span class="dac-sprite dac-auto-chevron-large"></span>
-        Veja as notas de versão
-      </a></div>
-      <div><a href="{@docRoot}preview/dev-community">
-        <span class="dac-sprite dac-auto-chevron-large"></span>
-        Participe da comunidade de desenvolvedores
-      </a></div>
-    </div><!-- end .actions -->
-  </div><!-- end .wrap -->
-</div>
-
 <section class="dac-section dac-light dac-small" id="latest"><div class="wrap">
   <h2 class="norule">Mais recente</h2>
   <div class="resource-widget resource-flow-layout col-16"
@@ -113,19 +87,33 @@
     data-initial-results="3"></div>
 </div></section>
 
-<section class="dac-section dac-gray"><div class="wrap">
-  <h1 class="dac-section-title">Recursos</h1>
+<section class="dac-section dac-gray" id="videos"><div class="wrap">
+  <h1 class="dac-section-title">Videos</h1>
   <div class="dac-section-subtitle">
-    Informações essenciais para ajudar você a preparar seus aplicativos para o Android N.
+    New Android capabilities and the right way to use them in your apps.
   </div>
 
   <div class="resource-widget resource-flow-layout col-16"
-       data-query="collection:preview/landing/more"
+    data-query="collection:nougat/landing/videos/first,type:youtube+tag:androidn"
+    data-sortOrder="-timestamp"
+    data-cardSizes="6x6"
+    data-items-per-page="6"
+    data-maxResults="15"
+    data-initial-results="3">
+  </div>
+</div></section>
+
+<section class="dac-section dac-light" id="resources"><div class="wrap">
+  <h1 class="dac-section-title">Recursos</h1>
+  <div class="dac-section-subtitle">
+    Informações essenciais para ajudar você a preparar seus aplicativos para o Android Nougat.
+  </div>
+
+  <div class="resource-widget resource-flow-layout col-16"
+       data-query="collection:nougat/landing/more"
        data-cardSizes="6x6"
        data-items-per-page="6"
        data-maxResults="15"
        data-initial-results="6"></div>
-
   </div>
-</section>
-
+</section>
\ No newline at end of file
diff --git a/docs/html-intl/intl/pt-br/index.jd b/docs/html-intl/intl/pt-br/index.jd
index f5e1569..3c8f75d 100644
--- a/docs/html-intl/intl/pt-br/index.jd
+++ b/docs/html-intl/intl/pt-br/index.jd
@@ -15,33 +15,30 @@
   })
 </script>
 
-<section class="dac-expand dac-hero dac-invert" style="background-color:#455A64">
-  <div class="wrap" style="max-width:1100px;margin-top:0">
-    <div class="col-7of16 col-push-9of16" style="padding-left:2em;">
-      <a href="{@docRoot}preview/index.html">
-        <h1 class="dac-hero-title">Android N Developer Preview</h1>
-        <p class="dac-hero-description">
-          Get ready for the next version of Android!
-          <strong>Test your apps</strong> on Nexus and other devices. Support new system
-          behaviors to <strong>save power and memory</strong>.
+<section class="dac-expand dac-hero" style="background-color:#b2dfdb;">
+  <div class="wrap" style="max-width:1000px;margin-top:0">
+    <div class="col-7of16 col-push-8of16">
+      <a href="{@docRoot}about/versions/nougat/index.html">
+        <h1 class="dac-hero-title" style="color:#004d40">Android 7.0 Nougat!</h1>
+        <p class="dac-hero-description" style="color:#004d40">
+          <strong>Android 7.0 Nougat is here!</strong>
+          Get your apps ready for the latest version of Android, with new system
+          behaviors to <strong>save battery and memory</strong>.
           Extend your apps with <strong>multi-window UI</strong>,
           <strong>direct reply notifications</strong> and more.
         </p>
-        <a class="dac-hero-cta" href="/preview/index.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
+        <a class="dac-hero-cta" href="{@docRoot}about/versions/nougat/index.html" style="color:#004d40">
+          <span class="dac-sprite dac-auto-chevron" style="background-color:#b2dfdb"></span>
           Learn more
-        </a><!--<br>
-        <a class="dac-hero-cta" href="/preview/support.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
-          Update to Developer Preview (final SDK)
-        </a><br>-->
+        </a>
+        </a>
       </a>
     </div>
-    <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:0em;padding-right:1.5em;">
-      <a href="{@docRoot}preview/index.html">
-        <img style="" class="dac-hero-image" src="/images/home/n-preview-hero.png"
-             srcset="/images/home/n-preview-hero.png 1x,
-             /images/home/n-preview-hero_2x.png 2x">
+    <div class="col-6of16 col-pull-6of16 dac-hero-figure" style="padding-left:1em;padding-top:1em;">
+      <a href="{@docRoot}about/versions/nougat/index.html">
+        <img class="dac-hero-image" src="{@docRoot}images/home/nougat_bg.jpg"
+             srcset="{@docRoot}images/home/nougat_bg.jpg 1x,
+             {@docRoot}images/home/nougat_bg_2x.jpg 2x">
         </a>
     </div>
   </div>
diff --git a/docs/html-intl/intl/pt-br/preview/download_mp2.jd b/docs/html-intl/intl/pt-br/preview/download_mp2.jd
deleted file mode 100644
index 12ef194..0000000
--- a/docs/html-intl/intl/pt-br/preview/download_mp2.jd
+++ /dev/null
@@ -1,360 +0,0 @@
-page.title=Downloads
-page.image=images/cards/card-download_16-9_2x.png
-
-@jd:body
-
-<div style="position:relative; min-height:600px">
-
-  <div class="wrap" id="tos" style="position:absolute;display:none;width:inherit;">
-
-    <p class="sdk-terms-intro">Antes de fazer o download ou instalar componentes do Android Preview
- SDK, você deve concordar com os seguintes termos e condições.</p>
-
-    <h2 class="norule">Termos e condições</h2>
-
-    <div class="sdk-terms" onfocus="this.blur()" style="width:678px">
-Este é o contrato de licença do Android SDK Preview (o “Contrato de Licença”).
-
-1. Introdução
-
-1.1 O Android SDK Preview (que este Contrato de licença chama de "Preview", incluindo especificamente os arquivos de sistema do Android, APIs integradas e arquivos da biblioteca Preview, se e quando estiverem disponíveis) é licenciado por meio da concordância com os termos deste contrato. O Contrato de licença forma um vínculo contratual legal entre o contratante e a Google em relação ao uso do Preview.
-
-1.2 "Android" se refere à pilha de software do Android para dispositivos, conforme disponibilizado no Projeto de código aberto do Android, localizado no URL a seguir: http://source.android.com/, atualizado periodicamente.
-
-1.3 "Google" refere-se à Google Inc, uma corporação de Delaware, com sede em 1600 Amphitheatre Parkway, Mountain View, CA 94043, Estados Unidos.
-
-2. Aceitação do Contrato de Licença
-
-2.1 A fim de usar o Preview, é necessário concordar com este Contrato de licença. O uso do Preview é proibido àqueles que não concordam com este Contrato de licença.
-
-2.2 Ao clicar em aceitar e/ou usar o Preview, você concorda com os termos do Contrato de licença
-
-2.3 É proibido o uso do Preview e a aceitação deste contrato pelo indivíduo que tenha impedimento legal sobre o recebimento do Preview sob as leis dos Estados Unidos ou de outros países, incluindo o país de residência ou no qual usa o Preview.
-
-2.4 Se for usar o Preview internamente na empresa ou organização, você deverá concordar com o vínculo com este contrato em nome do empregador ou de outra entidade e declarar e garantir que tem total autoridade legal para tanto. Se você não tem a autoridade necessária, não deve concordar com este contrato nem usar o Preview em nome do empregador ou de outra entidade.
-
-3. Licença do Preview da Google
-
-3.1 Sujeito aos termos do Contrato de licença, a Google confere uma licença limitada, revogável, livre de taxas, intransmissível, não sub-licenciável e não exclusiva para o uso apenas do Preview, pessoal ou internamente dentro da sua empresa ou organização, para fins de desenvolvimento de aplicativos executados na plataforma do Android.
-
-3.2 Você concorda que a Google ou terceiros detêm todos os direitos legais, títulos e interesses relativos ao Preview, incluindo quaisquer direitos de propriedade intelectual que subsistam no Preview. "Direitos de propriedade intelectual" se referem a todo e qualquer direito sob as leis de patentes, de direitos autorais, de segredo comercial, de marca registrada e todos os outros direitos de propriedade. A Google reserva todos os direitos não conferidos expressamente a você.
-
-3.3 O uso do Preview não é autorizado para qualquer finalidade não expressamente permitida por este Contrato de licença. Salvo na extensão exigida por licenças aplicáveis de terceiros, é proibido: (a) copiar (exceto para fins de cópia de segurança), modificar, adaptar, redistribuir, descompilar, fazer engenharia reversa, desmontar ou criar trabalhos derivados do Preview ou qualquer parte dele; ou (b) carregar qualquer parte do Preview em um aparelho celular ou outro dispositivo de hardware, exceto em computador pessoal, combinar qualquer parte do Preview com outros softwares ou distribuir qualquer software ou dispositivo que contenha uma parte do Preview.
-
-3.4 Você concorda que não tomará quaisquer medidas que possam causar ou resultar em fragmentação do Android, incluindo, sem limitar-se, a distribuição e a participação na criação ou na promoção, sob quaisquer formas, de um conjunto de desenvolvimento de software derivado do Preview.
-
-3.5 O uso, a reprodução e a distribuição de componentes do Preview licenciado sob licença de software de código aberto são regidos exclusivamente pelos termos daquela licença de software de código aberto, e não por este Contrato de licença. Você concorda em manter uma licença em bom estado para as licenças de software de código aberto sob todos os direitos concedidos e deter quaisquer ações que possam limitar, suspender ou romper tais direitos.
-
-3.6 Você concorda que a forma e a natureza do SDK que a Google fornece podem mudar sem aviso prévio e que as versões futuras do SDK podem ser incompatíveis com aplicativos desenvolvidos em versões anteriores do SDK. Você concorda que a Google pode cessar (permanente ou temporariamente) o fornecimento do Preview (ou quaisquer recursos dentro dele) a você ou a usuários em geral sob critério exclusivo da Google, sem aviso prévio.
-
-3.7 Nada neste Contrato de licença confere o direito de uso de quaisquer nomes comerciais, marcas comerciais, marcas de serviço, logomarcas, nomes de domínios e outros recursos de marcas especiais da Google.
-
-3.8 Você concorda que não removerá, ocultará nem alterará quaisquer observações de direitos de propriedade (incluindo observações de direitos autorais e de marcas registradas) que possam estar afixadas ou contidas no Preview.
-
-4. Uso do Preview por você
-
-4.1 A Google compreende que nada no Contrato de licença dá a ela direito, título nem interesse no usuário (ou em seus licenciadores), sob o presente Contrato de licença, no que tange ao desenvolvimento de aplicativos de software através do uso do Preview, incluindo quaisquer direitos de propriedade intelectual que subsistam nos referidos aplicativos.
-
-4.2 Você concorda em usar o Preview e desenvolver aplicativos somente para as finalidades permitidas por (a) este Contrato de licença e (b) quaisquer leis, normas, diretrizes geralmente aceitas ou orientações aplicáveis nas jurisdições relevantes (incluindo quaisquer leis acerca da exportação e da importação de dados ou softwares nos Estados Unidos ou em outros países relevantes).
-
-4.3 Você concorda que, se usar o Preview para o desenvolvimento de aplicativos, deverá proteger a privacidade e os direitos legais destes usuários. Se nomes de usuário, senhas ou outras informações de acesso ou informações pessoais forem fornecidos ao aplicativo, deve-se informá-los de que tais dados estarão disponíveis para o aplicativo, além de fornecer observações de privacidade e proteção legalmente adequadas a esses usuários. Se o aplicativo armazenar informações pessoais ou confidenciais fornecidas pelos usuários, deve fazê-lo com segurança. Se o usuário fornecer informações da conta do Google, o aplicativo poderá usar essas informações exclusivamente para acessar a conta da Google do usuário quando houver autorização para fazê-lo e para os fins limitados pela autorização.
-
-4.4 Você concorda que não se envolverá em qualquer atividade com o Preview, incluindo o desenvolvimento e a distribuição de um aplicativo que interfira, perturbe, danifique ou acesse, de modo não autorizado, servidores, redes ou outras propriedades ou serviços da Google ou qualquer outro terceiro.
-
-4.5 Você concorda que é exclusivamente responsável por (e que a Google não tem qualquer responsabilidade com você ou terceiro) quaisquer dados, conteúdo ou recursos que criar, transmitir ou exibir por meio do Android e/ou de aplicativos do Android e pelas consequências que suas ações (incluindo perda ou dano que a Google possa sofrer) podem gerar.
-
-4.6 Você concorda que é exclusivamente responsável por (e que a Google não tem qualquer responsabilidade com você ou terceiro) qualquer violação das obrigações exigidas neste Contrato de licença, qualquer contrato ou termos de serviço aplicáveis a terceiros, qualquer lei ou norma aplicável e pelas consequências (incluindo a perda ou dano que a Google ou qualquer terceiro possa sofrer) de quaisquer violações.
-
-4.7 O Preview está em desenvolvimento e o seu teste e feedback são uma parte importante deste processo. Ao usar o Preview, você está ciente de que a implementação de alguns recursos ainda estão em desenvolvimento e que não se deve confiar que o Preview tem a funcionalidade completa de uma versão estável. Você concorda em não distribuir nem enviar publicamente quaisquer aplicativos usando este Preview, pois ele não será mais suportado após o lançamento oficial do Android SDK.
-
-5. Suas credenciais de desenvolvedor
-
-5.1 Você é responsável pela manutenção da confidencialidade de quaisquer credenciais de desenvolvedor que possam ser emitidas pela Google ou escolhidas por você e será o único responsável por todos os aplicativos que forem desenvolvidos sob suas credenciais de desenvolvedor.
-
-6. Privacidade e informações
-
-6.1 A fim de inovar e aprimorar continuamente o Preview, a Google pode coletar certas estatísticas de uso do software, incluindo, sem limitar-se, um identificador exclusivo, endereço IP associado, número de versão do software e informações sobre quais ferramentas e/ou serviços no Preview estão sendo usados e como estão sendo usados. Antes de coletar quaisquer dessas informações, o Preview o notificará e buscará seu consentimento. Se você recusar, as informações não serão coletadas.
-
-6.2 Os dados coletados são examinados coletivamente para aprimorar o Preview e são mantidos em conformidade com a Política de privacidade da Google acessível em http://www.google.com/policies/privacy/.
-
-7. Aplicativos de terceiros
-
-7.1 Ao usar o Preview para executar aplicativos desenvolvidos por terceiros ou que acessam dados, conteúdo ou recursos fornecidos por terceiros, você concorda que a Google não é responsável por tais aplicativos, dados, conteúdo ou recursos. Você compreende que quaisquer dados, conteúdo ou recursos passíveis de aceitação por meio de tais aplicativos de terceiros imputam responsabilidade exclusiva ao indivíduo que os originou. A Google não é responsável por qualquer perda ou dano que possa ocorrer como resultado do uso ou acesso de quaisquer aplicativos, dados, conteúdo ou recursos de terceiros.
-
-7.2 Você deve estar ciente de que os dados, conteúdo e recursos apresentados a você por aplicativos de terceiros podem ser protegidos pelos direitos de propriedade intelectual de posse dos fornecedores (ou de outras pessoas ou empresas em seus nomes). Não é permitido modificar, alugar, arrendar, emprestar, vender, distribuir nem criar trabalhos derivados com base nestes dados, conteúdo ou recursos (na totalidade ou em parte), salvo se houver permissão explícita especificada pelos respectivos detentores de direitos.
-
-7.3 Você reconhece que o uso de tais aplicativos, dados, conteúdo ou recursos de terceiros pode estar sujeito a termos adicionais entre você e o terceiro em questão.
-
-8. Uso de APIs da Google
-
-8.1 APIs da Google
-
-8.1.1 Ao usar qualquer API para recuperar dados da Google, você reconhece que eles podem ser protegidos por direitos de propriedade intelectual de posse da Google ou dos terceiros que fornecem os dados (ou de pessoas ou empresas em nomes deles). O uso de tal API pode estar sujeito a termos de serviço adicionais. Não é permitido modificar, alugar, arrendar, emprestar, vender, distribuir nem criar trabalhos derivados baseados nesses dados (na totalidade ou em parte), salvo se permitido pelos termos de serviço pertinentes.
-
-8.1.2 Se você usar qualquer API para recuperar dados de um usuário a partir da Google, reconhece e concorda que deve recuperar dados somente com consentimento explícito do usuário e somente quando, e para os fins limitados aos quais, o usuário conceder permissão para fazê-lo.
-
-9. Rescisão do Contrato de licença
-
-9.1 O Contrato de licença continuará a se aplicar até que ocorra uma rescisão sua ou da Google, como definido abaixo.
-
-9.2 Caso queira rescindir o Contrato de licença, você pode fazer isto cessando o uso do Preview e de qualquer credencial de desenvolvedor relevante.
-
-9.3 A Google pode, a qualquer momento, rescindir o Contrato de licença, com ou sem causa, com uma notificação.
-
-9.4 O Contrato de licença será encerrado automaticamente sem aviso ou outras ações na ocorrência de:
-(A) a Google interromper o fornecimento do Preview ou de determinadas partes do Preview aos usuários no país em que você reside ou de onde o serviço é usado; e
-(B) a Google emitir uma versão de lançamento final do Android SDK.
-
-9.5 Quando o Contrato de licença é rescindido, a licença concedida a você no Contrato de licença é finalizada, todo o uso do Preview será interrompido e as provisões dos parágrafos 10, 11, 12 e 14 deverão permanecer indefinidamente.
-
-10. EXCLUSÕES
-
-10.1 VOCÊ COMPREENDE E CONCORDA EXPRESSAMENTE QUE O RISCO DO USO DO PREVIEW É EXCLUSIVAMENTE SEU E QUE O PREVIEW É FORNECIDO NA FORMA EM QUE SE ENCONTRA E COMO DISPONIBILIZADO, SEM GARANTIA DE QUALQUER TIPO DA GOOGLE.
-
-10.2 O USO DO PREVIEW E DE QUALQUER MATERIAL BAIXADO OU OBTIDO DE OUTRO MODO PELO USO DO PREVIEW ESTÁ A SEU CRITÉRIO E RISCO E VOCÊ É O ÚNICO RESPONSÁVEL POR QUALQUER DANO AO SEU SISTEMA OPERACIONAL OU OUTRO DISPOSITIVO OU PELA PERDA DE DADOS QUE RESULTEM DE TAL USO. SEM LIMITAR OS PRECEDENTES, VOCÊ ENTENDE QUE O PREVIEW NÃO É UMA VERSÃO ESTÁVEL E QUE PODE CONTER ERROS, DEFEITOS E VULNERABILIDADES DE SEGURANÇA QUE PODEM RESULTAR EM DANOS SIGNIFICANTES, INCLUINDO A PERDA IRRECUPERÁVEL OU COMPLETA DO USO DO SISTEMA DO COMPUTADOR OU DE OUTROS DISPOSITIVOS.
-
-10.3 A GOOGLE EXCLUI EXPRESSAMENTE TODAS AS GARANTIAS E CONDIÇOES DE QUALQUER TIPO, EXPRESSAS OU IMPLÍCITAS, INCLUINDO, MAS NÃO LIMITADO A, GARANTIAS E CONDIÇÕES DE COMERCIALIZAÇÃO IMPLÍCITAS, ADEQUAÇÃO A UMA FINALIDADE PARTICULAR E A NÃO VIOLAÇÃO.
-
-11. LIMITAÇÃO DE RESPONSABILIDADE
-
-11.1 VOCÊ COMPREENDE E CONCORDA EXPRESSAMENTE QUE A GOOGLE, SUAS SUBSIDIÁRIAS, AFILIADAS E SEUS LICENCIADORES NÃO SERÃO RESPONSABILIZADOS POR VOCÊ SOB QUALQUER TEORIA DE RESPONSABILIDADE POR QUAISQUER DANOS, SEJAM ELES DIRETOS, INDIRETOS, INCIDENTAIS, ESPECIAIS, CONSEQUENCIAIS OU DE EXEMPLO QUE POSSAM INCORRER, INCLUINDO QUALQUER PERDA DE DADOS, INDEPENDENTE DE AVISO À GOOGLE OU A SEUS REPRESENTANTES OU DA NECESSIDADE DE AVISO SOBRE A POSSIBILIDADE DA INCORRÊNCIA DE TAIS PERDAS.
-
-12. Indenização
-
-12.1 Ao limite máximo permitido por lei, você concorda em defender, indenizar e isentar a Google, suas afiliadas e respectivos conselheiros, diretores, empregados e agentes com relação a todas e quaisquer reivindicações, ações, processos ou procedimentos, bem como todas e quaisquer perdas, responsabilidades, danos, custos e despesas (incluindo honorários advocatícios) decorrentes ou provenientes de: (a) seu uso do Preview, (b) qualquer aplicativo desenvolvido no Preview que infrinja direitos de propriedade intelectual de qualquer pessoa, difame qualquer pessoa ou viole seus direitos de publicidade ou privacidade e (c) qualquer não cumprimento deste Contrato de licença.
-
-13. Mudanças no Contrato de licença
-
-13.1 A Google pode realizar mudanças no Contrato de licença à medida que distribui novas versões do Preview. Quando essas mudanças forem realizadas, a Google fará uma nova versão do Contrato de licença disponível no site em que o Preview estiver disponível.
-
-14. Termos legais gerais
-
-14.1 Esse Contrato de licença constitui o contrato legal integral entre você e a Google e rege o uso do Preview (excluindo quaisquer serviços que a Google possa fornecer a você sob um contrato escrito em separado), e substitui inteiramente quaisquer contratos anteriores entre você e a Google em relação ao Preview.
-
-14.2 Você concorda que, se a Google não exercer nem impetrar qualquer direito ou recurso legal que esteja contido no Contrato de licença (ou que a Google detenha direitos nos termos de qualquer lei aplicável), não se considerará esse fato como uma renúncia formal aos direitos da Google e esses direitos ou recursos continuarão disponíveis à Google.
-
-14.3 Se qualquer tribunal de justiça que tiver a competência para decidir sobre esse tema determinar que qualquer cláusula do Contrato de licença é inválida, tal cláusula será removida do contrato sem afetar as cláusulas restantes ou sua vigência. As cláusulas restantes do Contrato de licença continuarão válidas e obrigatórias.
-
-14.4 Você reconhece e concorda que cada membro do grupo de empresas das quais a Google é a empresa controladora deve ser beneficiário terceiro do Contrato de licença e que essas outras empresas terão o poder de aplicar diretamente, e apoiar-se em, qualquer cláusula do Contrato de licença que confira um direito (ou direitos em favor) deles. Além disso, nenhuma outra pessoa nem empresa deve ser beneficiário terceiro do Contrato de licença.
-
-14.5 RESTRIÇÕES DE EXPORTAÇÃO. O PREVIEW ESTÁ SUJEITO ÀS LEIS E NORMAS DE EXPORTAÇÃO DOS ESTADOS UNIDOS. VOCÊ DEVE CUMPRIR TODAS AS LEIS E NORMAS DOMÉSTICAS E INTERNACIONAIS QUE SE APLICAREM AO PREVIEW. ESSAS LEIS INCLUEM RESTRIÇÕES SOBRE DESTINOS, USUÁRIOS FINAIS E USO FINAL.
-
-14.6 O Contrato de licença não pode ser atribuído nem transferido por você sem a aprovação prévia por escrito da Google. Qualquer tentativa de atribuição sem a aprovação será inválida. Você não deve delegar as próprias responsabilidades ou obrigações nos termos do Contrato de licença sem aprovação prévia por escrito da Google.
-
-14.7 O Contrato de licença e sua relação com a Google nos termos do contrato serão regidos pelas leis do estado da Califórnia sem considerar conflitos de disposições legais. Você e a Google concordam em se submeter à competência exclusiva dos tribunais localizados na comarca de Santa Clara, Califórnia, para dirimir quaisquer questões legais decorrentes do Contrato de licença. Não obstante a isso, você concorda que a Google continua habilitada a impetrar medidas cautelares (ou mecanismo legal urgente equivalente) em qualquer jurisdição.
-  </div><!-- sdk terms -->
-
-
-
-    <div id="sdk-terms-form">
-      <p>
-        <input id="agree" type="checkbox" name="agree" value="1" onclick="onAgreeChecked()" />
-        <label id="agreeLabel" for="agree">Li e concordo com todos os termos e condições expressos acima</label>
-      </p>
-      <p><a href="" class="button disabled" id="downloadForRealz" onclick="return onDownloadForRealz(this);"></a></p>
-    </div>
-
-
-  </div><!-- end TOS -->
-
-
-  <div id="landing">
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>Neste documento</h2>
-      <ol>
-        <li><a href="#sdk">Preview SDK</a></li>
-        <li><a href="#docs">Documentação do desenvolvedor</a></li>
-        <li><a href="#images">Imagens do sistema de hardware</a></li>
-      </ol>
-
-     <h2>Legacy downloads</h2>
-        <ol>
-           <li><a href="{@docRoot}preview/download_mp1.html">Developer Preview Archive</a></li>
-        </ol>
-  </div>
-</div>
-
-
-<p>
-  O Android M Preview SDK inclui ferramentas de desenvolvimento, arquivos de sistema do Android e arquivos da biblioteca
- para ajudar você a testar o aplicativo e novas APIs da próxima versão da plataforma. Este documento
- descreve como adquirir os componentes disponíveis para download da prévia para o teste do aplicativo.
-</p>
-
-
-<h2 id="sdk">Preview SDK</h2>
-
-<p>
-  O Preview SDK está disponível para download no <a href="{@docRoot}tools/help/sdk-manager.html">Android SDK Manager</a>. Para obter mais informações
- sobre o download e a configuração do Preview SDK, consulte <a href="{@docRoot}preview/setup-sdk.html#downloadSdk">Configuração do Preview SDK</a>.
-</p>
-
-
-<h2 id="docs">Documentação do desenvolvedor</h2>
-
-<p>
-  O pacote de download da documentação do desenvolvedor fornece informações de referência de API detalhadas e um relatório de diferença de API para a prévia.
-</p>
-
-<table>
-  <tr>
-    <th scope="col">Description</th>
-    <th scope="col">Download / Checksums</th>
-  </tr>
-  <tr id="docs-dl">
-    <td>Android M Preview 2<br>Developer Docs</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >m-preview-2-developer-docs.zip</a><br>
-      MD5: 1db6fff9c722b0339757e1cdf43663a8<br>
-      SHA-1: 5a4ae88d644e63824d21b0e18f8e3977a7665157
-    </td>
-  </tr>
-</table>
-
-
-<h2 id="images">Imagens do sistema de hardware</h2>
-
-<p>
-  Essas imagens do sistema permitem que você instale uma versão de prévia da plataforma em um dispositivo físico
-para fins de teste. Ao configurar um dispositivo com uma dessas imagens, é possível instalar e testar o aplicativo
- para verificar o seu desempenho na próxima versão da plataforma. O processo de instalação de uma imagem do sistema
- em um dispositivo <em>remove todos os dados do dispositivo</em>. Portanto, deve-se realizar um backup dos dados
- antes de instalar uma imagem do sistema.
-</p>
-
-<p class="warning">
-  <b>Aviso:</b> as seguintes imagens do sistema Android são prévias e estão sujeitas a alterações. O uso
- dessas imagens do sistema são governadas pelo Contrato de licença do Android SDK Preview. As imagens do sistema do Android Preview
- não são versões estáveis e podem conter erros e defeitos que podem resultar
- em danos aos sistemas do computador, aos dispositivos e aos dados. As imagens do sistema Android Preview
- não estão sujeitas ao mesmo teste do sistema operacional de fábrica e podem fazer com que o telefone e aplicativos e os serviços
- instalados parem de funcionar.
-</p>
-
-<table>
-  <tr>
-    <th scope="col">Device</th>
-    <th scope="col">Download / Checksums</th>
-  </tr>
-  <tr id="hammerhead">
-    <td>Nexus 5 (GSM/LTE) <br>"hammerhead"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >hammerhead-MPZ79M-preview-b1f4bde4.tgz</a><br>
-      MD5: 2ca9f18bf47a061b339bab52647ceb0d<br>
-      SHA-1: b1f4bde447eccbf8ce5d9b8b8ba954e3eac8e939
-    </td>
-  </tr>
-  <tr id="shamu">
-    <td>Nexus 6 <br>"shamu"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >shamu-MPZ79M-preview-e1024040.tgz</a><br>
-      MD5: 24a2118da340b9afedfbdfc026f6ff81<br>
-      SHA-1: e10240408859d5188c4aae140e1c539130ba614b
-    </td>
-  </tr>
-  <tr id="volantis">
-    <td>Nexus 9 <br>"volantis"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >volantis-MPZ79M-preview-9f305342.tgz</a><br>
-      MD5: 9edabf0a4c61b247f1cbb9dfdc0a899e<br>
-      SHA-1: 9f30534216f10899a6a75495fc7e92408ea333a7
-    </td>
-  </tr>
-
-  <tr id="fugu">
-    <td>Nexus Player <br>"fugu"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >fugu-MPZ79N-preview-fb63af98.tgz</a><br>
-      MD5: e8d081137a20b66df595ee69523314b5<br>
-      SHA-1: fb63af98302dd97be8de9313734d389ccdcce250
-    </td>
-  </tr>
-
-</table>
-
-<h3 id="install-image">Instalar uma imagem no dispositivo</h3>
-
-<p>
-  Para usar uma imagem de dispositivo para testes, deve-se instalá-lo em um dispositivo compatível. Siga
- as instruções abaixo para instalar uma imagem de sistema.
-</p>
-
-<ol>
-  <li>Faça o download e descompacte um dos pacotes de imagem do sistema listados aqui.</li>
-  <li>Faça um backup dos dados do dispositivo que deseja preservar.</li>
-  <li>Siga as instruções em
- <a href="https://developers.google.com/android/nexus/images#instructions">developers.google.com/android</a>
-  para programar em flash a imagem no dispositivo.</li>
-</ol>
-
-<p class="note">
-  <strong>Observação:</strong> ao programar em flash a imagem do sistema de prévia no dispositivo de desenvolvimento,
- ele é atualizado automaticamente com o próximo lançamento da prévia por meio de atualizações over-the-air (OTA).
-</p>
-
-<h3 id="revertDevice">Reverter um dispositivo para as especificações de fábrica</h3>
-
-<p>
-  Caso queira desinstalar a prévia e reverter o dispositivo para as especificações de fábrica, acesse
- <a href="http://developers.google.com/android/nexus/images">developers.google.com/android</a> e
- faça o download da imagem que deseja programar em flash no dispositivo. Siga as instruções nesta página
- para programar em flash a imagem no dispositivo.
-</p>
-
-  </div><!-- landing -->
-
-</div><!-- relative wrapper -->
-
-
-
-<script>
-  var urlRoot = "http://storage.googleapis.com/androiddevelopers/shareables/preview/";
-  function onDownload(link) {
-
-    $("#downloadForRealz").html("Download " + $(link).text());
-    $("#downloadForRealz").attr('href', urlRoot + $(link).text());
-
-    $("#tos").fadeIn('fast');
-    $("#landing").fadeOut('fast');
-
-    return true;
-  }
-
-
-  function onAgreeChecked() {
-    /* verify that the TOS is agreed */
-    if ($("input#agree").is(":checked")) {
-      /* reveal the download button */
-      $("a#downloadForRealz").removeClass('disabled');
-    } else {
-      $("a#downloadForRealz").addClass('disabled');
-    }
-  }
-
-  function onDownloadForRealz(link) {
-    if ($("input#agree").is(':checked')) {
-    /*
-      $("#tos").fadeOut('fast');
-      $("#landing").fadeIn('fast');
-    */
-
-      ga('send', 'event', 'M Preview', 'System Image', $("#downloadForRealz").html());
-
-    /*
-      location.hash = "";
-    */
-      return true;
-    } else {
-      return false;
-    }
-  }
-
-  $(window).hashchange( function(){
-    if (location.hash == "") {
-      location.reload();
-    }
-  });
-
-</script>
diff --git a/docs/html-intl/intl/pt-br/preview/features/background-optimization.jd b/docs/html-intl/intl/pt-br/preview/features/background-optimization.jd
deleted file mode 100644
index cf4bbe9..0000000
--- a/docs/html-intl/intl/pt-br/preview/features/background-optimization.jd
+++ /dev/null
@@ -1,391 +0,0 @@
-page.title=Otimizações em segundo plano
-page.metaDescription=Novas restrições a transmissões implícitas.
-page.keywords="android N", "implicit broadcasts", "job scheduler"
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>
-      Neste documento
-    </h2>
-
-    <ol>
-      <li>
-        <a href="#connectivity-action">Restrições sobre CONNECTIVITY_ACTION</a>
-      </li>
-
-      <li>
-        <a href="#sched-jobs">Agendamento de trabalhos de rede em conexões
- ilimitadas</a>
-      </li>
-
-      <li>
-        <a href="#monitor-conn">Monitoramento de conectividade de rede durante a execução
- do aplicativo</a>
-      </li>
-
-      <li>
-        <a href="#media-broadcasts">Restrições sobre NEW_PICTURE e
- NEW_VIDEO</a>
-      </li>
-
-      <li>
-        <a href="#new-jobinfo">Novos métodos JobInfo</a>
-      </li>
-
-      <li>
-        <a href="#new-jobparam">Novos métodos JobParameter</a>
-      </li>
-
-      <li>
-        <a href="#further-optimization">Otimização adicional do aplicativo</a>
-      </li>
-    </ol>
-  </div>
-</div>
-
-<p>
-  Os processos em segundo plano podem fazer uso intensivo de memória e bateria. Por exemplo, uma
- transmissão implícita poderá iniciar diversos processos em segundo plano registrados
- para escutá-la, mesmo se esses processos não forem muito usados. Isso pode afetar
- substancialmente o desempenho do dispositivo e a experiência do usuário.
-</p>
-
-<p>
-  Para aliviar esse problema, o Android N aplica as seguintes
-restrições:
-</p>
-
-<ul>
-  <li>Os aplicativos direcionados ao Preview não receberão transmissões {@link
- android.net.ConnectivityManager#CONNECTIVITY_ACTION} se estiverem
- registrados para recebê-las no seu manifesto. Os aplicativos em execução ainda
-poderão escutar {@code CONNECTIVITY_CHANGE} no encadeamento principal registrando um
-{@link android.content.BroadcastReceiver} em {@link
- android.content.Context#registerReceiver Context.registerReceiver()}.
-  </li>
-
-  <li>Os aplicativos não podem enviar nem receber transmissões {@link
- android.hardware.Camera#ACTION_NEW_PICTURE} ou {@link
- android.hardware.Camera#ACTION_NEW_VIDEO}. Essa otimização
- afeta todos os aplicativos e não apenas os direcionados ao Preview.
-  </li>
-</ul>
-
-<p>
-  Se o seu aplicativo usar qualquer uma dessas intenções, remova as dependências delas
- assim que possível para direcionar corretamente os dispositivos Android N.
-  A estrutura do Android oferece diversas soluções para reduzir a necessidade dessas
- transmissões implícitas. Por exemplo, {@link android.app.job.JobScheduler}
- e <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-{@code GcmNetworkManager}</a> oferecem mecanismos robustos para agendar operações
- de rede quando ocorrem condições especificadas, como conexão a uma
- rede ilimitada. Agora, você também pode usar {@link android.app.job.JobScheduler}
- para reagir a mudanças em provedores de conteúdo. Os objetos {@link android.app.job.JobInfo}
- encapsulam os parâmetros usados por {@link android.app.job.JobScheduler}
- para agendar o seu trabalho. Quando as condições do trabalho forem atendidas, o sistema
- executará o trabalho no {@link android.app.job.JobService} do seu aplicativo.
-</p>
-
-<p>
-  Neste documento, veremos como usar métodos alternativos, como
- {@link android.app.job.JobScheduler}, para adaptar seu aplicativo a essas novas
- restrições.
-</p>
-
-<h2 id="connectivity-action">
-  Restrições sobre CONNECTIVITY_ACTION
-</h2>
-
-<p>
-  Os aplicativos direcionados ao Android N não receberão transmissões {@link
- android.net.ConnectivityManager#CONNECTIVITY_ACTION} se estiverem
- registrados para recebê-las no seu manifesto e os processos que dependerem dessas
- transmissões não serão iniciados. Isso pode ser um problema para aplicativos que quiserem
- escutar mudanças de rede ou executar atividades de rede em massa quando o
- dispositivo se conectar a uma rede ilimitada. Já existem várias soluções para contornar essa
- restrição na estrutura do Android, mas a escolha da solução correta
- depende do que o aplicativo pretende realizar.
-</p>
-
-<p class="note">
-  <strong>Observação:</strong> Um {@link android.content.BroadcastReceiver} registrado em
- {@link android.content.Context#registerReceiver Context.registerReceiver()}
- continuará a receber essas transmissões enquanto o aplicativo estiver em execução.
-</p>
-
-<h3 id="sched-jobs">
-  Agendamento de trabalhos de rede em conexões ilimitadas
-</h3>
-
-<p>
-  Ao usar a classe {@link android.app.job.JobInfo.Builder JobInfo.Builder}
- para compilar o objeto {@link android.app.job.JobInfo}, aplique o método {@link
-  android.app.job.JobInfo.Builder#setRequiredNetworkType
-  setRequiredNetworkType()} e passe {@link android.app.job.JobInfo
-  JobInfo.NETWORK_TYPE_UNMETERED} como parâmetro do trabalho. O código a seguir
- agendará a execução de um serviço quando o dispositivo se conectar a uma rede
- ilimitada e estiver carregando:
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-      (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo job = new JobInfo.Builder(
-    MY_BACKGROUND_JOB,
-    new ComponentName(context, MyJobService.class))
-      .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
-      .setRequiresCharging(true)
-      .build();
-  js.schedule(job);
-}
-</pre>
-
-<p>
-  Quando as condições para o trabalho forem atendidas, o aplicativo receberá um retorno de chamada para executar
- o método {@link android.app.job.JobService#onStartJob onStartJob()} na
- {@code JobService.class} especificada. Para ver mais exemplos da implementação de {@link
-  android.app.job.JobScheduler}, consulte o <a href="{@docRoot}samples/JobScheduler/index.html">aplicativo de exemplo do JobScheduler</a>.
-</p>
-
-<p>
-  Os aplicativos que usarem serviços do GMSCore e forem direcionados ao Android 5.0 (nível da API 21)
- ou anterior poderão usar <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-  {@code GcmNetworkManager}</a> e especificar {@code Task.NETWORK_STATE_UNMETERED}.
-</p>
-
-<h3 id="monitor-conn">
-  Monitoramento de conectividade de rede durante a execução do aplicativo
-</h3>
-
-<p>
-  Os aplicativos em execução ainda poderão escutar {@code CONNECTIVITY_CHANGE} com um
- {@link android.content.BroadcastReceiver} registrado. No entanto, a API {@link
- android.net.ConnectivityManager} oferece um método mais robusto para solicitar
- um retorno de chamada apenas quando condições de rede especificadas são atendidas.
-</p>
-
-<p>
-  Os objetos {@link android.net.NetworkRequest} definem os parâmetros do
- retorno de chamada de rede em termos de {@link android.net.NetworkCapabilities}. Objetos
- {@link android.net.NetworkRequest} são criados com a classe {@link
-  android.net.NetworkRequest.Builder NetworkRequest.Builder}. Em seguida, {@link
-  android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,
-  android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()}
- passa o objeto {@link android.net.NetworkRequest} ao sistema. Quando
- as condições de rede forem atendidas, o aplicativo receberá um retorno de chamada para executar o
- método {@link android.net.ConnectivityManager.NetworkCallback#onAvailable
-  onAvailable()} definido em sua classe {@link
-  android.net.ConnectivityManager.NetworkCallback}.
-</p>
-
-<p>
-  O aplicativo continuará a receber retornos de chamada até que o aplicativo encerre ou chame
-  {@link android.net.ConnectivityManager#unregisterNetworkCallback
-  unregisterNetworkCallback()}.
-</p>
-
-<h2 id="media-broadcasts">
-  Restrições sobre NEW_PICTURE e NEW_VIDEO
-</h2>
-
-<p>
-  No Android N, os aplicativos não conseguem enviar nem receber transmissões {@link
- android.hardware.Camera#ACTION_NEW_PICTURE} ou {@link
- android.hardware.Camera#ACTION_NEW_VIDEO}. Essa restrição ajuda a
- aliviar os impactos no desempenho e na experiência de usuário quando vários aplicativos devem
- despertar para processar uma nova imagem ou vídeo. O Android N
- estende {@link android.app.job.JobInfo} e {@link
- android.app.job.JobParameters} para oferecer uma solução alternativa.
-</p>
-
-<h3 id="new-jobinfo">
-  Novos métodos JobInfo
-</h3>
-
-<p>
-  Para acionar trabalhos em mudanças de URI de conteúdo, o Android N estende
- a API {@link android.app.job.JobInfo} com os seguintes métodos:
-</p>
-
-<dl>
-  <dt>
-    {@code JobInfo.TriggerContentUri()}
-  </dt>
-
-  <dd>
-    Encapsula os parâmetros necessários para acionar um trabalho quando ocorrem mudanças de URI de conteúdo.
-  </dd>
-
-  <dt>
-    {@code JobInfo.Builder.addTriggerContentUri()}
-  </dt>
-
-  <dd>
-    Passa um objeto {@code TriggerContentUri} para {@link
-    android.app.job.JobInfo}. Um {@link android.database.ContentObserver}
- monitora o URI de conteúdo encapsulado. Se houver vários objetos {@code
-    TriggerContentUri} associados a um trabalho, o sistema fornecerá um
- retorno de chamada, mesmo se indicar uma mudança em apenas um dos URIs de conteúdo.
-  </dd>
-
-  <dd>
-    Adicione o sinalizador {@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS} para
- acionar o trabalho em caso de mudança em qualquer um dos descendentes do URI especificado. Esse indicador
- corresponde ao parâmetro {@code notifyForDescendants} passado para {@link
-    android.content.ContentResolver#registerContentObserver
-    registerContentObserver()}.
-  </dd>
-</dl>
-
-<p class="note">
-  <strong>Observação:</strong> não é possível usar {@code TriggerContentUri()}
- juntamente com {@link android.app.job.JobInfo.Builder#setPeriodic
-  setPeriodic()} ou {@link android.app.job.JobInfo.Builder#setPersisted
-  setPersisted()}. Para monitorar continuamente mudanças de conteúdo, agende um novo
- {@link android.app.job.JobInfo} antes que o {@link
-  android.app.job.JobService} do aplicativo encerre o processamento do retorno de chamada mais recente.
-</p>
-
-<p>
-  O exemplo de código a seguir agenda um trabalho que será acionado quando o sistema indicar
- uma mudança no URI de conteúdo {@code MEDIA_URI}:
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-          (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo.Builder builder = new JobInfo.Builder(
-          MY_BACKGROUND_JOB,
-          new ComponentName(context, MediaContentJob.class));
-  builder.addTriggerContentUri(
-          new JobInfo.TriggerContentUri(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
-          JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
-  js.schedule(builder.build());
-}
-</pre>
-<p>
-  Quando o sistema indicar uma mudança nos URIs de conteúdo especificados, o aplicativo
- receberá um retorno de chamada e um objeto {@link android.app.job.JobParameters} será
- passado para o método {@link android.app.job.JobService#onStartJob onStartJob()}
- na {@code MediaContentJob.class}.
-</p>
-
-<h3 id="new-jobparam">
-  Novos métodos JobParameter
-</h3>
-
-<p>
-  O Android N também estende {@link android.app.job.JobParameters} para
- permitir que o aplicativo receba informações úteis sobre quais autoridades de conteúdo
- e URIs acionaram o trabalho:
-</p>
-
-<dl>
-  <dt>
-    {@code Uri[] getTriggeredContentUris()}
-  </dt>
-
-  <dd>
-    Retorna uma matriz de URIs que acionaram o trabalho. O retorno será {@code
-    null} se o trabalho não foi acionado por URIs (por exemplo, o trabalho foi
- acionado devido a um prazo ou por outro motivo) ou o número de URIs modificados
- for maior que 50.
-  </dd>
-
-  <dt>
-    {@code String[] getTriggeredContentAuthorities()}
-  </dt>
-
-  <dd>
-    Retorna uma matriz de strings de autoridades de conteúdo que acionaram o trabalho.
-    Se a matriz retornada não for {@code null}, use {@code getTriggeredContentUris()}
- para recuperar os detalhes sobre quais URIs foram modificados.
-  </dd>
-</dl>
-
-<p>
-  O exemplo de código a seguir substitui o método {@link
-  android.app.job.JobService#onStartJob JobService.onStartJob()} e
- registra as autoridades de conteúdo e URIs que acionaram o trabalho:
-</p>
-
-<pre>
-&#64;Override
-public boolean onStartJob(JobParameters params) {
-  StringBuilder sb = new StringBuilder();
-  sb.append("Media content has changed:\n");
-  if (params.getTriggeredContentAuthorities() != null) {
-      sb.append("Authorities: ");
-      boolean first = true;
-      for (String auth :
-          params.getTriggeredContentAuthorities()) {
-          if (first) {
-              first = false;
-          } else {
-             sb.append(", ");
-          }
-           sb.append(auth);
-      }
-      if (params.getTriggeredContentUris() != null) {
-          for (Uri uri : params.getTriggeredContentUris()) {
-              sb.append("\n");
-              sb.append(uri);
-          }
-      }
-  } else {
-      sb.append("(No content)");
-  }
-  Log.i(TAG, sb.toString());
-  return true;
-}
-</pre>
-
-<h2 id="further-optimization">
-  Otimização adicional do aplicativo
-</h2>
-
-<p>
-  A otimização dos aplicativos para execução em dispositivos com pouca memória ou em
- condições de pouca memória pode melhorar o desempenho e a experiência do usuário. A remoção de
- dependências de serviços em segundo plano e receptores de transmissão
- implícita registrados estatisticamente pode aprimorar a execução do aplicativo nesses dispositivos. Embora
- o Android N avance na redução de alguns desses problemas,
- recomendamos que você otimize os aplicativos para execução sem o uso desses
- processos em segundo plano.
-</p>
-
-<p>
-  O Android N introduz alguns comandos adicionais do <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge (ADB)</a> que
- podem ser usados para testar o comportamento do aplicativo de teste com esses processos em segundo plano desativados:
-</p>
-
-<ul>
-  <li>Para simular condições em que transmissões implícitas e serviços em segundo plano
- não estão disponíveis, insira o seguinte comando:
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set &lt;package&gt; RUN_IN_BACKGROUND ignore}
-</pre>
-  </li>
-
-  <li>Para reativar transmissões implícitas e serviços em segundo plano, insira o
- seguinte comando:
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set &lt;package&gt; RUN_IN_BACKGROUND allow}
-</pre>
-  </li>
-</ul>
diff --git a/docs/html-intl/intl/pt-br/preview/features/icu4j-framework.jd b/docs/html-intl/intl/pt-br/preview/features/icu4j-framework.jd
deleted file mode 100644
index df5c3a4..0000000
--- a/docs/html-intl/intl/pt-br/preview/features/icu4j-framework.jd
+++ /dev/null
@@ -1,159 +0,0 @@
-page.title=ICU4J Android Framework APIs
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>Neste documento:</h2>
-<ol>
-    <li><a href="#relation">Relação com o ICU4J</a></li>
-    <li><a href="#migration">Migrar para APIs android.icu do ICU4J </a></li>
-    <li><a href="#licence">Licenciamento</a></li>
-</ol>
-
-<h2>Veja também</h2>
-<ol>
-  <li>
-    <a class="external-link" href="http://userguide.icu-project.org">Documentação para ICU4J</a>
-  </li>
-
-  <li>
-    <a class="external-link" href="http://site.icu-project.org/#TOC-What-is-ICU-">Últimos padrões com suporte
- do ICU4J</a>
-  </li>
-</ol>
-</div>
-</div>
-
-<p>
-  O ICU4J é um conjunto de bibliotecas Java de código aberto e amplamente usadas que fornecem suporte para Unicode
- e globalização para aplicativos de software. O Android N
- expõe um subconjunto de APIs do ICU4J na estrutura do Android para uso dos desenvolvedores de aplicativos
- no pacote {@code android.icu}. Essas APIs usam
- dados de localização presentes no dispositivo. Consequentemente, você pode reduzir o uso de APK
- ao não compilar as bibliotecas do ICU4J no seu APK. Em vez disso, pode
- simplesmente chamá-las na estrutura. (Neste caso, pode ser conveniente fornecer
- <a href="{@docRoot}google/play/publishing/multiple-apks.html">várias versões
- do seu APK</a> para que os usuários que tenham versões inferiores ao Android N
- possam fazer o download de uma versão do aplicativo que contenha as bibliotecas do ICU4J.)
-</p>
-
-<p>
-  Este documento começa fornecendo informações básicas sobre os níveis mínimos da
- Android API necessários para oferecer suporte a essas bibliotecas. Em seguida, ele explica o que
- você deve saber sobre a implementação do ICU4J específica do Android. Por fim,
- ele informa como usar as APIs do ICU4J na estrutura do Android.
-</p>
-
-<h2 id="relation">Relação com o ICU4J</h2>
-
-<p>
-  O Android N expõe um subconjunto de APIs do ICU4J por meio do pacote
- <code>android.icu</code>, não do <code>com.ibm.icu</code>. A
- estrutura do Android pode optar por não
- expor as APIs do ICU4J por diversos motivos. Por exemplo, o Android N não expõe
- algumas APIs obsoletas ou que a equipe do ICU ainda não declarou como
- estáveis. Conforme a equipe do ICU torna APIs obsoletas, o Android também as marcará
- como obsoletas, mas continuará incluindo-as.
-</p>
-
-<p class="table-caption"><strong>Tabela 1.</strong> Versões ICU e CLDR usadas
- no Android N.</p>
-<table>
-<tr>
-<th>Nível da Android API</th>
-<th>Versão ICU</th>
-<th>Versão CLDR</th>
-</tr>
-<tr>
-<td>Android N</td>
-<td>56</td>
-<td>28</td>
-</tr>
-</table>
-
-<p>Algumas observações importantes:</p>
-
-<ul>
-<li>As APIs de estrutura do Android para ICU4J não incluem todas as APIs do ICU4J.</li>
-<li>Desenvolvedores de NDK devem saber que o Android ICU4C não é compatível.</li>
-<li>As APIs da estrutura do Android não substituem o suporte do Android para a
-<a href="{@docRoot}guide/topics/resources/localization.html">localização com
-recursos</a>.</li>
-</ul>
-
-<h2 id="migration">Migrar do pacote com.ibm.icu para o android.icu</h2>
-
-<p>
-  Se você já estiver usando as APIs do ICU4J no seu aplicativo e as APIs
- <code>android.icu</code> atenderem aos seus requisitos, a migração para
- as APIs de estrutura exigirão que você altere as importações Java
- de <code>com.ibm.icu</code> para <code>android.icu</code>. Você, então, poderá
- remover sua própria cópia dos arquivos do ICU4J do APK.
-</p>
-
-<p class="note">
-  <b>Observação</b>: As APIs de estrutura do ICU4J usam o namespace {@code android.icu}
- em vez de {@code com.ibm.icu}. Isso ocorre para evitar conflitos
- de namespace em APKs que contêm as próprias bibliotecas {@code com.ibm.icu}.
-</p>
-
-<h3 id="migrate-from-android">
-  Migrar para APIs android.icu de outras APIs do Android SDK
-</h3>
-
-<p>
-  Algumas classes dos pacotes <code>java</code> e <code>android</code> têm
- equivalentes para as encontradas no ICU4J. No entanto, o ICU4J frequentemente fornece um suporte
- mais amplo para padrões e linguagens.
-</p>
-<p>Alguns exemplos para você começar:</p>
-<table>
-<tr>
-<th>Classe</th>
-<th>Alternativas</th>
-</tr>
-<tr>
-<td><code>java.lang.Character</code> </td>
-<td><code>android.icu.lang.UCharacter</code> </td>
-</tr>
-<tr>
-<td><code>java.text.BreakIterator</code> </td>
-<td><code>android.icu.text.BreakIterator</code> </td>
-</tr>
-<tr>
-<td><code>java.text.DecimalFormat</code> </td>
-<td><code>android.icu.text.DecimalFormat</code> </td>
-</tr>
-<tr>
-<td><code>java.util.Calendar</code></td>
-<td>
-<code>android.icu.util.Calendar</code></td>
-</tr>
-<tr>
-<td><code>android.text.BidiFormatter</code>
- </td>
-<td><code>android.icu.text.Bidi</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateFormat</code>
- </td>
-<td><code>android.icu.text.DateFormat</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateUtils</code> </td>
-<td><code>android.icu.text.DateFormat</code>
-<code>android.icu.text.RelativeDateTimeFormatter</code>
-</td>
-</tr>
-</table>
-
-<h2 id="licence">Licenciamento</h2>
-
-<p>
-  O ICU4J é liberado sob a licença do ICU. Para saber mais, consulte o <a class="external-link" href="http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-">Guia do usuário do
- ICU.</a>
-</p>
diff --git a/docs/html-intl/intl/pt-br/preview/features/multilingual-support.jd b/docs/html-intl/intl/pt-br/preview/features/multilingual-support.jd
deleted file mode 100644
index c00eb9b..0000000
--- a/docs/html-intl/intl/pt-br/preview/features/multilingual-support.jd
+++ /dev/null
@@ -1,221 +0,0 @@
-page.title=Idioma e localidades
-page.tags=androidn
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>Neste documento:</h2>
-<ol>
-	  <li><a href="#preN">Desafios ao resolver recursos de idioma</a></li>
-    <li><a href="#postN">Melhorias na estratégia de resolução de recursos</a></li>
-    <li><a href="#design">Projetar seu aplicativo para oferecer suporte a
- localidades adicionais</a></li>
-
-</ol>
-
-</div>
-</div>
-
-<p>O Android N oferece suporte avançado para usuários multilíngues,
-permitindo que eles selecionem várias localidades nas configurações. O Android N
-fornece esse recurso ao expandir significativamente a quantidade de localidades com suporte
-e mudando a forma como o sistema resolve recursos. O novo método para resolver
-recursos é mais robusto e foi projetado para ser compatível com APKs existentes, mas
-tenha cuidado adicional para identificar comportamentos inesperados. Por exemplo, você
-deve testar para garantir que seu aplicativo assuma o idioma esperado por padrão. Além disso,
-se seu aplicativo oferecer suporte a vários idiomas, você deverá garantir que esse suporte funcione da maneira
-esperada. Por fim, garanta que seu aplicativo possa lidar corretamente
-com idiomas que ele não tenha sido explicitamente projetado para suportar.</p>
-
-<p>Este documento começa explicando a estratégia de resolução de recursos anterior ao
-Android N. Em seguida, ele descreve a estratégia
-de resolução de recursos aprimorada do Android N. Por fim, ele explica como aproveitar as vantagens
-do maior número de localidades para oferecer suporte a usuários multilíngues.</p>
-
-<h2 id="preN">Desafios ao resolver recursos de idioma</h2>
-
-<p>Antes do Android N, o Android nem sempre conseguia
- fazer a correspondência correta entre aplicativos e localidades do sistema.</p>
-
- <p>Considere, por exemplo, que temos a seguinte situação:</p>
- <ul>
- <li>o idioma padrão do seu aplicativo é {@code en_US} (inglês - EUA), mas ele também tem
- strings em espanhol localizadas em arquivos de recursos {@code es_ES}
-.</li>
- <li> Um dispositivo está definido para {@code es_MX}. </li>
-
-<p>Quando seu código Java usa strings como referência, o sistema carrega
-strings do arquivo de recursos padrão ({@code en_US}), mesmo que o aplicativo tenha recursos em
-espanhol localizados em {@code es_ES}. Isso acontece porque, quando
- não consegue encontrar uma correspondência exata, o sistema continua procurando recursos após extrair o
- código do país da localidade. Por fim, se não há correspondência, o sistema volta
- ao padrão, que é {@code en_US}. </p>
-
-
-<p>O sistema também usaria {@code en_US} como padrão se o usuário escolhesse um idioma
- não suportado pelo aplicativo, como o francês. Por exemplo:</p>
-
-<p class="table-caption" id="t-resource-res">
-<strong>Tabela 1.</strong> Resolução de recurso sem uma correspondência exata de localidade.
-</p>
-<table>
-<tbody>
-<tr>
-<th>Configurações do usuário</th>
-<th>Recursos do aplicativo</th>
-<th>Resolução do recurso</th>
-</tr>
-<tr>
-<td>fr_CH</td>
-<td>
-padrão (en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
- <td>
-Tentativa de fr_CH =&gt; Falha<br>
-Tentativa de fr =&gt; Falha<br>
-Usar o padrão (en)
-</td>
- </tr>
- </tbody>
-</table>
-
-
-<p>Neste exemplo, o sistema exibe strings em inglês sem saber
-se o usuário entende inglês. Esse comportamento é bastante comum
-hoje em dia. O Android N deverá reduzir de forma significativa a frequência de
-resultados como esse.</p>
-
-<h2 id="postN">Melhorias na estratégia de resolução de recursos</h2>
-<p>O Android N proporciona uma resolução de recurso mais robusta e
-encontra soluções alternativas melhores. No entanto, para agilizar a resolução e melhorar
- a capacidade de manutenção, você deve armazenar os recursos no dialeto pai mais comum.
- Por exemplo, se você estava armazenando recursos em espanhol no diretório {@code es-US}
- antes, mova-os para o diretório {@code es-419}, que contém o espanhol latino-americano.
- Da mesma maneira, se você tiver strings de recurso em uma pasta {@code en-GB}, renomeie
- essa pasta para {@code en-001} (inglês internacional), pois o pai mais comum
- para strings <code>en-GB</code> é {@code en-001}.
- O exemplo a seguir explica por que essas práticas melhoram o desempenho e
-a confiabilidade da resolução de recursos.</p>
-
-<h3>Exemplos de resolução de recursos</h3>
-
-<p>Com o Android N, o caso descrito na <strong>Tabela 1</strong> é resolvido
-de forma diferente:</p>
-
-<p class="table-caption" id="t-improved-res">
-<strong>Tabela 2.</strong> Uma estratégia de resolução melhorada para quando não há
-uma correspondência exata para a localidade.</p>
-<table>
-<tr>
-<th>Configurações do usuário</th>
-<th>Recursos do aplicativo</th>
-<th>Resolução do recurso</th>
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-</ol>
-</td>
-<td>
-padrão (en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
-<td>
-Tentativa de fr_CH =&gt; Falha<br>
-Tentativa de fr =&gt; Falha<br>
-Tentativa de filhos de fr =&gt; fr_FR<br>
-Usar fr_FR
-</td>
-</tr>
-
-</table>
-
-
-<p>Agora o usuário obtém recursos em francês em vez de inglês. Esse exemplo também mostra
- por que você deve armazenar strings em francês em {@code fr} em vez de em {@code fr_FR}
- para o Android N. Nesse caso, a ação necessária é fazer a correspondência com o dialeto pai mais próximo,
- tornando a resolução mais rápida e mais previsível.</p>
-
-<p>Além dessa lógica de resolução melhorada, agora o Android oferece mais
- idiomas de usuário dentre os quais escolher. Vamos experimentar o exemplo acima novamente com o italiano
- especificado como um idioma de usuário adicional, mas sem suporte para francês no aplicativo.  </p>
-
-<p class="table-caption" id="t-2d-choice">
-<strong>Tabela 3.</strong> Resolução de recurso quando o aplicativo faz a correspondência apenas da
-segunda configuração de localidade preferencial do usuário.</p>
-<table>
-<tr>
-<th>Configurações do usuário</th>
-<th>Recursos do aplicativo</th>
-<th>Resolução do recurso</th>
-
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-<li> it_CH</li>
-</ol>
-</td>
-<td>
-padrão (en)<br>
-de_DE<br>
-es_ES<br>
-it_IT<br>
-</td>
-<td>
-Tentativa de fr_CH =&gt; Falha<br>
-Tentativa de fr =&gt; Falha<br>
-Tentativa de filhos de fr =&gt; Falha<br>
-Tentativa de it_CH =&gt; Falha<br>
-Tentativa de it =&gt; Falha<br>
-Tentativa de filhos de it =&gt; it_IT<br>
-Usar it_IT
-</td>
-
-</tr>
-
-</table>
-<p>O usuário obtém um idioma que ele compreende, mesmo que o aplicativo não tenha suporte para
-o francês.</p>
-
-
-<h2 id="design">Projetar seu aplicativo para oferecer suporte a localidades adicionais</h2>
-<h3>LocaleList API</h3>
-
-<p>O Android N adiciona uma nova API {@code LocaleList.getDefault()}
-que permite que os aplicativos façam uma consulta direta na lista de idiomas especificados por um usuário. Essa API
-permite que você crie um comportamento mais sofisticado
- para o aplicativo e uma exibição de conteúdo mais otimizada. Por exemplo, uma pesquisa
- pode mostrar resultados em vários idiomas com base nas configurações do usuário.  Aplicativos de navegador
- podem evitar ofertas de tradução de páginas em um idioma que o usuário conhece
- e os aplicativos de teclado também podem ativar todos os layouts apropriados automaticamente. </p>
-
-<h3>Formatadores</h3>
-
-<p>Até o Android 6.0 (nível da API 23), o Android oferecia suporte para apenas uma ou duas localidades
- para muitos idiomas comuns
-(en, es, ar, fr, ru). Como só existiam poucas variantes de cada idioma,
-os aplicativos podiam armazenar alguns números e datas como strings no código
-nos arquivos de recurso.  No entanto, com o conjunto mais amplo de localidades suportadas do Android,
-podem existir
-diferenças significativas nos formatos de data, hora, moeda e informações
-similares dentro da mesma localidade. Colocar formatos no código pode produzir uma
-experiência confusa para os usuários.  Portanto, ao desenvolver para o Android N,
-não deixe de usar formatadores em vez de strings no código para números e datas.</p>
-
-<p>Um bom exemplo é o árabe, cujo suporte no Android N foi expandido de
-uma {@code ar_EG} para 27 localidades de árabe. Essas localidades podem compartilhar a maioria dos recursos,
-mas algumas preferem dígitos ASCII, enquanto outras preferem dígitos nativos. Por exemplo,
-quando você quer criar uma frase com uma variável em dígito, como
-“Choose a 4 digit pin”, use formatadores como mostrado abaixo:</p>
-
-<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>
diff --git a/docs/html-intl/intl/pt-br/preview/features/notification-updates.jd b/docs/html-intl/intl/pt-br/preview/features/notification-updates.jd
deleted file mode 100644
index 36988da..0000000
--- a/docs/html-intl/intl/pt-br/preview/features/notification-updates.jd
+++ /dev/null
@@ -1,391 +0,0 @@
-page.title=Notificações
-page.tags=notificações
-helpoutsWidget=true
-page.image=/preview/images/notifications-card.png
-
-trainingnavtop=true
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-
-<!-- table of contents -->
-<h2>Este documento inclui</h2>
-<ol>
-  <li><a href="#direct">Resposta direta</a></li>
-  <li><a href="#bundle">Notificações empacotadas</a></li>
-  <li><a href="#custom">Visualizações personalizadas</a></li>
-  <li><a href="#style">Estilo de mensagem</a></li>
-</ol>
-
-</div>
-</div>
-
-<p>O Android N introduz diversas APIs novas que permitem que aplicativos publiquem
- notificações altamente visíveis e interativas.</p>
-
-<p>O Android N estende a API de notificação {@link android.support.v4.app.RemoteInput}
- atual para permitir respostas em linha em celulares. Esse recurso permite que os usuários
- respondam rapidamente na aba de notificações sem acessar o aplicativo.</p>
-
-<p>
-  O Android N permite empacotar notificações semelhantes para
- exibição como única notificação. Para que isso seja possível, o Android N usa o método {@link
-  android.support.v4.app.NotificationCompat.Builder#setGroup
-  NotificationCompat.Builder.setGroup()} existente. Os usuários podem expandir todas as
- notificações, executando ações como responder e descartar em cada uma
- delas individualmente na aba de notificações.
-</p>
-
-<p>Por fim, o Android N também adiciona várias APIs que permitem usar decorações
- do sistema nas visualizações de notificação personalizadas do aplicativo. Essas APIs ajudam
- a garantir que as visualizações de notificação compartilhem uma apresentação consistente com os
- modelos padrão.</p>
-
-<p>Este documento destaca algumas principais mudanças que você deve considerar
- ao usar os novos recursos de notificação em aplicativos.</p>
-
-<h2 id="direct">Resposta direta</h2>
-
-<p>Com o recurso de resposta direta no Android N, os usuários podem responder
- rapidamente a mensagens de texto ou atualizar listas de tarefas diretamente na interface de
- notificação. Em um dispositivo portátil, a ação de resposta em linha aparece como botão adicional
- anexado à notificação. Quando um usuário responde pelo teclado, o sistema anexa
- a resposta de texto à intenção especificada como ação de notificação e envia a intenção ao aplicativo no dispositivo.
-
-
-<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
-  {@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
-<p class="img-caption">
-  <strong>Figura 1.</strong>O Android N adiciona o botão de ação <strong>Reply</strong>
-.
-</p>
-
-<h3>Adição de ações de resposta em linha</h3>
-
-<p>Para criar uma ação de notificação com suporte à resposta direta:
-</p>
-
-<ol>
-<li>Crie uma instância de {@link android.support.v4.app.RemoteInput.Builder}
- que possa ser adicionada à ação de
- notificação. O construtor dessa classe aceita uma string, usada pelo sistema como chave
- da entrada de texto. Posteriormente, o aplicativo no dispositivo usará essa chave para recuperar o texto
- da entrada.
-
-<pre>
-// Key for the string that's delivered in the action's intent.
-private static final String KEY_TEXT_REPLY = "key_text_reply";
-String replyLabel = getResources().getString(R.string.reply_label);
-RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
-        .setLabel(replyLabel)
-        .build();
-</pre>
-</li>
-<li>Anexe o objeto {@link android.support.v4.app.RemoteInput}
- a uma ação usando <code>addRemoteInput()</code>.
-
-<pre>
-// Create the reply action and add the remote input.
-Notification.Action action =
-        new Notification.Action.Builder(R.drawable.ic_reply_icon,
-                getString(R.string.label), replyPendingIntent)
-                .addRemoteInput(remoteInput)
-                .build();
-</pre>
-</li>
-
-<li>Aplique a ação a uma notificação e emita a notificação.
-
-<pre>
-// Build the notification and add the action.
-Notification newMessageNotification =
-        new Notification.Builder(mContext)
-                .setSmallIcon(R.drawable.ic_message)
-                .setContentTitle(getString(R.string.title))
-                .setContentText(getString(R.string.content))
-                .addAction(action))
-                .build();
-
-// Issue the notification.
-NotificationManager notificationManager =
-        NotificationManager.from(mContext);
-notificationManager.notify(notificationId, newMessageNotification);
-
-</pre>
-</li>
-
-</ol>
-
-
-<p> O sistema solicita que o usuário informe uma resposta quando acionar a
- ação de notificação. </p>
-
-<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
-    {@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>Figura 2.</strong> O usuário insere texto na aba de notificações.
-</p>
-
-<h3>
-  Recuperação da entrada do usuário na resposta em linha
-</h3>
-
-<p>
-  Para receber a entrada do usuário da interface de notificação para a atividade
- declarada na intenção de ação de resposta:
-</p>
-
-<ol>
-  <li>Chame {@link android.support.v4.app.RemoteInput#getResultsFromIntent
- getResultsFromIntent()} passando a intenção da ação de notificação como
- parâmetro de entrada. Esse método retorna um {@link android.os.Bundle} que
- contém a resposta de texto.
-
-    <pre>
-Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-</pre>
-  </li>
-
-  <li>Consulte a resposta usando a chave de resultado (fornecida ao construtor {@link
- android.support.v4.app.RemoteInput.Builder}). Você pode concluir
- este processo e recuperar o texto de entrada criando um método, como no
- snippet de código a seguir:
-
-    <pre>
-// Obtain the intent that started this activity by calling
-// Activity.getIntent() and pass it into this method to
-// get the associated string.
-
-private CharSequence getMessageText(Intent intent) {
-    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-    if (remoteInput != null) {
-        return remoteInput.getCharSequence(KEY_TEXT_REPLY);
-    }
-    return null;
- }
-</pre>
-  </li>
-
-  <li>Crie e emita outra notificação usando o mesmo código que
- você forneceu para a notificação anterior. O indicador de progresso
- desaparece da interface de notificação para informar os usuários que houve uma resposta
- bem-sucedida. Ao trabalhar com esta nova notificação, use o contexto que é passado
- ao método {@code onReceive()} do receptor.
-
-    <pre>
-// Build a new notification, which informs the user that the system
-// handled their interaction with the previous notification.
-Notification repliedNotification =
-        new Notification.Builder(context)
-                .setSmallIcon(R.drawable.ic_message)
-                .setContentText(getString(R.string.replied))
-                .build();
-
-// Issue the new notification.
-NotificationManager notificationManager =
-        NotificationManager.from(context);
-notificationManager.notify(notificationId, repliedNotification);
-</pre>
-  </li>
-</ol>
-
-<p>
-  Para aplicativos interativos, como bate-papos, pode ser útil incluir contexto
- adicional ao lidar com texto recebido. Por exemplo, estes aplicativos podem exibir
- várias linhas de histórico de bate-papo. Quando o usuário responde por {@link
- android.support.v4.app.RemoteInput}, você pode atualizar o histórico de respostas
- usando o método {@code setRemoteInputHistory()}.
-</p>
-
-<p>
-  A notificação precisará ser atualizada ou cancelada depois que o aplicativo tiver
- recebido a entrada remota. Quando o usuário responde a uma atualização remota
- usando uma Resposta direta,
- não cancele a notificação. Em vez disso, atualize a notificação para exibir a resposta do usuário.
-Para notificações que usam {@code MessagingStyle}, adicione
- a resposta como última mensagem. Ao usar outros modelos, você pode
-anexar a resposta do usuário ao histórico da entrada remota.
-</p>
-
-<h2 id="bundle">Notificações empacotadas</h2>
-
-<p>O Android N oferece aos desenvolvedores uma nova forma de representar
- uma fila de notificações: <i>notificações empacotadas</i>. Essa forma é semelhante ao recurso
-  <a href="{@docRoot}training/wearables/notifications/stacks.html">Pilhas
- de Notificações</a> no Android Wear. Por exemplo, se o aplicativo criar notificações
- para mensagens recebidas, quando mais de uma mensagem for recebida, empacote as
- notificações como um único grupo. Você pode
- usar o método existente {@link android.support.v4.app.NotificationCompat.Builder#setGroup
-Builder.setGroup()} para empacotar notificações semelhantes.</p>
-
-<p>
-  Um grupo de notificações impõe uma hierarquia nas notificações que o compõe.
-  Na parte superior dessa hierarquia, está a notificação pai, que exibe informações
- resumidas para o grupo. O usuário pode expandir
- progressivamente o grupo de notificações e o sistema mostra mais informações à medida que o
- usuário aumenta o detalhamento. Quando o usuário expande o pacote, o sistema revela
- mais informações para todas as notificações filhas. Quando o usuário
- expande uma das notificações, o sistema revela todo o seu conteúdo.
-</p>
-
-<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
-          {@docRoot}preview/images/bundles_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>Figura 3.</strong> O usuário pode expandir progressivamente o grupo
- de notificações.
-</p>
-
-<p class="note">
-  <strong>Observação:</strong> Se o mesmo aplicativo enviar quatro ou mais notificações
- e não especificar um agrupamento, o
- sistema as agrupará automaticamente.
-</p>
-
-<p>Para saber como adicionar notificações a um grupo, consulte
-<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">Adicionar
-cada notificação a um grupo</a>.</p>
-
-
-<h3 id="best-practices">Práticas recomendadas para notificações empacotadas</h3>
-<p>Esta seção oferece diretrizes sobre quando usar grupos de notificações em vez
- de notificações {@link android.app.Notification.InboxStyle InboxStyle}
- que foram disponibilizadas em versões anteriores da
- plataforma Android.</p>
-
-<h3>Quando usar notificações empacotadas</h3>
-
-<p>Você deve usar grupos de notificações apenas quando todas as condições a seguir forem
- verdadeiras para o seu caso de uso:</p>
-
-<ul>
-  <li>As notificações filhas são notificações completas e podem ser exibidas
- individualmente sem necessidade de um resumo do grupo.</li>
-  <li>A exibição individual de notificações filhas pode ser vantajosa. Por
- exemplo:
-  </li>
-  <ul>
-    <li>Elas são acionáveis, sem ações específicas para cada filha.</li>
-    <li>Há mais informações na filha que as que o usuário quer ler.</li>
-  </ul>
-</ul>
-
-<p>Os exemplos de bons casos de uso para grupos de notificações incluem: um aplicativo de mensagens
- exibindo uma lista de mensagens recebidas ou um aplicativo de e-mail exibindo uma lista de
- e-mails recebidos.</p>
-
-<p>
-Os exemplos de casos em que uma única notificação é preferível
- incluem mensagens individuais de uma única pessoa ou uma representação em lista
- de itens de texto com uma única linha. Você pode usar
-({@link android.app.Notification.InboxStyle InboxStyle} ou
- {@link android.app.Notification.BigTextStyle BigTextStyle}) para
- isso.
-</p>
-
-<h3 id ="post">Exibição de notificações empacotadas</h3>
-
-<p>
-  O aplicativo deve sempre publicar um resumo do grupo, mesmo se o grupo tiver apenas uma
- única filha. O sistema suprimirá o resumo e exibirá diretamente a
- notificação filha se ela contiver apenas uma única notificação. Isso garante
- que o sistema possa oferecer uma experiência consistente quando o usuário deslizar por
- filhas de um grupo.
-</p>
-
-<p class="note">
-  <strong>Observação:</strong> esta versão do Android N ainda não
- elimina o resumo de grupos de notificações contendo uma única filha. Essa
- funcionalidade será adicionada em uma versão posterior do Android N.
-</p>
-
-<h3>Observação de notificações</h3>
-
-<p>Embora o sistema normalmente exiba notificações filhas como grupo, você pode
- configurá-las para exibição temporária como
- <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">
- notificações heads-up</a>. Esse recurso é particularmente útil porque permite
- acesso imediato à filha mais recente e a suas ações associadas.
-</p>
-
-
-<h3>Compatibilidade com versões anteriores</h3>
-
-<p>
-  Os grupos de notificações e as entradas remotas fazem parte da API {@link
-  android.app.Notification} desde o Android 5.0 (nível da API 21) para oferecer suporte a
- dispositivos Android Wear. Se você já criou notificações com essas APIs,
- a única ação necessária é verificar se o comportamento do aplicativo corresponde
- às diretrizes descritas acima e considerar a implementação de {@code
-  setRemoteInputHistory()}.
-</p>
-
-<p>
-  Para compatibilidade com versões anteriores, as mesmas APIs estão disponíveis com
- a classe {@link android.support.v4.app.NotificationCompat} da biblioteca de suporte,
- permitindo criar notificações que funcionem em versões anteriores do
- Android. Em celulares e tablets, os usuários somente visualizam as notificações resumidas.
- Portanto, um aplicativo deve ter uma notificação no estilo de caixa de entrada ou equivalente,
- representativa de todo o conteúdo de informações do grupo. Como os dispositivos Android
- Wear permitem que os usuários vejam todas as notificações filhas, mesmo em níveis
- de plataforma antigos, você deve criar notificações filhas independentemente do nível
- da API.
-</p>
-
-<h2 id="custom"> Visualizações personalizadas</h2>
-<p>Começando com o Android N, é possível personalizar visualizações de notificação e
- continuar obtendo decorações de sistema, como cabeçalhos de notificação, ações e layouts
- expansíveis.</p>
-
-<p>Para ativar esses recursos, o Android N adiciona as seguintes APIs para aplicar estilo à
- visualização personalizada:</p>
-
-<dl>
-<dt>
-{@code DecoratedCustomViewStyle()}</dt>
-<dd> Aplica estilo a notificações que não sejam notificações
- de mídia.</dd>
-<dt>
-{@code DecoratedMediaCustomViewStyle()}</dt>
-<dd> Aplica estilo a notificações de mídia.</dd>
-</dl>
-
-<p>Para usar essa nova API, chame o método {@code setStyle()}, passando o
- estilo de visualização personalizada desejado.</p>
-
-<p>O snippet mostra como construir um objeto de notificação personalizada com o método
-{@code DecoratedCustomViewStyle()}.</p>
-
-<pre>
-Notification notification = new Notification.Builder()
-           .setSmallIcon(R.drawable.ic_stat_player)
-           .setLargeIcon(albumArtBitmap))
-           .setCustomContentView(contentView);
-           .setStyle(new Notification.DecoratedCustomViewStyle())
-           .build();
-
-</pre>
-
-<h2 id="style">Estilo de mensagens</h2>
-<p>
-  O Android N traz uma nova API para personalização do estilo de uma notificação.
-  Usando a classe <code>MessageStyle</code>, você pode alterar vários
-rótulos exibidos na notificação, incluindo o título da conversa,
- mensagens adicionais e a visualização de conteúdo para a notificação.
-</p>
-
-<p>
-  O seguinte snippet de código demonstra como personalizar o estilo de uma
- notificação usando a classe <code>MessageStyle</code>.
-</p>
-
-<pre>
-  Notification notification = new Notification.Builder()
-             .setStyle(new Notification.MessagingStyle("Me")
-                 .setConversationTitle("Team lunch")
-                 .addMessage("Hi", timestamp1, null) // Pass in null for user.
-                 .addMessage("What's up?", timestamp2, "Coworker")
-                 .addMessage("Not much", timestamp3, null)
-                 .addMessage("How about lunch?", timestamp4, "Coworker"));
-</pre>
diff --git a/docs/html-intl/intl/ru/about/versions/nougat/index.jd b/docs/html-intl/intl/ru/about/versions/nougat/index.jd
index 9bb56ba..1103166 100644
--- a/docs/html-intl/intl/ru/about/versions/nougat/index.jd
+++ b/docs/html-intl/intl/ru/about/versions/nougat/index.jd
@@ -1,6 +1,6 @@
-page.title=Android N Developer Preview
-page.tags="preview","developer"
-meta.tags="предварительная версия", "android"
+page.title=Android 7.0 Nougat
+page.tags="androidn","versions"
+meta.tags="android n", "nougat", "android 7.0"
 fullpage=true
 forcelocalnav=true
 header.hide=1
@@ -17,62 +17,56 @@
   })
 </script>
 
-<section class="dac-expand dac-hero dac-light" style="background-color:#B2DFDB">
+<section class="dac-expand dac-hero dac-light">
   <div class="wrap" style="max-width:1100px;margin-top:0">
+  <a href="{@docRoot}about/versions/nougat/android-7.0.html">
     <div class="cols dac-hero-content" style="padding-bottom:1em;">
 
-      <div class="col-7of16 col-push-9of16" style="padding-left:2em">
-        <h1 class="dac-hero-title">Android N Developer Preview</h1>
+      <div class="col-7of16 col-push-8of16" style="padding-left:2em">
+        <h1 class="dac-hero-title">Android 7.0 Nougat</h1>
         <p class="dac-hero-description">
-          Подготовьтесь к выходу Android N!
+          Подготовьтесь к выходу Android Nougat!
 <strong>Протестируйте свои приложения</strong> на Nexus и других устройствах. Поддержите нововведения
 системы, позволяющие <strong>снизить потребление энергии и памяти</strong>.
 Добавьте в свои приложения <strong>многооконный режим</strong>,
 <strong>возможность прямой отправки ответов из уведомлений</strong> и другие функции.
         </p>
 
-        <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+        <a class="dac-hero-cta" href="{@docRoot}about/versions/nougat/android-7.0.html">
           <span class="dac-sprite dac-auto-chevron"></span>
           Начало работы
-        </a><!--<br>
-        <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
-          Update to Android N (final SDK)
-        </a><br>-->
+        </a>
       </div>
-      <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
-        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png" srcset="{@docRoot}images/home/n-preview-hero.png 1x,
-             {@docRoot}images/home/n-preview-hero_2x.png 2x">
+      <div class="col-7of16 col-pull-6of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
+        <a  href="{@docRoot}about/versions/nougat/android-7.0.html">
+        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png"
+             srcset="{@docRoot}images/home/n-preview-hero.png 1x,
+             {@docRoot}images/home/n-preview-hero_2x.png 2x" />
+           </a>
       </div>
-    </div>
+    </div></a>
     <div class="dac-section dac-small">
       <div class="resource-widget resource-flow-layout col-16"
-           data-query="collection:preview/landing/resources"
+           data-query="collection:nougat/landing/resources"
            data-cardSizes="6x2"
-           data-maxResults="6"></div>
-    </div>
+           data-maxResults="3"></div>
+         </div>
   </div>
 </section>
 
 <div id="useUpdatedTemplates" style="display:none" class="dac-section dac-slim dac-gray dac-expand">
   <div class="wrap dac-offset-parent">
-    <a class="dac-fab dac-scroll-button" data-scroll-button="" href="#build-apps">
+    <a class="dac-fab dac-scroll-button" data-scroll-button href="#latest">
       <i class="dac-sprite dac-arrow-down-gray"></i>
     </a>
     <ul class="dac-actions">
       <li class="dac-action">
-        <a class="dac-action-link" href="https://developer.android.com/preview/bug">
+        <a class="dac-action-link" href="https://source.android.com/source/report-bugs.html">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
           Сообщить о проблеме
         </a>
       </li>
       <li class="dac-action">
-        <a class="dac-action-link" href="{@docRoot}preview/support.html">
-          <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
-          См. примечания к выпуску
-        </a>
-      </li>
-      <li class="dac-action">
         <a class="dac-action-link" href="{@docRoot}preview/dev-community">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
           Вступить в сообщество разработчиков
@@ -102,19 +96,45 @@
   </div><!-- end .wrap -->
 </div>
 
-<section class="dac-section dac-light"><div class="wrap">
-  <h1 class="dac-section-title">Ресурсы</h1>
+<section class="dac-section dac-light dac-small" id="latest"><div class="wrap">
+  <h2 class="norule">Latest</h2>
+  <div class="resource-widget resource-flow-layout col-16"
+    data-query="type:blog+tag:androidn+tag:featured, type:youtube+tag:androidn+tag:featured"
+    data-sortOrder="-timestamp"
+    data-cardSizes="6x6"
+    data-items-per-page="6"
+    data-maxResults="15"
+    data-initial-results="3"></div>
+</div></section>
+
+<section class="dac-section dac-gray" id="videos"><div class="wrap">
+  <h1 class="dac-section-title">Videos</h1>
   <div class="dac-section-subtitle">
-    Важная информация, которая поможет вам подготовить ваши приложения для работы в Android N.
+    New Android capabilities and the right way to use them in your apps.
   </div>
 
   <div class="resource-widget resource-flow-layout col-16"
-       data-query="collection:preview/landing/more"
+    data-query="collection:nougat/landing/videos/first,type:youtube+tag:androidn"
+    data-sortOrder="-timestamp"
+    data-cardSizes="6x6"
+    data-items-per-page="6"
+    data-maxResults="15"
+    data-initial-results="3">
+  </div>
+</div></section>
+
+<section class="dac-section dac-light" id="resources"><div class="wrap">
+  <h1 class="dac-section-title">Ресурсы</h1>
+  <div class="dac-section-subtitle">
+    Важная информация, которая поможет вам подготовить ваши приложения для работы в Android Nougat.
+  </div>
+
+  <div class="resource-widget resource-flow-layout col-16"
+       data-query="collection:nougat/landing/more"
        data-cardSizes="6x6"
        data-items-per-page="6"
        data-maxResults="15"
        data-initial-results="6"></div>
 
   </div>
-</section>
-
+</section>
\ No newline at end of file
diff --git a/docs/html-intl/intl/ru/index.jd b/docs/html-intl/intl/ru/index.jd
index e917a8d..b3f3cc2 100644
--- a/docs/html-intl/intl/ru/index.jd
+++ b/docs/html-intl/intl/ru/index.jd
@@ -15,33 +15,30 @@
   })
 </script>
 
-<section class="dac-expand dac-hero dac-invert" style="background-color:#455A64">
-  <div class="wrap" style="max-width:1100px;margin-top:0">
-    <div class="col-7of16 col-push-9of16" style="padding-left:2em;">
-      <a href="{@docRoot}preview/index.html">
-        <h1 class="dac-hero-title">Android N Developer Preview</h1>
-        <p class="dac-hero-description">
-          Get ready for the next version of Android!
-          <strong>Test your apps</strong> on Nexus and other devices. Support new system
-          behaviors to <strong>save power and memory</strong>.
+<section class="dac-expand dac-hero" style="background-color:#b2dfdb;">
+  <div class="wrap" style="max-width:1000px;margin-top:0">
+    <div class="col-7of16 col-push-8of16">
+      <a href="{@docRoot}about/versions/nougat/index.html">
+        <h1 class="dac-hero-title" style="color:#004d40">Android 7.0 Nougat!</h1>
+        <p class="dac-hero-description" style="color:#004d40">
+          <strong>Android 7.0 Nougat is here!</strong>
+          Get your apps ready for the latest version of Android, with new system
+          behaviors to <strong>save battery and memory</strong>.
           Extend your apps with <strong>multi-window UI</strong>,
           <strong>direct reply notifications</strong> and more.
         </p>
-        <a class="dac-hero-cta" href="/preview/index.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
+        <a class="dac-hero-cta" href="{@docRoot}about/versions/nougat/index.html" style="color:#004d40">
+          <span class="dac-sprite dac-auto-chevron" style="background-color:#b2dfdb"></span>
           Learn more
-        </a><!--<br>
-        <a class="dac-hero-cta" href="/preview/support.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
-          Update to Developer Preview (final SDK)
-        </a><br>-->
+        </a>
+        </a>
       </a>
     </div>
-    <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:0em;padding-right:1.5em;">
-      <a href="{@docRoot}preview/index.html">
-        <img style="" class="dac-hero-image" src="/images/home/n-preview-hero.png"
-             srcset="/images/home/n-preview-hero.png 1x,
-             /images/home/n-preview-hero_2x.png 2x">
+    <div class="col-6of16 col-pull-6of16 dac-hero-figure" style="padding-left:1em;padding-top:1em;">
+      <a href="{@docRoot}about/versions/nougat/index.html">
+        <img class="dac-hero-image" src="{@docRoot}images/home/nougat_bg.jpg"
+             srcset="{@docRoot}images/home/nougat_bg.jpg 1x,
+             {@docRoot}images/home/nougat_bg_2x.jpg 2x">
         </a>
     </div>
   </div>
diff --git a/docs/html-intl/intl/ru/preview/download_mp2.jd b/docs/html-intl/intl/ru/preview/download_mp2.jd
deleted file mode 100644
index 13872d1..0000000
--- a/docs/html-intl/intl/ru/preview/download_mp2.jd
+++ /dev/null
@@ -1,359 +0,0 @@
-page.title=Загрузки
-page.image=images/cards/card-download_16-9_2x.png
-
-@jd:body
-
-<div style="position:relative; min-height:600px">
-
-  <div class="wrap" id="tos" style="position:absolute;display:none;width:inherit;">
-
-    <p class="sdk-terms-intro">Прежде чем приступить к загрузке и установке компонентов пакета SDK Android Preview,
-примите следующие положения и условия.</p>
-
-    <h2 class="norule">Положения и условия</h2>
-
-    <div class="sdk-terms" onfocus="this.blur()" style="width:678px">
-Это лицензионное соглашение для пакета SDK Android Preview (далее «Лицензионное соглашение»).
-
-1. Введение
-
-1.1. Лицензия на пакет SDK Android Preview (далее по тексту настоящего Лицензионного соглашения – «Preview», который включает системные файлы Android, пакеты API-интерфейсов и файлы библиотеки Preview, если такие доступны) передается в соответствии с положениями настоящего Лицензионного соглашения. Настоящее Лицензионное соглашение является юридически обязывающим договором между компанией Google и любым лицом, использующим Preview.
-
-1.2. В настоящем Лицензионном соглашении термин «Android» означает набор программного обеспечения Android для устройств, предлагаемый к использованию в рамках проекта Android Open Source Project, который доступен на веб-сайте http://source.android.com/ (сведения, размещенные на этом сайте, могут периодически обновляться).
-
-1.3. Под термином «Google» понимается корпорация Google Inc., главный офис которой находится по адресу 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States (США).
-
-2. Принятие лицензионного соглашения
-
-2.1. Использование Preview возможно только после принятия условий настоящего Лицензионного соглашения. Запрещается использовать Preview, если вы не согласны с указанными в настоящем документе условиями и положениями.
-
-2.2. Нажатие кнопки принятия условий и/или использование Preview означает, что вы согласны с положениями настоящего Лицензионного соглашения.
-
-2.3. Вы не вправе использовать Preview и принимать условия данного Лицензионного соглашения, если по законам США или иных стран, включая страну вашего проживания или использования Preview, запрещается передавать Preview в ваш адрес.
-
-2.4. Если вы используете Preview в рамках своей компании или организации, вы соглашаетесь взять на себя обязательства по соблюдению настоящего Лицензионного соглашения от имени своего работодателя или другого юридического лица, и вы тем самым подтверждаете и гарантируете, что обладаете полными юридическими полномочиями связать вашего работодателя или иное подобное юридическое лицо обязательствами по настоящему Лицензионному соглашению. Если вы не обладаете необходимыми полномочиями, вы не вправе принимать указанные в настоящем документе условия и положения или использовать Preview от имени вашего работодателя или другого юридического лица.
-
-3. Лицензия на Preview от Google
-
-3.1. В соответствии с условиями настоящего Лицензионного соглашения Google предоставляет вам ограниченную, бесплатную и неэксклюзивную лицензию без права передачи и подлежащую отмене, на использование Preview, лично или в рамках своей компании или организации, исключительно в целях разработки приложений для платформы Android.
-
-3.2. Вы соглашаетесь с тем, что Google или третьим сторонам принадлежат все юридические и имущественные права, а также правовой интерес в отношении Preview, в том числе любые права на объекты интеллектуальной собственности, которые имеются в Preview. Термин «Права на интеллектуальную собственность» означает все возможные права в рамках патентного права, авторского права, закона о коммерческой тайне, закона о товарных знаках, а также иные возможные имущественные права. Google оставляет за собой все права, не предоставленные вам в явном виде.
-
-3.3. Вам запрещается использовать Preview в любых целях, которые однозначно не определены в настоящем Лицензионном соглашении. За исключением случаев, предусмотренных применимыми сторонними лицензиями, вам запрещается: (a) копировать (кроме случаев резервного копирования), изменять, адаптировать, повторно распространять, декомпилировать, осуществлять инженерный анализ, деассемблировать или создавать производные элементы Preview или иной его части; а также (b) загружать любую часть Preview в мобильные телефоны или иные устройства, помимо персонального компьютера, объединять любые части Preview с другим программным обеспечением, распространять любое программное обеспечение или устройства, содержащие части Preview.
-
-3.4. Вы соглашаетесь с тем, что не будете предпринимать никаких действий, которые прямо или косвенно могут привести к фрагментированию платформы Android, включая помимо прочего распространение набора средств разработки программного обеспечения, полученного из Preview, участие в создании таких средств и содействие их продвижению в любой форме.
-
-3.5. Использование, воспроизведение и распространение компонентов Preview, на которые распространяется лицензия на программное обеспечение с открытым исходным кодом, регулируются исключительно положениями и условиями такой лицензии на программное обеспечение с открытым исходным кодом, а не настоящим Лицензионным соглашением. Вы соглашаетесь обеспечивать хорошую репутацию получателя лицензии в отношении таких лицензии на программное обеспечение с открытым исходным кодом в рамках всех предоставленных ему прав, а также не допускать каких-либо действий, которые могут привести к аннулированию, приостановлению или нарушению таких прав
-
-3.6. Вы соглашаетесь с тем, что форма и содержание Preview , предоставляемого Google, могут быть изменены без предварительного уведомления, а также с тем, что будущие версии Preview могут оказаться несовместимыми с приложениями, разработанными в предыдущих версиях Preview. Вы соглашаетесь с тем, что Google вправе по собственному усмотрению и без предварительного уведомления прекратить (временно или навсегда) предоставление Preview (или любых функций в составе Preview) вам или пользователям.
-
-3.7. Ни одна из частей настоящего Лицензионного соглашения не предусматривает предоставления вам права использовать любые торговые наименования, товарные знаки, знаки обслуживания, логотипы, имена доменов или иные отличительные фирменные знаки, принадлежащие Google.
-
-3.8. Вы соглашаетесь с тем, что обязуетесь не удалять, не скрывать или не изменять любые уведомления об имущественных правах (включая уведомления об авторских правах и товарных знаках), которые могут сопровождать Preview или содержаться в нем.
-
-4. Использование Preview
-
-4.1. Компания Google выражает согласие с тем, что ни по какому положению настоящего Лицензионного соглашения не получает от вас (или ваших лицензиаров) каких-либо юридических и имущественных прав, а также правового интереса в отношении любых программных приложений, разработанных вами с помощью Preview, включая любые права на объекты интеллектуальной собственности, которые имеются в таких приложениях.
-
-4.2. Вы соглашаетесь использовать Preview и создавать приложения исключительно в целях, предусмотренных (a) настоящим Лицензионным соглашением и (b) любым применимым законом, нормативным актом или общепринятыми правилами или рекомендациями в соответствующей юрисдикции (включая любые законы, касающиеся экспорта данных или программного обеспечения из США или иных соответствующих стран, а также импорта в них).
-
-4.3. Вы соглашаетесь с тем, что при использовании Preview для разработки приложений вы обязуетесь обеспечивать конфиденциальность и защищать юридические права пользователей. В случае, если пользователи предоставляют вам свои имена, пароли или иные данные для входа либо свои персональные данные, вы обязуетесь уведомить пользователей о том, что такая информация будет присутствовать в вашем приложении, и вы также обязуетесь предоставить пользователям юридически соответствующие уведомление о конфиденциальности и средства правовой защиты. Если в вашем приложении хранится личная или конфиденциальная информация, предоставленная пользователями, вы обязуетесь обеспечить ее надлежащую защиту. Если пользователь предоставляет вам сведения о своей учетной записи Google, то ваше приложение может использовать такую информацию для доступа к учетной записи Google пользователя только при условии, что пользователь предоставил вам разрешение на это, и только в тех целях, которые обозначил пользователь.
-
-4.4. Вы соглашаетесь с тем, что обязуетесь не использовать Preview для любого рода деятельности, в том числе для разработки или распространения приложений, в целях нарушения работы и повреждения серверов, сетей или иной собственности или служб Google или любой третьей стороны.
-
-4.5. Вы соглашаетесь с тем, что несете единоличную ответственность (и признаете, что компания Google не несет ответственности ни перед вами, ни перед любой третьей стороной) за любые данные, содержимое или ресурсы, которые вы создаете, передаете или демонстрируете посредством Android и/или приложений для Android, а также за любые последствия ваших действий, связанных с этим (в том числе за любые убытки и любой ущерб, которые могут быть причинены Google).
-
-4.6. Вы соглашаетесь с тем, что несете единоличную ответственность (и признаете, что компания Google не несет ответственности ни перед вами, ни перед любой третьей стороной) за любое несоблюдение обязательств по настоящему Лицензионному соглашению, обязательств по любому применимому договору с третьей стороной или предусмотренных Условиями и положениями, за нарушение любых применимых законов или нормативных актов, а также за любые последствия ваших действий, связанных с таким нарушением (в том числе за любые убытки и любой ущерб, которые могут быть причинены Google).
-
-4.7 Preview находится на стадии разработки, поэтому ваши отзывы и результаты тестирования являются важной частью процесса разработки. Используя Preview, вы признаете, что реализация некоторых функций по-прежнему находится на этапе разработки и вам не следует рассчитывать на полную функциональность стабильной версии. Вы соглашаетесь не распространять или предоставлять любые приложения, использующие Preview, поскольку поддержка Preview будет прекращена после выпуска официальной версии пакета SDK Android.
-
-5. Ваши учетные данные разработчика
-
-5.1. Вы соглашаетесь с тем, что несете ответственность за обеспечение конфиденциальности любых учетных данных разработчика, которые компания Google может вам предоставить или которые вы можете самостоятельно выбрать, а также с тем, что вы несете единоличную ответственность за все приложения, разработанные с использованием ваших учетных данных разработчика.
-
-6. Конфиденциальность и личная информация
-
-6.1. В целях постоянного совершенствования и улучшения Preview компания Google вправе собирать определенные статистические данные об использовании программного обеспечения, включая уникальный идентификатор, связанный IP-адрес, номер версии программного обеспечения, а также сведения об используемых в Preview инструментах и/или службах и способах их применения. Перед тем как любые из таких данных будут отправлены в Google, в Preview отобразится соответствующее уведомление с просьбой дать свое согласие. В случае вашего отказа предоставить такие сведения соответствующие данные собираться не будут.
-
-6.2. Собранные данные изучаются в обобщенном виде с целью улучшения Preview и хранятся в соответствии с Политикой конфиденциальности Google, которая опубликована на веб-сайте по адресу http://www.google.com/policies/privacy/.
-
-7. Сторонние приложения
-
-7.1. Если вы используете Preview для запуска приложений, разработанных третьими сторонами или получающих доступ к данным, содержимому или ресурсам, предоставляемым третьей стороной, вы соглашаетесь с тем, что Google не несет ответственности за такие приложения, данные, содержимое или ресурсы. Вы осознаете, что единоличную ответственность за все данные, содержимое или ресурсы, доступ к которым вы можете получить посредством таких приложений третьих сторон, несет лицо, предоставившее их, а также то, что Google не несет ответственности за любые убытки или любой ущерб, которые могут возникнуть в результате использования вами любых таких сторонних приложений, данных, содержимого или ресурсов и в результате обращения к ним.
-
-7.2. Вы должны быть осведомлены о том, что данные, содержимое и ресурсы, предоставляемые вам посредством таких сторонних приложений, могут быть защищены правами на объекты интеллектуальной собственности, принадлежащие предоставляющим их лицам (или иным лицам либо компаниям от их имени). Вам запрещается изменять, сдавать в аренду, передавать, продавать, распространять такие данные, содержимое или ресурсы (полностью или частично), а также создавать на их основе производные элементы, если у вас нет на это разрешения от соответствующих владельцев.
-
-7.3. Вы осознаете, что использование вами таких сторонних приложений, данных или ресурсов может регулироваться отдельными условиями, заключенными между вами и соответствующей третьей стороной.
-
-8. Использование API-интерфейсов Google
-
-8.1. API-интерфейсы для получения данных Google.
-
-8.1.1. В случае использования вами любых API для получения данных из Google вы осознаете, что такие данные могут быть защищены правами на объекты интеллектуальной собственности, принадлежащие Google или предоставляющим их сторонам (или иным лицам либо компаниям от их имени). Использование вами подобных API может регулироваться дополнительными Условиями использования. Вам запрещается изменять, сдавать в аренду, передавать, продавать, распространять такие данные (полностью или частично), а также создавать на их основе производные элементы, если это не разрешено соответствующими Условиями использования.
-
-8.1.2. Если вы используете какие-либо API-интерфейсы для получения данных пользователя из Google, вы осознаете и соглашаетесь с тем, что вы обязуетесь получать такие данные исключительно с прямого согласия пользователя и только в тех целях, которые обозначил пользователь.
-
-9. Прекращение действия Лицензионного соглашения
-
-9.1 Настоящее Лицензионное соглашение остается в силе до тех пор, пока его действие не будет прекращено вами или Google, как указано ниже.
-
-9.2. Если вы желаете прекратить действие настоящего Лицензионного соглашения, вы вправе сделать это, прекратив использование Preview и любых соответствующих учетных данных разработчика.
-
-9.3. Google вправе в любое время прекратить действие настоящего Лицензионного соглашения, отправив предварительное уведомление или без него.
-
-9.4 Действие настоящего Лицензионного соглашения автоматически прекращается без предварительного уведомления или выполнения иных действий сразу после любого из следующих событий:
-(A) компания Google прекращает предоставление Preview или определенных частей Preview пользователям на территории страны, в которой вы проживаете или используете услуги компании;
-(B) компания Google выпускает окончательную версию SDK Android.
-
-9.5 В случае прекращения действия настоящего Лицензионного соглашения прекращается действие лицензии, предоставленной в рамках Лицензионного соглашения, и вам следует незамедлительно прекратить любое использование Preview, тогда как положения, изложенные в разделах 10, 11, 12 и 14 продолжают действовать бессрочно.
-
-10. ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ
-
-10.1. ВЫ ЧЕТКО ОСОЗНАЕТЕ И БЕЗОГОВОРОЧНО СОГЛАШАЕТЕСЬ С ТЕМ, ЧТО ВЫ ИСПОЛЬЗУЕТЕ PREVIEW ИСКЛЮЧИТЕЛЬНО НА СВОЙ СТРАХ И РИСК И ЧТО PREVIEW ПРЕДОСТАВЛЯЕТСЯ ВАМ НА УСЛОВИЯХ «КАК ЕСТЬ» И «КАК ДОСТУПНО» БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ СО СТОРОНЫ КОМПАНИИ GOOGLE.
-
-10.2 ИСПОЛЬЗОВАНИЕ ВАМИ PREVIEW И ЗАГРУЗКА ЛЮБЫХ МАТЕРИАЛОВ И ИХ ПОЛУЧЕНИЕ ИНЫМ СПОСОБОМ С ПОМОЩЬЮ PREVIEW ВЫПОЛНЯЕТСЯ ПО ВАШЕМУ СОБСТВЕННОМУ УСМОТРЕНИЮ НА СВОЙ СТРАХ И РИСК. ВСЯ ОТВЕТСТВЕННОСТЬ ЗА ЛЮБОЙ УЩЕРБ, ПРИЧИНЕННЫЙ ВАШЕЙ ВЫЧИСЛИТЕЛЬНОЙ СИСТЕМЕ ИЛИ ДРУГОМУ ОБОРУДОВАНИЮ, А ТАКЖЕ ЗА ПОТЕРЮ ДАННЫХ, ВЫЗВАННУЮ ПОДОБНЫМ ИСПОЛЬЗОВАНИЕМ, ВОЗЛАГАЕТСЯ НА ВАС. НЕ ОГРАНИЧИВАЯ ВЫШЕСКАЗАННОЕ, ВЫ ПОНИМАЕТЕ, ЧТО PREVIEW НЕ ЯВЛЯЕТСЯ СТАБИЛЬНЫМ ВЫПУСКОМ И МОЖЕТ СОДЕРЖАТЬ ОШИБКИ, ДЕФЕКТЫ И УЯЗВИМОСТИ В СИСТЕМЕ БЕЗОПАСНОСТИ, КОТОРЫЕ МОГУТ ПРИВЕСТИ К СЕРЬЕЗНЫМ ПОВРЕЖДЕНИЯМ, ВКЛЮЧАЯ ПОЛНУЮ И БЕЗВОЗВРАТНУЮ ПОТЕРЮ РАБОТОСПОСОБНОСТИ ВАШЕГО КОМПЬЮТЕРА ИЛИ ИНОГО УСТРОЙСТВА.
-
-10.3. КОМПАНИЯ GOOGLE БЕЗОГОВОРОЧНО ОТКАЗЫВАЕТСЯ ОТ ЯВНЫХ И НЕЯВНЫХ ГАРАНТИЙ И УСЛОВИЙ ЛЮБОГО РОДА, ВКЛЮЧАЯ ПОМИМО ПРОЧЕГО НЕЯВНЫЕ ГАРАНТИИ И УСЛОВИЯ ТОВАРНОГО СОСТОЯНИЯ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ СОБСТВЕННОСТИ.
-
-11. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ
-
-11.1. ВЫ ЧЕТКО ОСОЗНАЕТЕ И БЕЗОГОВОРОЧНО СОГЛАШАЕТЕСЬ С ТЕМ, ЧТО КОМПАНИЯ GOOGLE, ЕЕ ДОЧЕРНИЕ И АФФИЛИРОВАННЫЕ КОМПАНИИ И ЛИЦЕНЗИАРЫ НЕ НЕСУТ ПЕРЕД ВАМИ ОТВЕТСТВЕННОСТИ, НЕЗАВИСИМО ОТ ЕЕ ПРИЧИНЫ И ВИДА, ЗА КАКИЕ-ЛИБО ПРЯМЫЕ, КОСВЕННЫЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ, ОПОСРЕДОВАННЫЕ И ШТРАФНЫЕ УБЫТКИ, ПОНЕСЕННЫЕ ВАМИ, ВКЛЮЧАЯ ПОТЕРЮ ДАННЫХ, ВНЕ ЗАВИСИМОСТИ ОТ ТОГО, БЫЛА ЛИ КОМПАНИЯ GOOGLE ИЛИ ЕЕ ПРЕДСТАВИТЕЛИ ИЗВЕЩЕНЫ О ВОЗМОЖНОСТИ ТАКОГО УЩЕРБА.
-
-12 Освобождение от ответственности
-
-12.1. В максимально допустимой законом степени вы соглашаетесь защищать, освобождать от ответственности и возможных претензий компанию Google, ее аффилированные компании и их соответствующих руководителей, служащих, сотрудников и агентов от всех возможных правовых требований, действий, судебных исков или разбирательств, а также от всех возможных убытков, обязательств, ущерба, издержек и расходов (включая обоснованные вознаграждения для адвокатов), возникающих в связи (a) с использованием вами Preview, (b) любыми приложениями, разрабатываемыми вами с помощью Preview и нарушающими любые права на объекты интеллектуальной собственности любого лица, а также порочащие любое лицо либо нарушающие права таких лиц на публичность и конфиденциальность, а также (c) в связи с любым несоблюдением вами положений настоящего Лицензионного соглашения.
-
-13. Изменения в Лицензионном соглашении
-
-13.1. Компания Google вправе вносить изменения в настоящее Лицензионное соглашение по мере выхода новых версий Preview. При внесении изменений Google создает новую версию Лицензионного соглашения и размещает ее на веб-сайте, на котором размещен Preview.
-
-14. Общие правовые условия
-
-14.1. Настоящее Лицензионное соглашение составляет полный текст юридического соглашения между вами и компанией Google, регулирует использование вами Preview (за исключением услуг, которые Google предоставляет на основании отдельного письменного соглашения) и полностью заменяет собой все предыдущие соглашения между вами и компанией Google в отношении Preview.
-
-14.2. Вы соглашаетесь с тем, что отсутствие каких-либо действий или судебных исков со стороны Google, направленных на соблюдение каких-либо правовых норм или исполнение средств правовой защиты, установленных настоящим Лицензионным соглашением (или которыми Google обладает в соответствии с каким-либо действующим законом), не означает отказ компании Google от своих прав и не препятствует компании Google использовать эти права или средства защиты.
-
-14.3. Если какой-либо судебный орган, уполномоченный рассматривать этот вопрос, признает недействительность какого-либо положения данного Лицензионного соглашения, то соответствующее положение будет исключено из Лицензионного соглашения с сохранением действия всех остальных его положений. Остальные положения Лицензионного соглашения по-прежнему будут действовать, и их соблюдение может обеспечиваться в судебном порядке.
-
-14.4. Вы признаете и соглашаетесь с тем, что все участники группы компаний, среди которых Google является материнской компанией, являются сторонними бенефициарами Лицензионного соглашения и что эти компании имеют право пользоваться привилегиями (или правами), предоставляемыми по настоящему Лицензионному соглашению, и напрямую требовать их соблюдения в судебном порядке. Все остальные физические и юридические лица не являются сторонними бенефициарами Лицензионного соглашения.
-
-14.5. ОГРАНИЧЕНИЯ НА ЭКСПОРТ. ИСПОЛЬЗОВАНИЕ PREVIEW РЕГУЛИРУЕТСЯ ЗАКОНАМИ И НОРМАТИВНЫМИ АКТАМИ США, КАСАЮЩИМИСЯ ЭКСПОРТА. ВЫ ОБЯЗУЕТЕСЬ СОБЛЮДАТЬ ВСЕ НАЦИОНАЛЬНЫЕ И МЕЖДУНАРОДНЫЕ ЗАКОНЫ ОБ ЭКСПОРТЕ, ПРИМЕНИМЫЕ К PREVIEW. ДАННЫЕ ЗАКОНЫ НАЛАГАЮТ ОГРАНИЧЕНИЯ НА РЕГИОНЫ, КРУГ ЛИЦ И СПОСОБ КОНЕЧНОГО ИСПОЛЬЗОВАНИЯ.
-
-14.6. Вы не вправе переуступать либо передавать права, предоставляемые по настоящему Лицензионному соглашению, без предварительного письменного согласия Google; любые попытки переуступки без такого согласия считаются недействительными. Вы обязуетесь не делегировать свои полномочия или обязательства по настоящему Лицензионному соглашению без предварительного письменного согласия Google.
-
-14.7. Лицензионное соглашение, а также взаимоотношения между вами и компанией Google в рамках настоящего Лицензионного соглашения регулируются законодательством штата Калифорния за исключением его норм коллизионного права. Вы и компания Google признаете, что урегулирование любых правовых вопросов, связанных с данным Лицензионным соглашением, относится исключительно к юрисдикции судов округа Санта-Клара, штат Калифорния. Несмотря на это, вы соглашаетесь с тем, что компания Google по-прежнему имеет право обращаться за наложением судебного запрета (или за получением аналогичного вида неотложной судебной защиты) в суды любой юрисдикции.
-  </div><!-- sdk terms -->
-
-
-
-    <div id="sdk-terms-form">
-      <p>
-        <input id="agree" type="checkbox" name="agree" value="1" onclick="onAgreeChecked()" />
-        <label id="agreeLabel" for="agree">Я прочитал(а) и принимаю изложенные выше положения и условия</label>
-      </p>
-      <p><a href="" class="button disabled" id="downloadForRealz" onclick="return onDownloadForRealz(this);"></a></p>
-    </div>
-
-
-  </div><!-- end TOS -->
-
-
-  <div id="landing">
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>Содержание документа</h2>
-      <ol>
-        <li><a href="#sdk">SDK Preview</a></li>
-        <li><a href="#docs">Документация для разработчиков</a></li>
-        <li><a href="#images">Системные образы оборудования</a></li>
-      </ol>
-     <h2>Legacy downloads</h2>
-        <ol>
-           <li><a href="{@docRoot}preview/download_mp1.html">Developer Preview Archive</a></li>
-        </ol>
-  </div>
-</div>
-
-
-<p>
-  В состав SDK Android M Preview входят инструменты для разработки, системные файлы Android и файлы библиотеки, призванные
-помочь вам в тестировании ваших приложений и новых API-интерфейсов, которые будут реализованы в предстоящем выпуске платформы. В этом документе
-рассказывается, как загрузить необходимые компоненты Preview для тестирования ваших приложений.
-</p>
-
-
-<h2 id="sdk">SDK Preview</h2>
-
-<p>
-  Загрузить SDK Preview можно с помощью <a href="{@docRoot}tools/help/sdk-manager.html">менеджера SDK Android</a>. Дополнительные сведения
-о загрузке и настройке SDK Preview представлены в статье <a href="{@docRoot}preview/setup-sdk.html#downloadSdk">Настройка SDK Preview</a>.
-</p>
-
-
-<h2 id="docs">Документация для разработчиков</h2>
-
-<p>
-  В пакете документации для разработчиков, который доступен для загрузки, представлены подробные сведения об API-интерфейсах, а также о различиях между API-интерфейсами для Preview.
-</p>
-
-<table>
-  <tr>
-    <th scope="col">Description</th>
-    <th scope="col">Download / Checksums</th>
-  </tr>
-  <tr id="docs-dl">
-    <td>Android M Preview 2<br>Developer Docs</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >m-preview-2-developer-docs.zip</a><br>
-      MD5: 1db6fff9c722b0339757e1cdf43663a8<br>
-      SHA-1: 5a4ae88d644e63824d21b0e18f8e3977a7665157
-    </td>
-  </tr>
-</table>
-
-
-<h2 id="images">Системные образы оборудования</h2>
-
-<p>
-  С помощью этих системных образов можно установить предварительную версию платформы на физическое устройство для
-тестирования. Используя один из этих образов для настройки устройства, вы можете установить и протестировать ваше приложение, чтобы узнать, как оно будет работать в будущей версии
-платформы. В процессе установки системного образа
-<em>на устройстве удаляются все данные</em>, поэтому перед установкой образа обязательно сделайте резервное копирование данных.
-
-</p>
-
-<p class="warning">
-  <b>Предупреждение.</b> Перечисленные ниже системные образы Android являются предварительными и могут быть изменены. Использование вами
-этих образов регулируется Лицензионным соглашением на использование пакета SDK Android Preview. Системные образы предварительной версии Android
-не являются стабильными и могут содержать ошибки и дефекты,
-способные повредить ваши компьютеры, устройства и данные. Системные образы предварительной версии Android не проходят такое же тестирование,
-как заводская ОС. Поэтому в результате использования этих образов ваш телефон и установленные на нем приложения
-и службы могут перестать работать.
-</p>
-
-<table>
-  <tr>
-    <th scope="col">Device</th>
-    <th scope="col">Download / Checksums</th>
-  </tr>
-  <tr id="hammerhead">
-    <td>Nexus 5 (GSM/LTE) <br>"hammerhead"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >hammerhead-MPZ79M-preview-b1f4bde4.tgz</a><br>
-      MD5: 2ca9f18bf47a061b339bab52647ceb0d<br>
-      SHA-1: b1f4bde447eccbf8ce5d9b8b8ba954e3eac8e939
-    </td>
-  </tr>
-  <tr id="shamu">
-    <td>Nexus 6 <br>"shamu"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >shamu-MPZ79M-preview-e1024040.tgz</a><br>
-      MD5: 24a2118da340b9afedfbdfc026f6ff81<br>
-      SHA-1: e10240408859d5188c4aae140e1c539130ba614b
-    </td>
-  </tr>
-  <tr id="volantis">
-    <td>Nexus 9 <br>"volantis"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >volantis-MPZ79M-preview-9f305342.tgz</a><br>
-      MD5: 9edabf0a4c61b247f1cbb9dfdc0a899e<br>
-      SHA-1: 9f30534216f10899a6a75495fc7e92408ea333a7
-    </td>
-  </tr>
-
-  <tr id="fugu">
-    <td>Nexus Player <br>"fugu"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >fugu-MPZ79N-preview-fb63af98.tgz</a><br>
-      MD5: e8d081137a20b66df595ee69523314b5<br>
-      SHA-1: fb63af98302dd97be8de9313734d389ccdcce250
-      </td>
-  </tr>
-
-</table>
-
-<h3 id="install-image">Установка образа на устройство</h3>
-
-<p>
-  Чтобы воспользоваться образом устройства для тестирования, установите его на совместимое устройство. Следуйте
-инструкциям по установке системного образа.
-</p>
-
-<ol>
-  <li>Загрузите и распакуйте один из указанных выше пакетов с системным образом.</li>
-  <li>Создайте резервные копии данных, которые хотите сохранить.</li>
-  <li>Следуйте инструкциям, приведенным на сайте
-<a href="https://developers.google.com/android/nexus/images#instructions">developers.google.com/android</a>,
-чтобы прошить ваше устройство с использованием выбранного образа.</li>
-</ol>
-
-<p class="note">
-  <strong>Примечание.</strong> После прошивки устройства для разработки с использованием системного образа с предварительной версией платформы
-она будет автоматически обновлена до следующего выпуска Preview по беспроводной сети.
-</p>
-
-<h3 id="revertDevice">Сброс параметров устройства до заводских настроек</h3>
-
-<p>
-  Чтобы удалить Preview и восстановить заводские настройки устройства, перейдите на сайт
-<a href="http://developers.google.com/android/nexus/images">developers.google.com/android</a>
-и загрузите образ, который требуется использовать для прошивки. Следуйте инструкциям, приведенным на странице,
-чтобы прошить ваше устройство с использованием выбранного образа.
-</p>
-
-  </div><!-- landing -->
-
-</div><!-- relative wrapper -->
-
-
-
-<script>
-  var urlRoot = "http://storage.googleapis.com/androiddevelopers/shareables/preview/";
-  function onDownload(link) {
-
-    $("#downloadForRealz").html("Download " + $(link).text());
-    $("#downloadForRealz").attr('href', urlRoot + $(link).text());
-
-    $("#tos").fadeIn('fast');
-    $("#landing").fadeOut('fast');
-
-    return true;
-  }
-
-
-  function onAgreeChecked() {
-    /* verify that the TOS is agreed */
-    if ($("input#agree").is(":checked")) {
-      /* reveal the download button */
-      $("a#downloadForRealz").removeClass('disabled');
-    } else {
-      $("a#downloadForRealz").addClass('disabled');
-    }
-  }
-
-  function onDownloadForRealz(link) {
-    if ($("input#agree").is(':checked')) {
-    /*
-      $("#tos").fadeOut('fast');
-      $("#landing").fadeIn('fast');
-    */
-
-      ga('send', 'event', 'M Preview', 'System Image', $("#downloadForRealz").html());
-
-    /*
-      location.hash = "";
-    */
-      return true;
-    } else {
-      return false;
-    }
-  }
-
-  $(window).hashchange( function(){
-    if (location.hash == "") {
-      location.reload();
-    }
-  });
-
-</script>
diff --git a/docs/html-intl/intl/ru/preview/features/background-optimization.jd b/docs/html-intl/intl/ru/preview/features/background-optimization.jd
deleted file mode 100644
index b84e785..0000000
--- a/docs/html-intl/intl/ru/preview/features/background-optimization.jd
+++ /dev/null
@@ -1,390 +0,0 @@
-page.title=Оптимизация фоновых процессов
-page.metaDescription=Новые ограничения для неявных широковещательных сообщений.
-page.keywords="android N", "implicit broadcasts", "job scheduler"
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>
-      Содержание документа
-    </h2>
-
-    <ol>
-      <li>
-        <a href="#connectivity-action">Ограничения для CONNECTIVITY_ACTION</a>
-      </li>
-
-      <li>
-        <a href="#sched-jobs">Планирование сетевых заданий для безлимитных
-подключений</a>
-      </li>
-
-      <li>
-        <a href="#monitor-conn">Отслеживание сетевого подключения во время работы
-приложения</a>
-      </li>
-
-      <li>
-        <a href="#media-broadcasts">Ограничения для NEW_PICTURE и
-NEW_VIDEO</a>
-      </li>
-
-      <li>
-        <a href="#new-jobinfo">Новые методы JobInfo</a>
-      </li>
-
-      <li>
-        <a href="#new-jobparam">Новые методы JobParameter</a>
-      </li>
-
-      <li>
-        <a href="#further-optimization">Дальнейшая оптимизация приложения</a>
-      </li>
-    </ol>
-  </div>
-</div>
-
-<p>
-  Фоновые процессы могут потреблять много памяти и заряда аккумулятора. Например,
-неявное широковещательное сообщение может запускать множество фоновых процессов,
-которые его прослушивают, даже если они сами не выполняют полезной работы. Это
-может значительно снизить производительность устройства и быстродействие пользовательского интерфейса.
-</p>
-
-<p>
-  Чтобы устранить подобные проблемы, в N Developer Preview применяются следующие
-ограничения.
-</p>
-
-<ul>
-  <li>Приложения для версии Preview не получают рассылок {@link
-  android.net.ConnectivityManager#CONNECTIVITY_ACTION}, если они
-зарегистрированы для их получения в манифесте. Приложения в активном режиме
-по-прежнему могут прослушивать {@code CONNECTIVITY_CHANGE} в главном потоке,
-зарегистрировав {@link android.content.BroadcastReceiver} с помощью метода {@link
-android.content.Context#registerReceiver Context.registerReceiver()}.
-  </li>
-
-  <li>Приложения не могут отправлять или получать широковещательные сообщения {@link
-  android.hardware.Camera#ACTION_NEW_PICTURE} и {@link
-  android.hardware.Camera#ACTION_NEW_VIDEO}. Эта оптимизация
-затрагивает все приложения, а не только предназначенные для версии Preview.
-  </li>
-</ul>
-
-<p>
-  Платформа Android предоставляет несколько решений, позволяющих отказаться
-от таких неявных рассылок. Например, в {@link android.app.job.JobScheduler}
-и <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-{@code GcmNetworkManager}</a> реализованы надежные механизмы для планирования сетевых
-операций, которые запускаются при выполнении определенных условий, таких как наличие безлимитной
-сети. Теперь вы также можете использовать {@link android.app.job.JobScheduler}
-, чтобы реагировать на изменения поставщиков контента. В объектах {@link android.app.job.JobInfo}
-инкапсулированы параметры, которые {@link android.app.job.JobScheduler}
-использует для планирования заданий. Если условия задания выполнены, система
-выполняет его через {@link android.app.job.JobService} вашего приложения.
-</p>
-
-<p>
-  Здесь мы рассмотрим, как использовать альтернативные методы, такие как
-{@link android.app.job.JobScheduler}, для адаптации приложения к новым
-ограничениям.
-</p>
-
-<h2 id="connectivity-action">
-  Ограничения для CONNECTIVITY_ACTION
-</h2>
-
-<p>
-  Приложения для N Developer Preview не получают широковещательные сообщения {@link
-  android.net.ConnectivityManager#CONNECTIVITY_ACTION}, если они
-зарегистрированы для их получения в своем манифесте. При этом процессы, которые зависят от этого
-широковещательного сообщения, не запускаются. Это может вызвать проблемы для приложений, которым необходимо
-прослушивать изменения сети или выполнять
-массовые сетевые операции, когда устройство подключается к безлимитной сети. Платформа Android уже предоставляет ряд способов обойти
-это ограничение, но выбор нужного метода
-зависит от того, чего вы хотите добиться от приложения.
-</p>
-
-<p class="note">
-  <strong>Примечание.</strong> Объект {@link android.content.BroadcastReceiver}, зарегистрированный с помощью метода
-{@link android.content.Context#registerReceiver Context.registerReceiver()},
-продолжает получать такие рассылки, если приложение работает в активном режиме.
-</p>
-
-<h3 id="sched-jobs">
-  Планирование сетевых заданий для безлимитных подключений
-</h3>
-
-<p>
-  При использовании класса {@link android.app.job.JobInfo.Builder JobInfo.Builder} для создания
-объекта {@link android.app.job.JobInfo} примените метод {@link
-  android.app.job.JobInfo.Builder#setRequiredNetworkType
-  setRequiredNetworkType()} и передайте {@link android.app.job.JobInfo
-  JobInfo.NETWORK_TYPE_UNMETERED} в качестве параметра задания. В следующем примере кода
-служба запускается, если устройство подключается к безлимитной
-сети и заряжается:
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-      (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo job = new JobInfo.Builder(
-    MY_BACKGROUND_JOB,
-    new ComponentName(context, MyJobService.class))
-      .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
-      .setRequiresCharging(true)
-      .build();
-  js.schedule(job);
-}
-</pre>
-
-<p>
-  Если условия задания выполнены, приложение получает обратный вызов для запуска
-метода {@link android.app.job.JobService#onStartJob onStartJob()} в указанном
-классе {@code JobService.class}. Другие примеры реализации {@link
-  android.app.job.JobScheduler} см. в <a href="{@docRoot}samples/JobScheduler/index.html">примере приложения JobScheduler</a>.
-</p>
-
-<p>
-  В приложениях, использующих службы GMSCore и предназначенных для Android 5.0 (уровень API 21)
-или предыдущих версий, можно воспользоваться <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-  {@code GcmNetworkManager}</a> и указать {@code Task.NETWORK_STATE_UNMETERED}.
-</p>
-
-<h3 id="monitor-conn">
-  Отслеживание сетевого подключения во время работы приложения
-</h3>
-
-<p>
-  Приложения в активном режиме по-прежнему могут прослушивать {@code
-  CONNECTIVITY_CHANGE} с помощью зарегистрированного объекта {@link
-  android.content.BroadcastReceiver}. Однако в API-интерфейсе {@link
-  android.net.ConnectivityManager} есть более надежный метод для запроса
-обратного вызова только при выполнении указанных сетевых условий.
-</p>
-
-<p>
-  В объектах {@link android.net.NetworkRequest} параметры
-сетевого обратного вызова задаются с помощью {@link android.net.NetworkCapabilities}. Объекты {@link android.net.NetworkRequest} создаются
-с использованием класса {@link
-  android.net.NetworkRequest.Builder NetworkRequest.Builder}. Затем метод {@link
-  android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,
-  android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()}
- передает объект {@link android.net.NetworkRequest} системе. Если
-сетевые условия выполнены, приложение получает обратный вызов для выполнения метода
-  {@link android.net.ConnectivityManager.NetworkCallback#onAvailable
-  onAvailable()}, определенного в своем классе {@link
-  android.net.ConnectivityManager.NetworkCallback}.
-</p>
-
-<p>
-  Приложение продолжает получать обратные вызовы, пока оно не будет закрыто или не будет вызван метод
-  {@link android.net.ConnectivityManager#unregisterNetworkCallback
-  unregisterNetworkCallback()}.
-</p>
-
-<h2 id="media-broadcasts">
-  Ограничения для NEW_PICTURE и NEW_VIDEO
-</h2>
-
-<p>
-  В N Developer Preview приложения не могут отправлять или получать широковещательные сообщения {@link
-  android.hardware.Camera#ACTION_NEW_PICTURE} и {@link
-  android.hardware.Camera#ACTION_NEW_VIDEO}. Это ограничение
- позволяет улучшить производительность, если для обработки нового изображения или видео должны
- активироваться несколько приложений. N Developer Preview
- расширяет классы {@link android.app.job.JobInfo} и {@link
-  android.app.job.JobParameters}, что дает разработчикам альтернативное решение.
-</p>
-
-<h3 id="new-jobinfo">
-  Новые методы JobInfo
-</h3>
-
-<p>
-  Для активации заданий при изменении URI контента в N Developer Preview
- были добавлены следующие методы для API-интерфейса {@link android.app.job.JobInfo}.
-</p>
-
-<dl>
-  <dt>
-    {@code JobInfo.TriggerContentUri()}
-  </dt>
-
-  <dd>
-    Инкапсулирует параметры, необходимые для активации задания при изменении URI контента.
-  </dd>
-
-  <dt>
-    {@code JobInfo.Builder.addTriggerContentUri()}
-  </dt>
-
-  <dd>
-    Передает объект {@code TriggerContentUri} в контейнер {@link
-    android.app.job.JobInfo}. Объект {@link android.database.ContentObserver}
-    отслеживает инкапсулированный URI контента. Если с заданием связано несколько объектов {@code
-    TriggerContentUri}, система предоставляет
- обратный вызов, даже если изменился только один из URI контента.
-  </dd>
-
-  <dd>
-    Добавьте флаг {@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS}, чтобы
- активировать задание при изменении любых потомков указанного URI. Этот флаг
- соответствует параметру {@code notifyForDescendants}, переданному методу {@link
-    android.content.ContentResolver#registerContentObserver
-    registerContentObserver()}.
-  </dd>
-</dl>
-
-<p class="note">
-  <strong>Примечание.</strong> Метод {@code TriggerContentUri()} не может использоваться
- вместе с {@link android.app.job.JobInfo.Builder#setPeriodic
-  setPeriodic()} или {@link android.app.job.JobInfo.Builder#setPersisted
-  setPersisted()}. Чтобы непрерывно отслеживать изменения контента, запланируйте новый объект задания
-  {@link android.app.job.JobInfo}, прежде чем {@link
-  android.app.job.JobService} завершит обработку последнего обратного вызова.
-</p>
-
-<p>
-  В следующем примере кода планируется задание, которое активируется, когда система сообщает
- об изменении URI контента {@code MEDIA_URI}:
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-          (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo.Builder builder = new JobInfo.Builder(
-          MY_BACKGROUND_JOB,
-          new ComponentName(context, MediaContentJob.class));
-  builder.addTriggerContentUri(
-          new JobInfo.TriggerContentUri(MEDIA_URI,
-          JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
-  js.schedule(builder.build());
-}
-</pre>
-<p>
-  Если система сообщает об изменении указанных URI контента, приложение
- получает обратный вызов, а объект {@link android.app.job.JobParameters} передается
- методу {@link android.app.job.JobService#onStartJob onStartJob()}
- в {@code MediaContentJob.class}.
-</p>
-
-<h3 id="new-jobparam">
-  Новые методы JobParameter
-</h3>
-
-<p>
-  В N Developer Preview также расширен класс {@link android.app.job.JobParameters}, чтобы
- приложения могли получать полезные сведения о том, какие источники контента
- и URI инициировали задание.
-</p>
-
-<dl>
-  <dt>
-    {@code Uri[] getTriggeredContentUris()}
-  </dt>
-
-  <dd>
-    Возвращает массив URI, которые активировали задание. Возвращается значение {@code
-    null}, если ни один URI не инициировал задание (например, задание было
-    активировано по времени или из-за другой причины), или число измененных
-    URI больше 50.
-  </dd>
-
-  <dt>
-    {@code String[] getTriggeredContentAuthorities()}
-  </dt>
-
-  <dd>
-    Возвращает строковый массив источников контента, которые активировали задание.
-    Если возвращенный массив не равен {@code null}, используйте метод {@code getTriggeredContentUris()},
-    чтобы получить сведения об измененных URI.
-  </dd>
-</dl>
-
-<p>
-  В следующем примере кода перегружается метод {@link
-  android.app.job.JobService#onStartJob JobService.onStartJob()} и
- записываются источники и URI контента, вызвавшие задание:
-</p>
-
-<pre>
-&#64;Override
-public boolean onStartJob(JobParameters params) {
-  StringBuilder sb = new StringBuilder();
-  sb.append("Media content has changed:\n");
-  if (params.getTriggeredContentAuthorities() != null) {
-      sb.append("Authorities: ");
-      boolean first = true;
-      for (String auth :
-          params.getTriggeredContentAuthorities()) {
-          if (first) {
-              first = false;
-          } else {
-             sb.append(", ");
-          }
-           sb.append(auth);
-      }
-      if (params.getTriggeredContentUris() != null) {
-          for (Uri uri : params.getTriggeredContentUris()) {
-              sb.append("\n");
-              sb.append(uri);
-          }
-      }
-  } else {
-      sb.append("(No content)");
-  }
-  Log.i(TAG, sb.toString());
-  return true;
-}
-</pre>
-
-<h2 id="further-optimization">
-  Дальнейшая оптимизация приложения
-</h2>
-
-<p>
-  Оптимизация приложений для устройств с малым объемом памяти
- или для условий с ограниченным объемом памяти помогает улучшить производительность и удобство работы пользователей. Удаление
- зависимостей от фоновых служб и статически зарегистрированных приемников неявных широковещательных сообщений
- способно помочь приложению более эффективно работать на таких устройствах. Хотя
- на платформе N Developer Preview приняты меры для устранения некоторых из этих проблем,
- рекомендуется оптимизировать приложения, полностью отказавшись
- от подобных фоновых процессов.
-</p>
-
-<p>
-  В N Developer Preview представлен ряд дополнительных команд <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge (ADB)</a>, с помощью
- которых можно тестировать поведение приложения с отключенными фоновыми процессами.
-</p>
-
-<ul>
-  <li>Для эмуляции условий, в которых неявные широковещательные сообщения и фоновые службы
- недоступны, введите следующую команду:
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore}
-</pre>
-  </li>
-
-  <li>Чтобы снова включить неявные широковещательные сообщения и фоновые службы, введите
- следующую команду:
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow}
-</pre>
-  </li>
-</ul>
\ No newline at end of file
diff --git a/docs/html-intl/intl/ru/preview/features/icu4j-framework.jd b/docs/html-intl/intl/ru/preview/features/icu4j-framework.jd
deleted file mode 100644
index 7d22408..0000000
--- a/docs/html-intl/intl/ru/preview/features/icu4j-framework.jd
+++ /dev/null
@@ -1,160 +0,0 @@
-page.title=API-интерфейсы ICU4J в платформе Android
-page.tags=androidn
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>Содержание документа:</h2>
-<ol>
-    <li><a href="#relation">Связь с ICU4J</a></li>
-    <li><a href="#migration">Переход на API-интерфейсы android.icu с ICU4J</a></li>
-    <li><a href="#licence">Лицензирование</a></li>
-</ol>
-
-<h2>См. также:</h2>
-<ol>
-  <li>
-    <a class="external-link" href="http://userguide.icu-project.org">Документация по ICU4J</a>
-  </li>
-
-  <li>
-    <a class="external-link" href="http://site.icu-project.org/#TOC-What-is-ICU-">Последние стандарты, поддерживаемые
-ICU4J</a>
-  </li>
-</ol>
-</div>
-</div>
-
-<p>
-  ICU4J — широко используемый набор библиотек Java с открытым кодом, обеспечивающий для приложений поддержку формата Unicode
-и глобализации. Android N
-открывает в платформе Android частичный набор API-интерфейсов ICU4J, который разработчики приложений
-могут использовать в составе пакета {@code android.icu}. Эти API используют
-данные локализации, присутствующие на устройстве. Это позволяет уменьшить размеры APK
-, не компилируя библиотеки ICU4J в APK, а
-просто вызывая их в платформе. (В этом случае может оказаться удобно предоставлять
-<a href="{@docRoot}google/play/publishing/multiple-apks.html">несколько версий
-вашего APK</a>, чтобы пользователи с версиями Android ниже Android N
-могли загружать версию приложения, содержащую библиотеки ICU4J.)
-</p>
-
-<p>
-  В начале этого документа предоставляется базовая информация по минимальным уровням
-Android API, которые требуются для поддержки этих библиотек. Далее приводятся необходимые пояснения
-о реализации ICU4J в Android. В заключение
-в нем рассказывается, как использовать API-интерфейсы ICU4J в платформе Android.
-</p>
-
-<h2 id="relation">Связь с ICU4J</h2>
-
-<p>
-  В Android N частичный набор API-интерфейсов ICU4J открывается через пакет
-  <code>android.icu</code>, а не через <code>com.ibm.icu</code>. Для платформы
-Android может быть принято решение не
-открывать API-интерфейсы ICU4J по различным причинам. Например, Android N не открывает
-некоторые устаревшие API-интерфейсы, а также те, которые рабочая группа ICU еще не объявила
-стабильными. По мере того, как рабочая группа ICU будет объявлять API-интерфейсы устаревшими, они будут так же помечаться и в Android,
-но при этом будут и дальше входить в состав платформы.
-</p>
-
-<p class="table-caption"><strong>Таблица 1.</strong> Версии ICU и CLDR, используемые
-в Android N.</p>
-<table>
-<tr>
-<th>Уровень Android API</th>
-<th>Версия ICU</th>
-<th>Версия CLDR</th>
-</tr>
-<tr>
-<td>Android N</td>
-<td>56</td>
-<td>28</td>
-</tr>
-</table>
-
-<p>Следует отметить несколько важных моментов:</p>
-
-<ul>
-<li>В состав API-интерфейсов ICU4J платформы Android входят не все API-интерфейсы ICU4J.</li>
-<li>Разработчикам NDK следует помнить, что Android ICU4C не поддерживается.</li>
-<li>API-интерфейсы в платформе Android не заменяют поддержку
-<a href="{@docRoot}guide/topics/resources/localization.html">локализации с
-ресурсами</a> в Android.</li>
-</ul>
-
-<h2 id="migration">Переход на пакет android.icu с com.ibm.icu</h2>
-
-<p>
-  Если вы уже используете в своем приложении API-интерфейсы ICU4J, и если API
-  <code>android.icu</code> соответствуют вашим требованиям, то для перехода на
-API-интерфейсы платформы вам нужно будет изменить импорт Java
-с <code>com.ibm.icu</code> на <code>android.icu</code>. После этого вы сможете
-удалить свои копии файлов ICU4J из APK.
-</p>
-
-<p class="note">
-  <b>Примечание</b>. API-интерфейсы ICU4J в платформе используют пространство имен {@code android.icu}
-вместо {@code com.ibm.icu}. Это позволяет избежать конфликтов пространств имен
-в пакетах APK, содержащих собственные библиотеки {@code com.ibm.icu}.
-</p>
-
-<h3 id="migrate-from-android">
-  Переход на API-интерфейсы android.icu с других API Android SDK
-</h3>
-
-<p>
-  Некоторые классы в пакетах <code>java</code> и <code>android</code> имеют
-эквиваленты в ICU4J. Однако ICU4J обычно обеспечивает более широкую
-поддержку стандартов и языков.
-</p>
-<p>Ниже приведены несколько примеров для начала работы:</p>
-<table>
-<tr>
-<th>Класс</th>
-<th>Альтернативы</th>
-</tr>
-<tr>
-<td><code>java.lang.Character</code> </td>
-<td><code>android.icu.lang.UCharacter</code> </td>
-</tr>
-<tr>
-<td><code>java.text.BreakIterator</code> </td>
-<td><code>android.icu.text.BreakIterator</code> </td>
-</tr>
-<tr>
-<td><code>java.text.DecimalFormat</code> </td>
-<td><code>android.icu.text.DecimalFormat</code> </td>
-</tr>
-<tr>
-<td><code>java.util.Calendar</code></td>
-<td>
-<code>android.icu.util.Calendar</code></td>
-</tr>
-<tr>
-<td><code>android.text.BidiFormatter</code>
- </td>
-<td><code>android.icu.text.Bidi</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateFormat</code>
- </td>
-<td><code>android.icu.text.DateFormat</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateUtils</code> </td>
-<td><code>android.icu.text.DateFormat</code>
-<code>android.icu.text.RelativeDateTimeFormatter</code>
-</td>
-</tr>
-</table>
-
-<h2 id="licence">Лицензирование</h2>
-
-<p>
-  ICU4J выпускается по лицензии ICU. Более подробную информацию можно найти в <a class="external-link" href="http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-">Руководстве пользователя
-ICU.</a>
-</p>
diff --git a/docs/html-intl/intl/ru/preview/features/multilingual-support.jd b/docs/html-intl/intl/ru/preview/features/multilingual-support.jd
deleted file mode 100644
index 83e9968..0000000
--- a/docs/html-intl/intl/ru/preview/features/multilingual-support.jd
+++ /dev/null
@@ -1,217 +0,0 @@
-page.title=Язык и языковой стандарт
-page.tags=androidn
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>Содержание документа:</h2>
-<ol>
-	  <li><a href="#preN">Сложности с разрешением языковых ресурсов</a></li>
-    <li><a href="#postN">Улучшение стратегии разрешения ресурсов</a></li>
-    <li><a href="#design">Проектирование приложения для поддержки дополнительных
- языковых стандартов</a></li>
-
-</ol>
-
-</div>
-</div>
-
-<p>Android N обеспечивает расширенную поддержку многоязычных пользователей,
-позволяя им выбирать в настройках из нескольких языковых стандартов. Эта возможность реализована в Android N
-за счет значительного увеличения числа поддерживаемых языковых стандартов
-и изменения способа разрешения ресурсов в системе. Новый метод разрешения
-ресурсов более надежен и разработан с учетом совместимости с существующими APK. Тем не менее,
-при его использовании следует очень внимательно следить за признаками непредвиденного поведения приложения. Например, при его использовании
-следует провести тесты и убедиться, что приложение по умолчанию использует ожидаемый язык. Если
-ваше приложение поддерживает несколько языков, нужно убедиться, что поддержка работает
-ожидаемым образом. Также следует попытаться обеспечить корректную работу приложения с
-языками, поддержка которых не предусматривалась явным образом в его коде.</p>
-
-<p>В начале этого документа рассказывается о стратегии разрешения ресурсов, которая использовалась до появления
-Android N. Далее в нем описывается улучшенная стратегия
-разрешения ресурсов в Android N. В последней части документа рассказывается о том, как использовать
-дополнительные языковые стандарты для поддержки большего числа многоязычных пользователей.</p>
-
-<h2 id="preN">Сложности с разрешением языковых ресурсов</h2>
-
-<p>До выпуска Android N в Android не всегда удавалось успешно сопоставлять
- языковые стандарты приложений и системы. Допустим, по умолчанию в вашем приложении используется английский язык
- (США), но оно также содержит строки на испанском, локализованные в файлах ресурсов {@code es_ES}.
-</p>
-<p>В коде Java разрешение языков строк происходило следующим
-образом:</p>
-<ul>
-<li>Если на устройстве был установлен язык {@code es_MX} (испанский, Мексика), Android загружал
-строки из файлов ресурсов {@code es_ES}.</li>
-<li>Если на устройстве был установлен язык {@code en_AU}, Android возвращался к языку {@code
-en_US}. Также система использовала по умолчанию язык {@code en_US}, если пользователь выбирал язык,
-который вообще не поддерживался приложением, например, французский.</li>
-</ul>
-
-
-<p>Проблемы с разрешением возникали из-за того, что система удаляла код страны
- из строки языкового стандарта при отсутствии точного совпадения.  Например:</p>
-<p class="table-caption" id="t-resource-res">
-<strong>Таблица 1.</strong> Разрешение ресурсов без точного совпадения языковых стандартов.
-</p>
-<table>
-<tbody>
-<tr>
-<th>Пользовательские настройки</th>
-<th>Ресурсы приложения</th>
-<th>Разрешение ресурсов</th>
-</tr>
-<tr>
-<td>fr_CH</td>
-<td>
-по умолчанию (en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
- <td>
-Попытка использования fr_CH =&gt; Отказ<br>
-Попытка использования fr =&gt; Отказ<br>
-Использование языка по умолчанию (en)
-</td>
- </tr>
- </tbody>
-</table>
-
-
-<p>В этом примере система отображает строки на английском,
-не зная, понимает ли пользователь английский язык. Такое поведение приложений сейчас довольно
-распространено. С выпуском Android N подобные ситуации
-будут возникать намного реже.</p>
-
-<h2 id="postN">Улучшение стратегии разрешения ресурсов</h2>
-<p>В Android N используется более надежная система разрешения ресурсов,
-которая автоматически находит более подходящие альтернативные варианты. Однако для ускорения процесса разрешения и упрощения
- обслуживания ресурсы следует хранить на наиболее распространенном языке верхнего уровня.
- Например, если вы хранили ресурсы на испанском в каталоге{@code es-US}
-, их следует переместить в каталог {@code es-419}, где содержатся ресурсы на латиноамериканском диалекте испанского языка.
- Аналогичным образом, если вы хранили строки ресурсов в папке {@code en-GB}, вам следует изменить название папки
- на {@code en-001} (международная версия английского языка), поскольку {@code en-001} — наиболее распространенный
- язык верхнего уровня для строк <code>en-GB</code>.
- В следующих примерах объясняется, почему такая практика повышает производительность и
-надежность процесса разрешения ресурсов.</p>
-
-<h3>Примеры разрешения ресурсов</h3>
-
-<p>В Android N ситуация, описанная в <strong>Таблице 1</strong>, разрешается
-иначе:</p>
-
-<p class="table-caption" id="t-improved-res">
-<strong>Таблица 2.</strong> Улучшенная стратегия разрешения при отсутствии
-точного совпадения языкового стандарта.</p>
-<table>
-<tr>
-<th>Пользовательские настройки</th>
-<th>Ресурсы приложения</th>
-<th>Разрешение ресурсов</th>
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-</ol>
-</td>
-<td>
-по умолчанию (en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
-<td>
-Попытка использования fr_CH =&gt; Отказ<br>
-Попытка использования fr =&gt; Отказ<br>
-Попытка использования диалекта fr =&gt; fr_FR<br>
-Использование fr_FR
-</td>
-</tr>
-
-</table>
-
-
-<p>В этом примере пользователь получает ресурсы на французском языке, а не на английском. В этом примере также показано, почему для Android N
- следует хранить строки на французском языке в каталоге {@code fr}, а не в каталоге {@code fr_FR}.
-Здесь целью разрешения является нахождение наиболее близкого диалекта верхнего уровня,
- что ускоряет процесс разрешения и делает его более предсказуемым.</p>
-
-<p>Помимо улучшенной логики разрешения в Android добавлены
- дополнительные языки. Рассмотрим предыдущий пример в ситуации, когда итальянский
- указан как дополнительный язык пользователя, а приложение не поддерживает французский язык.  </p>
-
-<p class="table-caption" id="t-2d-choice">
-<strong>Таблица 3.</strong> Разрешение ресурсов в ситуации, когда приложение находит соответствие только для
-второго предпочитаемого пользователем языкового стандарта.</p>
-<table>
-<tr>
-<th>Пользовательские настройки</th>
-<th>Ресурсы приложения</th>
-<th>Разрешение ресурсов</th>
-
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-<li> it_CH</li>
-</ol>
-</td>
-<td>
-по умолчанию (en)<br>
-de_DE<br>
-es_ES<br>
-it_IT<br>
-</td>
-<td>
-Попытка использования fr_CH =&gt; Отказ<br>
-Попытка использования fr =&gt; Отказ<br>
-Попытка использования диалекта fr =&gt; Отказ<br>
-Попытка использования it_CH =&gt; Отказ<br>
-Попытка использования it =&gt; Отказ<br>
-Попытка использования диалекта it =&gt; it_IT<br>
-Использование it_IT
-</td>
-
-</tr>
-
-</table>
-<p>Пользователь получает данные на понятном ему языке, хотя приложение и не
-поддерживает французский язык.</p>
-
-
-<h2 id="design">Проектирование приложения для поддержки дополнительных языковых стандартов</h2>
-<h3>API LocaleList</h3>
-
-<p>В Android N добавлен новый API {@code LocaleList.GetDefault()},
- позволяющий приложениям напрямую запрашивать список языков, выбранных пользователем. Этот API
-позволяет реализовать более сложное поведение
- приложений и лучше оптимизировать отображение содержимого на экране. Например, результаты поиска
- могут отображаться на разных языках в зависимости от пользовательских настроек.  Приложения в браузере
- могут не предлагать пользователю перевести приложения на знакомый ему язык,
- а приложения, использующие клавиатуру, могут автоматически включать все подходящие раскладки. </p>
-
-<h3>Средства форматирования</h3>
-
-<p>Версии Android до 6.0 включительно (уровень API 23) поддерживали только один или два языковых стандарта
- для большинства распространенных языков
-(en, es, ar, fr, ru). Поскольку у каждого языка имелось лишь немного вариантов,
-приложения могли хранить числа и даты в виде жестко закодированных строк
-в файлах ресурсов.  Однако с расширением числа поддерживаемых Android языковых стандартов
-могут возникнуть
-значительные различия форматов даты, времени, валюты и другой подобной
-информации даже в рамках одного языкового стандарта. Жесткое кодирование форматов может запутать
-конечных пользователей.  Поэтому при разработке приложений для Android N
-следует использовать средства форматирования, а не жесткое кодирование строк с числами и датами.</p>
-
-<p>В качестве наглядного примера можно привести арабский язык, поддержка которого в Android N расширена
-с одного {@code ar_EG} до 27 языковых стандартов. Большинство ресурсов этих языковых стандартов общие, но
-в некоторых из них используются цифры формата ASCII, а в других — собственные цифры. Например,
-если вы хотите создать предложение с числовой переменной
-"Выберите ПИН-код из 4 цифр", вам нужно использовать средства форматирования следующим образом:</p>
-
-<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>
diff --git a/docs/html-intl/intl/ru/preview/features/notification-updates.jd b/docs/html-intl/intl/ru/preview/features/notification-updates.jd
deleted file mode 100644
index 54b3bc3..0000000
--- a/docs/html-intl/intl/ru/preview/features/notification-updates.jd
+++ /dev/null
@@ -1,328 +0,0 @@
-page.title=Уведомления
-page.tags=notifications
-helpoutsWidget=true
-page.image=/preview/images/notifications-card.png
-
-trainingnavtop=true
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-
-<!-- table of contents -->
-<h2>Содержание:</h2>
-<ol>
-  <li><a href="#direct">Прямой ответ</a></li>
-  <li><a href="#bundle">Группы уведомлений</a></li>
-  <li><a href="#custom">Собственные представления</a></li>
-</ol>
-
-</div>
-</div>
-
-<p>В Android N представлено несколько новых API-интерфейсов, позволяющих
-публиковать заметные и интерактивные уведомления.</p>
-
-<p>Существующий API-интерфейс уведомлений {@link android.support.v4.app.RemoteInput}
-в Android N расширен для поддержки внутренних ответов на смартфонах. С помощью этой возможности
- пользователи могут быстро отвечать на сообщения в панели уведомлений, не открывая приложение.</p>
-
-<p>
-  Android N также позволяет группировать несколько похожих
-  уведомлений, чтобы они отображались как одно. Для этого в Android N используется существующий метод {@link
-  android.support.v4.app.NotificationCompat.Builder#setGroup
-  NotificationCompat.Builder.setGroup()}. Пользователи могут развернуть все
-  уведомления и выполнить различные действия, например ответить на сообщение
-  или закрыть каждое из уведомлений по отдельности в панели уведомлений.
-</p>
-
-<p>Наконец, в Android N представлены новые API-интерфейсы, позволяющие
-использовать системные элементы в собственных представлениях уведомлений вашего приложения. Благодаря им
-уведомления отображаются единообразно на основе
-стандартных шаблонов.</p>
-
-<p>В этом документе рассматриваются некоторые наиболее важные изменения,
- которые следует учитывать при использовании новых уведомлений в приложениях.</p>
-
-<h2 id="direct">Прямой ответ</h2>
-
-<p>С помощью прямых ответов пользователи
- Android N могут быстро отвечать на текстовые сообщения и обновлять списки задач непосредственно в интерфейсе
-уведомлений. На мобильных устройствах действие внутреннего ответа обозначается
- как дополнительная кнопка в уведомлении. Если пользователь набирает ответ на клавиатуре, система
- прикрепляет текст ответа к намерению,
- указанному для действия уведомления, и передает намерение в ваше
- приложение.
-
-
-<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
-  {@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
-<p class="img-caption">
-  <strong>Рисунок 1.</strong> В Android N добавлена кнопка <strong>Reply</strong>.
-
-</p>
-
-<h3>Добавление действий внутренних ответов</h3>
-
-<p>Создание действия уведомления, которое поддерживает прямой ответ:
-</p>
-
-<ol>
-<li>Создайте экземпляр класса {@link android.support.v4.app.RemoteInput.Builder},
- который можно добавить в действие
-уведомления. Конструктор класса принимает строку, которую система использует как
- ключ для введенного текста. Потом ваше приложение использует этот ключ для получения
- текста.
-
-<pre>
-// Key for the string that's delivered in the action's intent
-private static final String KEY_TEXT_REPLY = "key_text_reply";
-String replyLabel = getResources().getString(R.string.reply_label);
-RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
-        .setLabel(replyLabel)
-        .build();
-</pre>
-</li>
-<li>Прикрепите объект {@link android.support.v4.app.RemoteInput}
- к действию с помощью метода <code>addRemoteInput()</code>.
-
-<pre>
-// Create the reply action and add the remote input
-Notification.Action action =
-        new Notification.Action.Builder(R.drawable.ic_reply_icon,
-                getString(R.string.label), replyPendingIntent)
-                .addRemoteInput(remoteInput)
-                .build();
-</pre>
-</li>
-
-<li>Примените действие к уведомлению и отправьте его.
-
-<pre>
-// Build the notification and add the action
-Notification notification =
-        new Notification.Builder(mContext)
-                .setSmallIcon(R.drawable.ic_message)
-                .setContentTitle(getString(R.string.title))
-                .setContentText(getString(R.string.content))
-                .addAction(action))
-                .build();
-
-// Issue the notification
-NotificationManager notificationManager =
-        NotificationManager.from(mContext);
-notificationManager.notify(notificationId, notification);
-
-</pre>
-</li>
-
-</ol>
-
-
-<p> Система запрашивает у пользователя ввод ответа, если он инициирует
-действие уведомления. </p>
-
-<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
-    {@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>Рисунок 2.</strong> Пользователь вводит текст в панели уведомлений.
-</p>
-
-<h3>Получение введенного пользователем текста из внутреннего ответа</h3>
-
-<p>Получение введенного пользователем текста из интерфейса
-уведомлений в операции, объявленной в намерении действия:</p>
-<ol>
-<li> Вызовите метод {@link android.support.v4.app.RemoteInput#getResultsFromIntent
-  getResultsFromIntent()}, передав намерение действия уведомления
- в качестве входного параметра. Этот метод возвращает объект {@link android.os.Bundle},
- содержащий текст ответа.
-</li>
-
-<pre>
-Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-</pre>
-
-<li>Запросите группу, используя ключ результата (предоставленный конструктору {@link
-  android.support.v4.app.RemoteInput.Builder}).
-</li>
-</ol>
-
-<p>В следующем фрагменте кода показано, как метод извлекает введенный
-текст из группы:</p>
-
-<pre>
-// Obtain the intent that started this activity by calling
-// Activity.getIntent() and pass it into this method to
-// get the associated string.
-
-private CharSequence getMessageText(Intent intent) {
-    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-    if (remoteInput != null) {
-            return remoteInput.getCharSequence(KEY_TEXT_REPLY);
-            }
-    return null;
- }
-</pre>
-
-<p>Приложения могут применять логику, чтобы определить, какие действия следует выполнить с полученным
-текстом.
-Для интерактивных приложений (например, чатов) предоставьте больше контекста в самом уведомлении
- (например, несколько строк истории чата, в том числе собственные сообщения пользователя),
- чтобы у пользователя было достаточно информации для ответа.
-Когда пользователь отвечает через {@link android.support.v4.app.RemoteInput},
- добавьте текст в историю ответов, применив метод {@code setRemoteInputHistory()}.
-</p>
-
-<h2 id="bundle">Группы уведомлений</h2>
-
-<p>Android N предоставляет разработчикам новый способ отображения
- очереди уведомлений: <i>группы уведомлений</i>. Они похожи на
-  <a href="{@docRoot}training/wearables/notifications/stacks.html">стеки
- уведомлений</a> в Android Wear. Например, если приложение создает уведомления
- для входящих сообщений и получено несколько сообщений, объедините
- уведомления в одну группу. Для группировки похожих уведомлений используйте
- существующий метод {@link android.support.v4.app.NotificationCompat.Builder#setGroup
-Builder.setGroup()}.</p>
-
-<p>
-  Уведомления в группе формируют иерархию,
-  на вершине которой находится родительское уведомление, отображающее
- сводную информацию о группе. Пользователь может постепенно
- раскрывать группу уведомлений, при этом система показывает дополнительные
-  сведения. Если пользователь раскрывает группу, система отображает больше
- информации о всех дочерних уведомлениях. Если же пользователь
- развернет одно из уведомлений, его содержимое показывается полностью.
-</p>
-
-<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
-          {@docRoot}preview/images/bundles_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>Рисунок 3.</strong> Пользователь может постепенно раскрывать группу уведомлений.
-
-</p>
-
-<p>Добавление уведомлений в группу описано в разделе
-<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">Добавление
-каждого уведомления в группу</a>.</p>
-
-
-<h3 id="best-practices">Рекомендации по работе с группами уведомлений</h3>
-<p>В этом разделе описываются рекомендации по использованию групп
-уведомлений вместо уведомлений {@link android.app.Notification.InboxStyle InboxStyle},
- которые были доступны в предыдущих версиях платформы
- Android.</p>
-
-<h3>Ситуации, в которых следует использовать группы уведомлений</h3>
-
-<p>Вам следует использовать группы уведомлений, только если выполняются
-все следующие условия.</p>
-
-<ul>
-  <li>Дочерние уведомления являются полноценными уведомлениями, которые можно
- показать отдельно без сводной информации о группе.</li>
-  <li>Отображение дочерних уведомлений по отдельности имеет смысл. Например:
-
-  </li>
-  <ul>
-    <li>в дочерних уведомлениях можно выполнять какие-либо соответствующие им действия;</li>
-    <li>дочернему уведомлению предшествует больше информации, чем требуется пользователю.</li>
-  </ul>
-</ul>
-
-<p>Примером использования групп уведомлений может служить приложение
-для обмена сообщениями, которое показывает список входящих сообщений,
-или почтовое приложение, отображающее список полученных писем.</p>
-
-<p>
-К примерам ситуаций, когда предпочтительнее использовать одно
- уведомление, относятся отдельные сообщения от одного пользователя или
- списочное представление однострочных текстовых элементов. Для них можно использовать
-{@link android.app.Notification.InboxStyle InboxStyle} или
-{@link android.app.Notification.BigTextStyle BigTextStyle}.
-
-</p>
-
-<h3 id ="post">Отображение группы уведомлений</h3>
-
-<p>
-  Приложение всегда должно публиковать сводную информацию группы, даже если эта группа содержит
- всего одно дочернее уведомление. В этом случае система не показывает сводную информацию, а
- непосредственно отображает это уведомление. Это обеспечивает
- единообразие интерфейса при
- пролистывании дочернего элемента группы.
-</p>
-
-<p class="note">
-  <strong>Примечание.</strong> Эта версия Android N пока еще не
- блокирует отображение сводной информации для групп уведомлений, содержащих только один дочерний элемент. Эта
- возможность будет добавлена в следующих версиях Android N.
-</p>
-
-<h3>Всплывающие уведомления</h3>
-
-<p>Хотя система обычно отображает дочерние уведомления в виде группы,
- их можно временно показывать в виде
- <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">всплывающих
-уведомлений</a>. Эта возможность очень удобна, так как позволяет
- быстро получить доступ к последнему дочернему уведомлению и связанным с ним действиям.
-</p>
-
-
-<h3>Обратная совместимость</h3>
-
-<p>
-  И группы уведомлений, и удаленный ввод входили в состав API {@link
-  android.app.Notification} для поддержки устройств
- Android Wear, начиная с Android 5.0 (уровень API 21). Если вы уже использовали эти API-интерфейсы для создания уведомлений,
- вам нужно только убедиться, что поведение приложения соответствует
- описанным выше рекомендациям, и рассмотреть возможность реализации {@code
-  setRemoteInputHistory()}.
-</p>
-
-<p>
-  Для поддержки обратной совместимости те же API-интерфейсы доступны в
- классе {@link android.support.v4.app.NotificationCompat}
- вспомогательной библиотеки, что позволяет реализовать уведомления, работающие в предыдущих версиях Android.
- На смартфонах и планшетах пользователи видят только сводное уведомление,
- поэтому в приложении все равно должно быть уведомление
- в стиле Inbox или аналогичное уведомление, содержащее всю информацию о группе. Так как устройства Android
-Wear позволяют пользователям видеть все дочерние уведомления даже
- на более ранних уровнях платформы, эти уведомления следует создавать независимо от уровня API.
-
-</p>
-
-<h2 id="custom"> Собственные представления</h2>
-<p>Начиная с Android N, вы можете настраивать представления уведомлений
-и по-прежнему получать системные элементы, такие как заголовки уведомлений, действия и
-расширяемые макеты.</p>
-
-<p>Для этого в Android N добавлены следующие API-интерфейсы, позволяющие
- настраивать собственные представления.</p>
-
-<dl>
-<dt>
-{@code DecoratedCustomViewStyle()}</dt>
-<dd> Определяет стиль для всех уведомлений, кроме
-уведомлений мультимедиа.</dd>
-<dt>
-{@code DecoratedMediaCustomViewStyle()}</dt>
-<dd> Определяет стиль для уведомлений мультимедиа.</dd>
-</dl>
-
-<p>Чтобы воспользоваться этим новым API-интерфейсом, вызовите метод {@code setStyle()}, передав в него
-нужный стиль собственного представления.</p>
-
-<p>В этом фрагменте показано, как создать собственный объект уведомления с помощью метода
-{@code DecoratedCustomViewStyle()}.</p>
-
-<pre>
-Notification noti = new Notification.Builder()
-           .setSmallIcon(R.drawable.ic_stat_player)
-           .setLargeIcon(albumArtBitmap))
-           .setCustomContentView(contentView);
-           .setStyle(new Notification.DecoratedCustomViewStyle())
-           .build();
-
-</pre>
diff --git a/docs/html-intl/intl/vi/about/versions/nougat/index.jd b/docs/html-intl/intl/vi/about/versions/nougat/index.jd
index bd64b25..58b4b5f 100644
--- a/docs/html-intl/intl/vi/about/versions/nougat/index.jd
+++ b/docs/html-intl/intl/vi/about/versions/nougat/index.jd
@@ -1,6 +1,6 @@
-page.title=Android N Developer Preview
-page.tags="preview","developer"
-meta.tags="preview", "android"
+page.title=Android 7.0 Nougat
+page.tags="androidn","versions"
+meta.tags="android n", "nougat", "android 7.0"
 fullpage=true
 forcelocalnav=true
 header.hide=1
@@ -17,62 +17,57 @@
   })
 </script>
 
-<section class="dac-expand dac-hero dac-light" style="background-color:#B2DFDB">
+<section class="dac-expand dac-hero dac-light">
   <div class="wrap" style="max-width:1100px;margin-top:0">
+  <a href="{@docRoot}about/versions/nougat/android-7.0.html">
     <div class="cols dac-hero-content" style="padding-bottom:1em;">
 
-      <div class="col-7of16 col-push-9of16" style="padding-left:2em">
-        <h1 class="dac-hero-title">Android N Developer Preview</h1>
+      <div class="col-7of16 col-push-8of16" style="padding-left:2em">
+        <h1 class="dac-hero-title">Android 7.0 Nougat</h1>
         <p class="dac-hero-description">
-          Hãy chuẩn bị sẵn sàng cho Android N!
+          Hãy chuẩn bị sẵn sàng cho Android Nougat!
           <strong>Kiểm thử ứng dụng của bạn</strong> trên Nexus và các thiết bị khác. Hỗ trợ các hành vi
           hệ thống mới nhằm <strong>tiết kiệm năng lượng và bộ nhớ</strong>.
           Mở rộng ứng dụng của bạn bằng <strong>UI đa cửa sổ</strong>,
           <strong>thông báo trả lời trực tiếp</strong> và nhiều tính năng khác.
         </p>
 
-        <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+        <a class="dac-hero-cta" href="{@docRoot}about/versions/nougat/android-7.0.html">
           <span class="dac-sprite dac-auto-chevron"></span>
           Bắt đầu
-        </a><!--<br>
-        <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
-          Update to Android N (final SDK)
-        </a><br>-->
+        </a>
       </div>
-      <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
-        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png" srcset="{@docRoot}images/home/n-preview-hero.png 1x,
-             {@docRoot}images/home/n-preview-hero_2x.png 2x">
+      <div class="col-7of16 col-pull-6of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
+        <a  href="{@docRoot}about/versions/nougat/android-7.0.html">
+        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png"
+             srcset="{@docRoot}images/home/n-preview-hero.png 1x,
+             {@docRoot}images/home/n-preview-hero_2x.png 2x" />
+           </a>
       </div>
-    </div>
+    </div></a>
     <div class="dac-section dac-small">
       <div class="resource-widget resource-flow-layout col-16"
-           data-query="collection:preview/landing/resources"
+           data-query="collection:nougat/landing/resources"
            data-cardSizes="6x2"
-           data-maxResults="6"></div>
-    </div>
+           data-maxResults="3"></div>
+         </div>
   </div>
 </section>
 
+
 <div id="useUpdatedTemplates" style="display:none" class="dac-section dac-slim dac-gray dac-expand">
   <div class="wrap dac-offset-parent">
-    <a class="dac-fab dac-scroll-button" data-scroll-button="" href="#build-apps">
+    <a class="dac-fab dac-scroll-button" data-scroll-button href="#latest">
       <i class="dac-sprite dac-arrow-down-gray"></i>
     </a>
     <ul class="dac-actions">
       <li class="dac-action">
-        <a class="dac-action-link" href="https://developer.android.com/preview/bug">
+        <a class="dac-action-link" href="https://source.android.com/source/report-bugs.html">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
           Báo cáo vấn đề
         </a>
       </li>
       <li class="dac-action">
-        <a class="dac-action-link" href="{@docRoot}preview/support.html">
-          <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
-          Xem ghi chú phát hành
-        </a>
-      </li>
-      <li class="dac-action">
         <a class="dac-action-link" href="{@docRoot}preview/dev-community">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
           Tham gia cộng đồng nhà phát triển
@@ -102,19 +97,44 @@
   </div><!-- end .wrap -->
 </div>
 
-<section class="dac-section dac-light"><div class="wrap">
-  <h1 class="dac-section-title">Tài nguyên</h1>
+<section class="dac-section dac-light dac-small" id="latest"><div class="wrap">
+  <h2 class="norule">Latest</h2>
+  <div class="resource-widget resource-flow-layout col-16"
+    data-query="type:blog+tag:androidn+tag:featured, type:youtube+tag:androidn+tag:featured"
+    data-sortOrder="-timestamp"
+    data-cardSizes="6x6"
+    data-items-per-page="6"
+    data-maxResults="15"
+    data-initial-results="3"></div>
+</div></section>
+
+<section class="dac-section dac-gray" id="videos"><div class="wrap">
+  <h1 class="dac-section-title">Videos</h1>
   <div class="dac-section-subtitle">
-    Các thông tin cần thiết để trợ giúp bạn chuẩn bị cho ứng dụng sẵn sàng chạy trên Android N.
+    New Android capabilities and the right way to use them in your apps.
   </div>
 
   <div class="resource-widget resource-flow-layout col-16"
-       data-query="collection:preview/landing/more"
+    data-query="collection:nougat/landing/videos/first,type:youtube+tag:androidn"
+    data-sortOrder="-timestamp"
+    data-cardSizes="6x6"
+    data-items-per-page="6"
+    data-maxResults="15"
+    data-initial-results="3">
+  </div>
+</div></section>
+
+<section class="dac-section dac-light" id="resources"><div class="wrap">
+  <h1 class="dac-section-title">Tài nguyên</h1>
+  <div class="dac-section-subtitle">
+    Các thông tin cần thiết để trợ giúp bạn chuẩn bị cho ứng dụng sẵn sàng chạy trên Android Nougat.
+  </div>
+
+  <div class="resource-widget resource-flow-layout col-16"
+       data-query="collection:nougat/landing/more"
        data-cardSizes="6x6"
        data-items-per-page="6"
        data-maxResults="15"
        data-initial-results="6"></div>
-
   </div>
-</section>
-
+</section>
\ No newline at end of file
diff --git a/docs/html-intl/intl/vi/preview/features/background-optimization.jd b/docs/html-intl/intl/vi/preview/features/background-optimization.jd
deleted file mode 100644
index 39e1c15..0000000
--- a/docs/html-intl/intl/vi/preview/features/background-optimization.jd
+++ /dev/null
@@ -1,390 +0,0 @@
-page.title=Tối ưu hóa Chạy ngầm
-page.metaDescription=Các hạn chế mới đối với truyền phát không biểu thị.
-page.keywords="android N", "implicit broadcasts", "job scheduler"
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>
-      Trong tài liệu này
-    </h2>
-
-    <ol>
-      <li>
-        <a href="#connectivity-action">Các hạn chế về CONNECTIVITY_ACTION</a>
-      </li>
-
-      <li>
-        <a href="#sched-jobs">Lên lịch Tác vụ Mạng trên Kết nối
-        Không đo lưu lượng</a>
-      </li>
-
-      <li>
-        <a href="#monitor-conn">Theo dõi Kết nối Mạng Trong khi Ứng dụng
-        đang Chạy</a>
-      </li>
-
-      <li>
-        <a href="#media-broadcasts">Các hạn chế về NEW_PICTURE và
-        NEW_VIDEO</a>
-      </li>
-
-      <li>
-        <a href="#new-jobinfo">Các phương thức JobInfo Mới</a>
-      </li>
-
-      <li>
-        <a href="#new-jobparam">Các phương thức JobParameter Mới</a>
-      </li>
-
-      <li>
-        <a href="#further-optimization">Tối ưu hóa thêm Ứng dụng của bạn</a>
-      </li>
-    </ol>
-  </div>
-</div>
-
-<p>
-  Các tiến trình chạy ngầm có thể tiêu tốn bộ nhớ và pin. Ví dụ, một
-  truyền phát không biểu thị có thể bắt đầu nhiều tiến trình chạy ngầm đã đăng ký
-  để theo dõi chúng, ngay cả khi các tiến trình đó có thể không làm việc nhiều. Điều này có thể có
-  ảnh hưởng lớn đến cả hiệu suất của thiết bị lẫn trải nghiệm của người dùng.
-</p>
-
-<p>
-  Để loại bỏ vấn đề này, N Developer Preview áp dụng các hạn chế
-  sau:
-</p>
-
-<ul>
-  <li>Các ứng dụng nhắm đến Preview không nhận được truyền phát {@link
-  android.net.ConnectivityManager#CONNECTIVITY_ACTION} nếu chúng
-  đăng ký nhận truyền phát trong bản kê khai của chúng. Các ứng dụng đang chạy ở tiền cảnh
-  vẫn có thể theo dõi {@code CONNECTIVITY_CHANGE} trên luồng chính của chúng bằng cách
-  đăng ký{@link android.content.BroadcastReceiver} với {@link
-  android.content.Context#registerReceiver Context.registerReceiver()}.
-  </li>
-
-  <li>Ứng dụng không thể gửi hoặc nhận các truyền phát {@link
-  android.hardware.Camera#ACTION_NEW_PICTURE} hoặc {@link
-  android.hardware.Camera#ACTION_NEW_VIDEO}. Việc tối ưu này
-  tác động đến mọi ứng dụng, không chỉ các ứng dụng nhắm đến Preview.
-  </li>
-</ul>
-
-<p>
-  Khuôn khổ Android cung cấp một số giải pháp để giảm thiểu sự cần thiết đối với
-  các truyền phát không biểu thị. Ví dụ, {@link android.app.job.JobScheduler}
-  và <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-  {@code GcmNetworkManager}</a> cung cấp một cơ chế lên lịch hiệu quả
-  cho các hoạt động mạng khi đáp ứng các điều kiện được chỉ định, ví dụ như kết nối tới mạng
- không đo lưu lượng. Bây giờ bạn cũng có thể sử dụng {@link android.app.job.JobScheduler}
-  để phản ứng lại với các thay đổi đối với các trình cung cấp nội dung. Các đối tượng {@link android.app.job.JobInfo}
-  gói gọn các tham số {@link android.app.job.JobScheduler}
-  dùng để lên lịch tác vụ của bạn. Khi đáp ứng được các điều kiện của tác vụ, hệ thống
-  sẽ thực thi tác vụ này trên {@link android.app.job.JobService} của ứng dụng của bạn.
-</p>
-
-<p>
-  Trong tài liệu này, chúng ta sẽ tìm hiểu cách sử dụng các phương thức thay thế, chẳng hạn như
-  {@link android.app.job.JobScheduler}, để thích ứng ứng dụng của bạn với các hạn chế
-  mới này.
-</p>
-
-<h2 id="connectivity-action">
-  Các hạn chế về CONNECTIVITY_ACTION
-</h2>
-
-<p>
-  Các ứng dụng nhắm đến N Developer Preview không nhận được truyền phát {@link
-  android.net.ConnectivityManager#CONNECTIVITY_ACTION} nếu chúng
-  đăng ký nhận truyền phát trong bản kê khai của chúng, và các tiến trình phụ thuộc vào truyền phát này
-  sẽ không khởi động. Điều này cũng đặt ra một vấn đề cho ứng dụng
-  về việc theo dõi thay đổi mạng hoặc thực hiện các hoạt động mạng hàng loạt khi
-  thiết bị kết nối với một mạng không đo lưu lượng. Một số giải pháp để tránh khỏi hạn chế này
-  đã tồn tại trong khuôn khổ Android, nhưng chọn được một giải pháp phù hợp
-  phụ thuộc vào những gì bạn muốn ứng dụng của bạn hoàn thành.
-</p>
-
-<p class="note">
-  <strong>Lưu ý:</strong> Một{@link android.content.BroadcastReceiver} có đăng ký
-  {@link android.content.Context#registerReceiver Context.registerReceiver()}
-  tiếp tục nhận các truyền phát này trong khi ứng dụng đang ở tiền cảnh.
-</p>
-
-<h3 id="sched-jobs">
-  Lên lịch Tác vụ Mạng trên Kết nối Không đo lưu lượng
-</h3>
-
-<p>
-  Khi sử dụng lớp{@link android.app.job.JobInfo.Builder JobInfo.Builder}
-  để xây dựng đối tượng {@link android.app.job.JobInfo} của bạn, hãy áp dụng phương thức {@link
-  android.app.job.JobInfo.Builder#setRequiredNetworkType
-  setRequiredNetworkType()} và chuyển {@link android.app.job.JobInfo
-  JobInfo.NETWORK_TYPE_UNMETERED} dưới dạng một tham số tác vụ. Đoạn mã mẫu sau
-  lên lịch một dịch vụ để chạy khi thiết bị kết nối với một mạng
-  không đo lưu lượng và đang sạc:
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-      (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo job = new JobInfo.Builder(
-    MY_BACKGROUND_JOB,
-    new ComponentName(context, MyJobService.class))
-      .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
-      .setRequiresCharging(true)
-      .build();
-  js.schedule(job);
-}
-</pre>
-
-<p>
-  Khi các điều kiện cho tác vụ của bạn đã được đáp ứng, ứng dụng của bạn sẽ nhận được lệnh gọi lại để chạy
-  phương thức{@link android.app.job.JobService#onStartJob onStartJob()}trong
-  {@code JobService.class} được chỉ định. Để xem thêm các ví dụ về triển khai {@link
-  android.app.job.JobScheduler} , hãy xem <a href="{@docRoot}samples/JobScheduler/index.html">ứng dụng mẫu JobScheduler</a>.
-</p>
-
-<p>
-  Các ứng dụng sử dụng dịch vụ GMSCore, và nhắm đến Android 5.0 (API mức 21)
-  hoặc thấp hơn, có thể sử dụng <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-  {@code GcmNetworkManager}</a> và quy định {@code Task.NETWORK_STATE_UNMETERED}.
-</p>
-
-<h3 id="monitor-conn">
-  Theo dõi Kết nối Mạng Trong khi Ứng dụng đang Chạy
-</h3>
-
-<p>
-  Các ứng dụng đang chạy ở tiền cảnh vẫn có thể theo dõi {@code
-  CONNECTIVITY_CHANGE} bằng một{@link
-  android.content.BroadcastReceiver} đã đăng ký. Tuy nhiên, API {@link
-  android.net.ConnectivityManager} cung cấp phương thức yêu cầu lệnh gọi lại hiệu quả hơn
-  chỉ khi đáp ứng được các điều kiện được chỉ định.
-</p>
-
-<p>
-  Các đối tượng {@link android.net.NetworkRequest} định nghĩa các tham số của
-  lệnh gọi lại mạng xét về  {@link android.net.NetworkCapabilities}. Bạn
-  tạo các đối tượng {@link android.net.NetworkRequest} bằng lớp {@link
-  android.net.NetworkRequest.Builder NetworkRequest.Builder}. {@link
-  android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,
-  android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()}
-  rồi chuyển đối tượng{@link android.net.NetworkRequest} sang hệ thống. Khi
-  đáp ứng được các điều kiện mạng, ứng dụng nhận lệnh gọi lại để thực thi phương thức
-  {@link android.net.ConnectivityManager.NetworkCallback#onAvailable
-  onAvailable()} như được định nghĩa trong lớp {@link
-  android.net.ConnectivityManager.NetworkCallback} của nó.
-</p>
-
-<p>
-  Ứng dụng tiếp tục nhận lệnh gọi lại cho đến khi ứng dụng tồn tại hoặc nó gọi
-  {@link android.net.ConnectivityManager#unregisterNetworkCallback
-  unregisterNetworkCallback()}.
-</p>
-
-<h2 id="media-broadcasts">
-  Các hạn chế về NEW_PICTURE và NEW_VIDEO
-</h2>
-
-<p>
-  Trong N Developer Preview, ứng dụng không thể gửi hoặc nhận các truyền phát {@link
-  android.hardware.Camera#ACTION_NEW_PICTURE} hoặc {@link
-  android.hardware.Camera#ACTION_NEW_VIDEO}. Hạn chế này giúp
-  loại bỏ các tác động về hiệu suất và trải nghiệm của người dùng khi một số ứng dụng phải
-  thức dậy để xử lý một ảnh hoặc video mới. N Developer Preview
-  mở rộng {@link android.app.job.JobInfo} và {@link
-  android.app.job.JobParameters} để cung cấp một giải pháp thay thế.
-</p>
-
-<h3 id="new-jobinfo">
-  Các phương thức JobInfo Mới
-</h3>
-
-<p>
-  Để kích hoạt tác vụ khi thay đổi URI nội dung, N Developer Preview sẽ mở rộng
-  API{@link android.app.job.JobInfo} bằng các phương thức sau:
-</p>
-
-<dl>
-  <dt>
-    {@code JobInfo.TriggerContentUri()}
-  </dt>
-
-  <dd>
-    Gói gọn các tham số yêu cầu để kích hoạt tác vụ khi thay đổi URI nội dung.
-  </dd>
-
-  <dt>
-    {@code JobInfo.Builder.addTriggerContentUri()}
-  </dt>
-
-  <dd>
-    Chuyển một đối tượng {@code TriggerContentUri} đến {@link
-    android.app.job.JobInfo}. Một {@link android.database.ContentObserver}
-    sẽ theo dõi URI nội dung được gói gọn. Nếu có nhiều đối tượng {@code
-    TriggerContentUri} được liên kết với một tác vụ, hệ thống sẽ cung cấp
-    lệnh gọi lại ngay cả khi hệ thống báo cáo có sự thay đổi chỉ ở trong một trong những URI nội dung.
-  </dd>
-
-  <dd>
-    Thêm cờ {@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS} để
-    kích hoạt tác vụ nếu bất kỳ kế nhiệm nào của URI đã cho thay đổi. Cờ này
-    tương ứng với tham số {@code notifyForDescendants} đã chuyển đến {@link
-    android.content.ContentResolver#registerContentObserver
-    registerContentObserver()}.
-  </dd>
-</dl>
-
-<p class="note">
-  <strong>Lưu ý:</strong> {@code TriggerContentUri()} không thể được sử dụng
-  kết hợp với {@link android.app.job.JobInfo.Builder#setPeriodic
-  setPeriodic()} hoặc {@link android.app.job.JobInfo.Builder#setPersisted
-  setPersisted()}. Để tiếp tục theo dõi các thay đổi nội dung, hãy lên lịch một
-  {@link android.app.job.JobInfo} mới trước khi {@link
-  android.app.job.JobService} của ứng dụng hoàn thành xử lý lệnh gọi lại gần đây nhất.
-</p>
-
-<p>
-  Đoạn mã mẫu sau lên lịch kích hoạt một tác vụ khi hệ thống báo cáo
-  có sự thay đổi về URI nội dung, {@code MEDIA_URI}:
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-          (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo.Builder builder = new JobInfo.Builder(
-          MY_BACKGROUND_JOB,
-          new ComponentName(context, MediaContentJob.class));
-  builder.addTriggerContentUri(
-          new JobInfo.TriggerContentUri(MEDIA_URI,
-          JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
-  js.schedule(builder.build());
-}
-</pre>
-<p>
-  Khi hệ thống báo cáo có sự thay đổi trong (các) URI nội dung được chỉ định, ứng dụng của bạn
-  sẽ nhận được lệnh gọi lại và một đối tượng {@link android.app.job.JobParameters} được chuyển sang
-  phương thức {@link android.app.job.JobService#onStartJob onStartJob()}
-  trong {@code MediaContentJob.class}.
-</p>
-
-<h3 id="new-jobparam">
-  Các phương thức JobParameter Mới
-</h3>
-
-<p>
-  N Developer Preview cũng mở rộng {@link android.app.job.JobParameters} để
-  cho phép ứng dụng của bạn nhận thông tin hữu ích về những gì thẩm quyền nội dung
-  và các URI đã kích hoạt tác vụ:
-</p>
-
-<dl>
-  <dt>
-    {@code Uri[] getTriggeredContentUris()}
-  </dt>
-
-  <dd>
-    Trả về mảng URI đã kích hoạt tác vụ đó. Kết quả trả về có thể bằng {@code
-    null} nếu không có URI nào kích hoạt  tác vụ (ví dụ như, tác vụ đã được
-    kích hoạt do thời hạn hoặc lý do khác), hoặc số các URI
-    bị thay đổi nhiều hơn 50.
-  </dd>
-
-  <dt>
-    {@code String[] getTriggeredContentAuthorities()}
-  </dt>
-
-  <dd>
-    Trả về mảng xâu thẩm quyền nội dung đã kích hoạt tác vụ đó.
-    Nếu mảng được trả về không phải {@code null}, hãy dùng {@code getTriggeredContentUris()}
-    để truy xuất chi tiết về URI nào đã thay đổi.
-  </dd>
-</dl>
-
-<p>
-  Mã mẫu sau sẽ ghi đè lên phương thức {@link
-  android.app.job.JobService#onStartJob JobService.onStartJob()} và
-  và ghi lại các thẩm quyền nội dung và URI đã kích hoạt tác vụ.
-</p>
-
-<pre>
-&#64;Override
-public boolean onStartJob(JobParameters params) {
-  StringBuilder sb = new StringBuilder();
-  sb.append("Media content has changed:\n");
-  if (params.getTriggeredContentAuthorities() != null) {
-      sb.append("Authorities: ");
-      boolean first = true;
-      for (String auth :
-          params.getTriggeredContentAuthorities()) {
-          if (first) {
-              first = false;
-          } else {
-             sb.append(", ");
-          }
-           sb.append(auth);
-      }
-      if (params.getTriggeredContentUris() != null) {
-          for (Uri uri : params.getTriggeredContentUris()) {
-              sb.append("\n");
-              sb.append(uri);
-          }
-      }
-  } else {
-      sb.append("(No content)");
-  }
-  Log.i(TAG, sb.toString());
-  return true;
-}
-</pre>
-
-<h2 id="further-optimization">
-  Tối ưu hóa thêm Ứng dụng của bạn
-</h2>
-
-<p>
-  Tối ưu hóa ứng dụng của bạn để chạy trên các thiết bị có bộ nhớ ít, hoặc đang trong điều kiện
-  bộ nhớ ít có thể cải thiện hiệu suất và trải nghiệm của người dùng. Loại bỏ
-  các thành phần phụ thuộc trên các dịch vụ chạy ngầm và bộ thu truyền phát không biểu thị đã đăng ký tĩnh
-  có thể giúp ứng dụng của bạn chạy tốt hơn trên các thiết bị như vậy. Mặc dù
-  N Developer Preview thực hiện các bước để giảm bớt một vài trong số các vấn đề này, nhưng chúng tôi
-  khuyến nghị bạn nên tối ưu ứng dụng của bạn để chạy hoàn toàn không cần sử dụng
-  các tiến trình chạy ngầm này.
-</p>
-
-<p>
-  N Developer Preview giới thiệu một số lệnh <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge (ADB)</a> bổ sung mà
-  bạn có thể sử dụng để kiểm thử hành vi của ứng dụng bằng các tiến trình chạy ngầm đã bị vô hiệu hóa đó:
-</p>
-
-<ul>
-  <li>Để mô phỏng các điều kiện trong đó các truyền phát không biểu thị và dịch vụ chạy ngầm
-  không có sẵn, hãy nhập lệnh sau:
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore}
-</pre>
-  </li>
-
-  <li>Để kích hoạt lại các truyền phát không biểu thị và dịch vụ chạy ngầm, hãy nhập
-  lệnh sau:
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow}
-</pre>
-  </li>
-</ul>
\ No newline at end of file
diff --git a/docs/html-intl/intl/vi/preview/features/icu4j-framework.jd b/docs/html-intl/intl/vi/preview/features/icu4j-framework.jd
deleted file mode 100644
index ffb5799..0000000
--- a/docs/html-intl/intl/vi/preview/features/icu4j-framework.jd
+++ /dev/null
@@ -1,160 +0,0 @@
-page.title=API Khuôn khổ Android ICU4J
-page.tags=androidn
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>Trong tài liệu này:</h2>
-<ol>
-    <li><a href="#relation">Liên quan đến ICU4J</a></li>
-    <li><a href="#migration">Chuyển nhập từ ICU4J sang API android.icu</a></li>
-    <li><a href="#licence">Cấp phép</a></li>
-</ol>
-
-<h2>Xem thêm</h2>
-<ol>
-  <li>
-    <a class="external-link" href="http://userguide.icu-project.org">Tài liệu cho ICU4J</a>
-  </li>
-
-  <li>
-    <a class="external-link" href="http://site.icu-project.org/#TOC-What-is-ICU-">Các tiêu chuẩn mới nhất được ICU4J
-   hỗ trợ</a>
-  </li>
-</ol>
-</div>
-</div>
-
-<p>
-  ICU4J là bộ thư viện Java mã nguồn mở được sử dụng rộng rãi để cung cấp hỗ trợ Unicode
-  và toàn cầu hóa cho các ứng dụng phần mềm. Android N
-  cung cấp một tập nhỏ các API ICU4J trong khuôn khổ Android cho các nhà phát triển ứng dụng
-   sử dụng trong gói {@code android.icu}. Các API này sử dụng
-   dữ liệu bản địa hóa có trong thiết bị. Do đó, bạn có thể giảm kích thước tệp APK
-   bằng cách không biên dịch các thư viện ICU4J vào tệp APK; thay vào đó bạn có thể
-  gọi chúng trong khuôn khổ một cách đơn giản. (Trong trường hợp này, bạn có thể muốn cung cấp
-   <a href="{@docRoot}google/play/publishing/multiple-apks.html">nhiều phiên bản
-   tệp APK</a> để những người dùng chạy phiên bản Android thấp hơn Android N
-  có thể tải phiên bản ứng dụng có chứa các thư viện ICU4J.)
-</p>
-
-<p>
-  Tài liệu này sẽ bắt đầu bằng việc cung cấp thông tin cơ bản về các mức Android API
-  tối thiểu cần để hỗ trợ các thư viện này. Sau đó tài liệu sẽ giải thích những gì
-   bạn cần để hiểu được công việc triển khai ICU4J liên quan cụ thể đến Android. Cuối cùng,
-    tài liệu sẽ cho bạn biết cách sử dụng các API ICU4J trong khuôn khổ Android.
-</p>
-
-<h2 id="relation">Liên quan đến ICU4J</h2>
-
-<p>
-  Android N cung cấp một tập nhỏ các API ICU4J thông qua
-  gói <code>android.icu</code> thay vì gói <code>com.ibm.icu</code>.
-Khuôn khổ Android có thể chọn không
-   cung cấp các API ICU4J vì nhiều lý do; ví dụ, Android N không cung cấp
-   một số API bị loại bỏ hoặc những API chưa được đội ngũ ICU công bố là
-   bản ổn định. Vì nhóm ICU sẽ loại bỏ các API này trong tương lai do đó Android cũng sẽ đánh dấu
-   chúng là bị loại bỏ nhưng vẫn tiếp tục thêm vào.
-</p>
-
-<p class="table-caption"><strong>Bảng 1.</strong> Các phiên bản ICU và CLDR được sử dụng
-  trong Android N.</p>
-<table>
-<tr>
-<th>Mức Android API</th>
-<th>Phiên bản ICU</th>
-<th>Phiên bản CLDR</th>
-</tr>
-<tr>
-<td>Android N</td>
-<td>56</td>
-<td>28</td>
-</tr>
-</table>
-
-<p>Sau đây là một vài lưu ý quan trọng:</p>
-
-<ul>
-<li>Các API khuôn khổ Android ICU4J không có tất cả các API của ICU4J.</li>
-<li>Các nhà phát triển NDK cần biết rằng ICU4C Android không được hỗ trợ.</li>
-<li>Các API trong khuôn khổ Android không thay thế hỗ trợ của Android cho
-<a href="{@docRoot}guide/topics/resources/localization.html">việc bản địa hóa bằng
-các tài nguyên</a>.</li>
-</ul>
-
-<h2 id="migration">Chuyển nhập sang gói android.icu từ com.ibm.icu</h2>
-
-<p>
-  Nếu bạn đã sử dụng các API ICU4J trong ứng dụng và
-   các API <code>android.icu</code> đáp ứng yêu cầu của bạn thì việc chuyển nhập sang
-  các API của khuôn khổ đòi hỏi bạn phải thay đổi thành phần nhập vào của Java
-  từ <code>com.ibm.icu</code> sang <code>android.icu</code>. Khi đó bạn có thể
-  xóa các tệp ICU4J của bạn khỏi tệp APK.
-</p>
-
-<p class="note">
-  <b>Lưu ý</b>: Các API khuôn khổ ICU4J sử dụng không gian tên {@code android.icu}
-  thay vì {@code com.ibm.icu}. Điều này là để tránh xung đột
-  không gian tên trong các tệp APK có chứa các thư viện {@code com.ibm.icu} của riêng chúng.
-</p>
-
-<h3 id="migrate-from-android">
-  Chuyển nhập sang các API android.icu từ các API Android SDK khác
-</h3>
-
-<p>
-  Một số lớp trong gói <code>java</code> và<code>android</code> có
-  các lớp tương ứng với các lớp trong ICU4J. Tuy nhiên, ICU4J thường cung cấp hỗ trợ
-   rộng hơn cho các tiêu chuẩn và ngôn ngữ.
-</p>
-<p>Sau đây là một số ví dụ để giúp bạn bắt đầu:</p>
-<table>
-<tr>
-<th>Lớp</th>
-<th>Thay thế</th>
-</tr>
-<tr>
-<td><code>java.lang.Character</code> </td>
-<td><code>android.icu.lang.UCharacter</code> </td>
-</tr>
-<tr>
-<td><code>java.text.BreakIterator</code> </td>
-<td><code>android.icu.text.BreakIterator</code> </td>
-</tr>
-<tr>
-<td><code>java.text.DecimalFormat</code> </td>
-<td><code>android.icu.text.DecimalFormat</code> </td>
-</tr>
-<tr>
-<td><code>java.util.Calendar</code></td>
-<td>
-<code>android.icu.util.Calendar</code></td>
-</tr>
-<tr>
-<td><code>android.text.BidiFormatter</code>
- </td>
-<td><code>android.icu.text.Bidi</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateFormat</code>
- </td>
-<td><code>android.icu.text.DateFormat</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateUtils</code> </td>
-<td><code>android.icu.text.DateFormat</code>
-<code>android.icu.text.RelativeDateTimeFormatter</code>
-</td>
-</tr>
-</table>
-
-<h2 id="licence">Cấp phép</h2>
-
-<p>
-  ICU4J được phát hành theo giấy phép ICU. Hãy xem <a class="external-link" href="http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-">Hướng dẫn sử dụng
-  ICU</a> để biết thêm chi tiết.
-</p>
diff --git a/docs/html-intl/intl/vi/preview/features/multilingual-support.jd b/docs/html-intl/intl/vi/preview/features/multilingual-support.jd
deleted file mode 100644
index 94a7127..0000000
--- a/docs/html-intl/intl/vi/preview/features/multilingual-support.jd
+++ /dev/null
@@ -1,217 +0,0 @@
-page.title=Ngôn ngữ và Bản địa
-page.tags=androidn
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>Trong tài liệu này:</h2>
-<ol>
-	  <li><a href="#preN">Thử thách phân giải tài nguyên ngôn ngữ</a></li>
-    <li><a href="#postN">Các cải tiến đối với Chiến lược phân giải tài nguyên</a></li>
-    <li><a href="#design">Thiết kế ứng dụng để hỗ trợ các bản địa
-      bổ sung</a></li>
-
-</ol>
-
-</div>
-</div>
-
-<p>Android N cung cấp hỗ trợ cải tiến cho người dùng sử dụng nhiều ngôn ngữ,
-cho phép họ chọn nhiều bản địa trong phần cài đặt. Android N
-cung cấp khả năng này bằng cách mở rộng số lượng lớn các bản địa được hỗ trợ
-và thay đổi cách hệ thống phân giải tài nguyên. Phương thức phân giải tài nguyên
-mới hoạt động mạnh mẽ hơn và được thiết kế để tương thích với các tệp APK có sẵn. Tuy nhiên
-bạn cần kiểm tra thêm để phát hiện mọi hành vi không mong muốn. Ví dụ, bạn
-cần kiểm thử để đảm bảo rằng ứng dụng của mình sẽ thiết lập mặc định cho ngôn ngữ mong muốn. Ngoài ra,
-nếu ứng dụng của bạn hỗ trợ đa ngôn ngữ thì bạn cần đảm bảo rằng việc hỗ trợ này hoạt động như
-dự kiến. Cuối cùng, bạn cần cố gắng đảm bảo rằng ứng dụng sẽ xử lý tinh tế
-những ngôn ngữ mà bạn không có ý định thiết kế ứng dụng để hỗ trợ.</p>
-
-<p>Tài liệu này sẽ bắt đầu bằng việc giải thích về chiến lược phân giải tài nguyên trong phiên bản trước
-Android N. Tiếp theo, tài liệu sẽ mô tả chiến lược phân giải tài nguyên
-được cải tiến của Android N. Cuối cùng, tài liệu sẽ giải thích cách sử dụng
-số lượng các bản địa được mở rộng để hỗ trợ thêm nhiều người dùng đa ngữ.</p>
-
-<h2 id="preN">Thử thách phân giải tài nguyên ngôn ngữ</h2>
-
-<p>Trước Android N, không phải lúc nào Android cũng có thể so khớp
-thành công ứng dụng với các bản địa của hệ thống. Ví dụ, giả sử ngôn ngữ mặc định của ứng dụng của bạn
-  là Tiếng Anh (Mỹ) nhưng ứng dụng cũng có các xâu văn bản Tiếng Tây Ban Nha được bản địa hóa trong các tệp tài nguyên {@code es_ES}
-.</p>
-<p>Khi mã nguồn Java tham chiếu đến các xâu đó thì nó sẽ phân giải các ngôn ngữ của xâu như
-sau:</p>
-<ul>
-<li>Nếu một thiết bị được đặt thành {@code es_MX} (Tiếng Tây Ban Nha-Mêxicô) thì Android sẽ tải
-xâu từ các tệp tài nguyên {@code es_ES}.</li>
-<li>Nếu thiết bị được đặt thành {@code en_AU} thì Android sẽ trả về {@code
-en_US}. Hệ thống cũng sẽ đặt mặc định thành {@code en_US} nếu người dùng chọn một
-ngôn ngữ mà ứng dụng không hỗ trợ chút nào, ví dụ như Tiếng Pháp.</li>
-</ul>
-
-
-<p>Các vấn đề phân giải này phát sinh bởi vì hệ thống sẽ gỡ mã quốc gia
- khỏi bản địa nếu nó không tìm thấy sự trùng khớp tuyệt đối.  Ví dụ:</p>
-<p class="table-caption" id="t-resource-res">
-<strong>Bảng 1.</strong> Phân giải tài nguyên không có trùng khớp bản địa tuyệt đối.
-</p>
-<table>
-<tbody>
-<tr>
-<th>Cài đặt Người dùng</th>
-<th>Tài nguyên Ứng dụng</th>
-<th>Phân giải tài nguyên</th>
-</tr>
-<tr>
-<td>fr_CH</td>
-<td>
-mặc định (en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
- <td>
-Thử fr_CH =&gt; Không được<br>
-Thử fr =&gt; Không được<br>
-Sử dụng mặc định (en)
-</td>
- </tr>
- </tbody>
-</table>
-
-
-<p>Trong ví dụ này, hệ thống hiển thị các xâu Tiếng Anh mà không
-xác định được liệu người dùng có biết Tiếng Anh hay không. Đây là hành vi khá phổ biến
-ngày nay. Android N cần phải giảm bớt đáng kể tần suất
-của những kết quả như vậy.</p>
-
-<h2 id="postN">Các cải tiến đối với Chiến lược phân giải tài nguyên</h2>
-<p>Android N mang đến cách thức phân giải tài nguyên mạnh mẽ hơn, và
-tìm các giải pháp thay thế hiệu quả hơn một cách tự động. Tuy nhiên, để tăng tốc việc phân giải và nâng cao
-khả năng bảo trì, bạn cần lưu trữ các tài nguyên trong những nhánh ngôn ngữ mẹ phổ biến nhất.
- Ví dụ, nếu trước đây lưu tài nguyên Tiếng Tây Ban Nha trong thư mục {@code es-US}
- thì hãy chuyển chúng vào trong thư mục {@code es-419}, nơi chứa Tiếng Tây Ban Nha Mỹ La-tinh.
- Tương tự, nếu bạn có các xâu tài nguyên trong một thư mục có tên {@code en-GB} thì hãy đổi tên
- thư mục đó thành {@code en-001} (Tiếng Anh quốc tế) bởi vì nhánh mẹ
-phổ biến nhất cho chuỗi <code>en-GB</code> là {@code en-001}.
- Các ví dụ sau sẽ giải thích tại sao các thực hành này sẽ nâng cao hiệu năng và
-độ ổn định của việc phân giải tài nguyên.</p>
-
-<h3>Các ví dụ về phân giải tài nguyên</h3>
-
-<p>Với Android N, trường hợp được mô tả trong <strong>Bảng 1</strong> được phân giải
-theo cách khác:</p>
-
-<p class="table-caption" id="t-improved-res">
-<strong>Bảng 2.</strong> Một chiến lược phân giải cải tiến khi không có
-trùng khớp bản địa tuyệt đối.</p>
-<table>
-<tr>
-<th>Cài đặt Người dùng</th>
-<th>Tài nguyên Ứng dụng</th>
-<th>Phân giải tài nguyên</th>
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-</ol>
-</td>
-<td>
-mặc định (en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
-<td>
-Thử fr_CH =&gt; Không được<br>
-Thử fr =&gt; Không được<br>
-Thử nhánh con của fr =&gt; fr_FR<br>
-Sử dụng fr_FR
-</td>
-</tr>
-
-</table>
-
-
-<p>Bây giờ thì người dùng sẽ nhận được tài nguyên Tiếng Pháp thay vì Tiếng Anh. Ví dụ này cũng cho thấy
- lý do bạn nên lưu trữ các xâu Tiếng Pháp trong {@code fr} thay vì {@code fr_FR}
- cho Android N. Phương pháp ở đây là ghép nhánh ngôn ngữ mẹ gần nhất,
- giúp cho việc phân giải nhanh hơn và dễ dự đoán hơn.</p>
-
-<p>Ngoài lôgic phân giải được cải tiến này, Android giờ đây cung cấp thêm nhiều
-ngôn ngữ cho người dùng lựa chọn. Chúng ta hãy thử lại ví dụ trên với Tiếng Ý
-  được xác định là một ngôn ngữ người dùng bổ sung nhưng không được ứng dụng hỗ trợ cho Tiếng Pháp.  </p>
-
-<p class="table-caption" id="t-2d-choice">
-<strong>Bảng 3.</strong> Phân giải tài nguyên khi ứng dụng chỉ khớp
-với cài đặt bản địa được ưu tiên thứ hai của người dùng.</p>
-<table>
-<tr>
-<th>Cài đặt Người dùng</th>
-<th>Tài nguyên Ứng dụng</th>
-<th>Phân giải tài nguyên</th>
-
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-<li> it_CH</li>
-</ol>
-</td>
-<td>
-mặc định (en)<br>
-de_DE<br>
-es_ES<br>
-it_IT<br>
-</td>
-<td>
-Thử fr_CH =&gt; Không được<br>
-Thử fr =&gt; Không được<br>
-Thử nhánh con của fr =&gt; Không được<br>
-Thử it_CH =&gt; Không được<br>
-Thử it =&gt; Không được<br>
-Thử nhánh con của it =&gt; it_IT<br>
-Sử dụng it_IT
-</td>
-
-</tr>
-
-</table>
-<p>Người dùng vẫn nhận được ngôn ngữ họ biết mặc dù ứng dụng không
-hỗ trợ Tiếng Pháp.</p>
-
-
-<h2 id="design">Thiết kế ứng dụng để hỗ trợ các bản địa bổ sung</h2>
-<h3>API LocaleList</h3>
-
-<p>Android N bổ sung thêm một API {@code LocaleList.GetDefault()}
- mới cho phép các ứng dụng truy vấn trực tiếp danh sách các ngôn ngữ mà người dùng đã chỉ định. API này
-cho phép bạn tạo hành vi ứng dụng
-phức tạp hơn và hiển thị nội dung được tối ưu hóa tốt hơn. Ví dụ, Tìm kiếm
-  có thể hiển thị các kết quả bằng nhiều ngôn ngữ dựa trên cài đặt của người dùng.  Các ứng dụng trình duyệt
-  có thể tránh đề nghị dịch trang web sang một ngôn ngữ mà người dùng đó đã biết,
- và các ứng dụng bàn phím có thể tự động bật tất cả các bố trí phù hợp. </p>
-
-<h3>Bộ định dạng</h3>
-
-<p>Tính tới Android 6.0 (API mức 23), Android 6.0 chỉ hỗ trợ một hoặc hai bản địa
-cho nhiều ngôn ngữ phổ biến
-(en, es, ar, fr, ru). Bởi vì chỉ có một vài biến thể của từng ngôn ngữ,
-các ứng dụng không gặp vấn đề gì với việc lưu trữ một số chữ số và ngày tháng dưới dạng xâu được chèn trực tiếp khi viết mã
-trong các tệp tài nguyên.  Tuy nhiên, với tập hợp mở rộng các bản địa được hỗ trợ bởi Android,
-có thể có
-nhiều khác biệt lớn về các định dạng ngày tháng, thời gian, tiền tệ và thông tin
-tương tự ngay cả trong một bản địa. Chèn trực tiếp các định dạng có thể khiến
-người dùng cuối bối rối.  Do đó, khi phát triển cho Android N
-hãy đảm bảo sử dụng các bộ định dạng thay vì các xâu chữ số và ngày tháng được chèn trực tiếp khi viết mã.</p>
-
-<p>Một ví dụ điển hình là Tiếng Ả-rập với được Android N hỗ trợ mở rộng từ
-một {@code ar_EG} tới 27 bản địa Tiếng Ả-rập. Các bản địa này có thể chia sẻ hầu hết các tài nguyên,
-nhưng một số bản địa ưu tiên chữ số ASCII trong khi những bản địa khác lại ưu tiên con số truyền thống. Ví dụ,
-khi bạn muốn soạn một câu có biến bằng số, như
-"Choose a 4 digit pin" thì bạn hãy sử dụng bộ định dạng như sau:</p>
-
-<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>
diff --git a/docs/html-intl/intl/vi/preview/features/notification-updates.jd b/docs/html-intl/intl/vi/preview/features/notification-updates.jd
deleted file mode 100644
index f60646a..0000000
--- a/docs/html-intl/intl/vi/preview/features/notification-updates.jd
+++ /dev/null
@@ -1,328 +0,0 @@
-page.title=Thông báo
-page.tags=notifications
-helpoutsWidget=true
-page.image=/preview/images/notifications-card.png
-
-trainingnavtop=true
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-
-<!-- table of contents -->
-<h2>Tài liệu này gồm có</h2>
-<ol>
-  <li><a href="#direct">Trả lời Trực tiếp</a></li>
-  <li><a href="#bundle">Thông báo Gộp</a></li>
-  <li><a href="#custom">Dạng xem Tùy chỉnh</a></li>
-</ol>
-
-</div>
-</div>
-
-<p>Android N giới thiệu một số API mới cho phép ứng dụng đăng
-các thông báo có khả năng hiển thị và tương tác cao.</p>
-
-<p>Android N mở rộng API thông báo {@link android.support.v4.app.RemoteInput}
-hiện có để hỗ trợ trả lời giữa dòng trên thiết bị cầm tay. Tính năng này cho phép người dùng
- phản hồi nhanh chóng từ khu vực hiển thị thông báo mà không cần truy cập ứng dụng của bạn.</p>
-
-<p>
-  Android N cũng cho phép bạn gộp các thông báo tương tự nhau để
-  xuất hiện dưới dạng một thông báo đơn lẻ. Để điều này có thể xảy ra, Android N sử dụng phương thức {@link
-  android.support.v4.app.NotificationCompat.Builder#setGroup
-  NotificationCompat.Builder.setGroup()} hiện có. Người dùng có thể mở rộng mỗi
-  thông báo, và thực hiện các hành động như trả lời và bỏ qua trên mỗi
-  thông báo, từng thông báo một từ khu vực hiển thị thông báo.
-</p>
-
-<p>Cuối cùng, Android N cũng thêm các API mới cho phép bạn tận dụng các trang trí
-của hệ thống trong các dạng xem thông báo tùy chỉnh của ứng dụng của bạn. Các API này giúp
-đảm bảo rằng dạng xem thông báo có chung một cách trình bày nhất quán
-với các mẫu tiêu chuẩn.</p>
-
-<p>Tài liệu này nêu bật một số các thay đổi chính mà bạn cần cân nhắc
- khi sử dụng các tính năng thông báo mới trong ứng dụng của mình.</p>
-
-<h2 id="direct">Trả lời Trực tiếp</h2>
-
-<p>Với tính năng Trả lời Trực tiếp trong Android N, người dùng có thể
-phản hồi lại tin nhắn văn bản hoặc cập nhật danh sách tác vụ trực tiếp trong giao diện
-của thông báo. Trên thiết bị cầm tay, hành động trả lời giữa dòng xuất hiện dưới dạng một nút bổ sung
- được gắn kèm với thông báo đó. Khi người dùng trả lời qua bàn phím, hệ thống sẽ đính kèm
-  phản hồi bằng văn bản với ý định
-    bạn đã quy định cho hành động thông báo và gửi ý định đến ứng dụng cầm tay
-     của bạn.
-
-
-<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
-  {@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
-<p class="img-caption">
-  <strong>Hình 1.</strong> Android N thêm nút hành động <strong>Reply</strong>
-.
-</p>
-
-<h3>Thêm các hành động trả lời giữa dòng</h3>
-
-<p>Để tạo một hành động thông báo hỗ trợ trả lời trực tiếp:
-</p>
-
-<ol>
-<li>Tạo thực thể{@link android.support.v4.app.RemoteInput.Builder}
-  mà bạn có thể thêm vào hành động
-thông báo của bạn. Hàm dựng của lớp này sẽ chấp nhận xâu mà hệ thống sử dụng làm khóa
- cho nhập liệu văn bản. Sau đó, ứng dụng cầm tay của bạn sử dụng khóa đó để truy xuất văn bản
-  nhập liệu.
-
-<pre>
-// Key for the string that's delivered in the action's intent
-private static final String KEY_TEXT_REPLY = "key_text_reply";
-String replyLabel = getResources().getString(R.string.reply_label);
-RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
-        .setLabel(replyLabel)
-        .build();
-</pre>
-</li>
-<li>Đính kèm đối tượng {@link android.support.v4.app.RemoteInput}
- với một hành động bằng cách sử dụng <code>addRemoteInput()</code>.
-
-<pre>
-// Create the reply action and add the remote input
-Notification.Action action =
-        new Notification.Action.Builder(R.drawable.ic_reply_icon,
-                getString(R.string.label), replyPendingIntent)
-                .addRemoteInput(remoteInput)
-                .build();
-</pre>
-</li>
-
-<li>Áp dụng hành động cho thông báo và phát hành thông báo.
-
-<pre>
-// Build the notification and add the action
-Notification notification =
-        new Notification.Builder(mContext)
-                .setSmallIcon(R.drawable.ic_message)
-                .setContentTitle(getString(R.string.title))
-                .setContentText(getString(R.string.content))
-                .addAction(action))
-                .build();
-
-// Issue the notification
-NotificationManager notificationManager =
-        NotificationManager.from(mContext);
-notificationManager.notify(notificationId, notification);
-
-</pre>
-</li>
-
-</ol>
-
-
-<p> Hệ thống sẽ nhắc người dùng nhập liệu một phản hồi khi chúng kích hoạt
-hành động thông báo. </p>
-
-<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
-    {@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>Hình 2.</strong> Người dùng nhập liệu văn bản từ khu vực hiển thị thông báo.
-</p>
-
-<h3>Truy xuất mục nhập của người dùng từ trả lời giữa dòng</h3>
-
-<p>Để nhận mục nhập của người dùng từ giao diện thông báo đến hoạt động bạn
-đã khai báo trong ý định của hành động trả lời:</p>
-<ol>
-<li> Gọi {@link android.support.v4.app.RemoteInput#getResultsFromIntent
-  getResultsFromIntent()} bằng cách chuyển ý định của hành động thông báo dưới dạng
- tham số đầu vào. Phương thức này trả về {@link android.os.Bundle}
- có chứa phản hồi văn bản.
-</li>
-
-<pre>
-Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-</pre>
-
-<li>Truy vấn gói bằng cách sử dụng khóa kết quả (đã cung cấp cho hàm dựng {@link
-  android.support.v4.app.RemoteInput.Builder}).
-</li>
-</ol>
-
-<p>Đoạn mã sau minh họa cách thức một phương thức truy xuất văn bản đầu vào
-từ một gói:</p>
-
-<pre>
-// Obtain the intent that started this activity by calling
-// Activity.getIntent() and pass it into this method to
-// get the associated string.
-
-private CharSequence getMessageText(Intent intent) {
-    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-    if (remoteInput != null) {
-            return remoteInput.getCharSequence(KEY_TEXT_REPLY);
-            }
-    return null;
- }
-</pre>
-
-<p>Ứng dụng có thể áp dụng lô-gic để quyết định hành động nào nên lấy trên văn bản
-được truy xuất.
-Đối với các ứng dụng tương tác (chẳng hạn như trò chuyện), hãy cung cấp thêm ngữ cảnh trong chính thông báo
- (ví dụ như nhiều dòng lịch sử trò chuyện, gồm có các tin nhắn của riêng người dùng)
-  để người dùng có thể phản hồi phù hợp.
-Khi người dùng phản hồi qua {@link android.support.v4.app.RemoteInput},
- hãy bao gồm văn bản trong lịch sử trả lời bằng phương thức {@code setRemoteInputHistory()}
-.</p>
-
-<h2 id="bundle">Thông báo Gộp</h2>
-
-<p>Android N cung cấp cho các nhà phát triển một cách mới để hiển thị
- hàng đợi thông báo: <i>thông báo gộp</i>. Cách hiển thị này tương tự với tính năng
-  <a href="{@docRoot}training/wearables/notifications/stacks.html">Ngăn xếp
-  Thông báo</a> có trong Android Wear. Ví dụ, nếu ứng dụng của bạn tạo thông báo
-  cho tin nhắn nhận được, khi có nhiều hơn một tin nhắn nhận được, hãy gói
- các thông báo lại với nhau thành một nhóm đơn lẻ. Bạn có thể
- sử dụng phương thức {@link android.support.v4.app.NotificationCompat.Builder#setGroup
-Builder.setGroup()} hiện có để gói các thông báo tương tự.</p>
-
-<p>
-  Nhóm thông báo sẽ quy định phân cấp trên các thông báo bao gồm nó.
-  Ở trên cùng của phân cấp là thông báo mẹ hiển thị tóm tắt
-  thông tin cho nhóm đó. Người dùng có thể mở rộng
-  nhóm thông báo tăng dần lên, và hệ thống sẽ hiển thị thêm thông tin khi
-  người dùng truy sâu hơn. Khi người dùng mở rộng gói này, hệ thống sẽ lộ ra thêm
-  thông tin cho tất cả các thông báo con của gói, khi người dùng
-  mở rộng một trong những thông báo đó, hệ thống sẽ lộ ra toàn bộ nội dung của nó.
-</p>
-
-<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
-          {@docRoot}preview/images/bundles_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>Hình 3.</strong> Người dùng có thể mở rộng nhóm
-  thông báo tăng dần lên.
-</p>
-
-<p>Để tìm hiểu cách thêm thông báo vào một nhóm, xem
-<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">Thêm
-Mỗi Thông báo vào một Nhóm</a>.</p>
-
-
-<h3 id="best-practices">Thực hành tốt nhất cho thông báo gộp</h3>
-<p>Mục này sẽ cung cấp hướng dẫn về việc khi nào sử dụng nhóm thông báo thay vì
- các thông báo{@link android.app.Notification.InboxStyle InboxStyle}
-có sẵn trong các phiên bản cũ hơn của
-nền tảng Android.</p>
-
-<h3>Khi nào nên sử dụng thông báo gộp</h3>
-
-<p>Bạn nên sử dụng các nhóm thông báo chỉ khi tất cả các điều kiện sau là
-đúng đối với trường hợp sử dụng của bạn:</p>
-
-<ul>
-  <li>Thông báo con là loại thông báo đầy đủ và có thể được hiển thị
-   riêng rẽ mà không cần tóm tắt nhóm.</li>
-  <li>Sẽ có lợi khi làm nổi lên các thông báo con một cách riêng rẽ. Ví
-dụ:
-  </li>
-  <ul>
-    <li>Các thông báo này có thể hành động được, bằng các hành động cụ thể cho mỗi thông báo con.</li>
-    <li>Có nhiều thông tin hơn đối với thông báo con mà người dùng sẽ muốn đọc.</li>
-  </ul>
-</ul>
-
-<p>Các ví dụ về các trường hợp sử dụng tốt nhóm thông báo bao gồm: ứng dụng nhắn tin
-hiển thị danh sách các tin nhắn đến, hoặc ứng dụng email hiển thị danh sách
-các email đã nhận được.</p>
-
-<p>
-Ví dụ về các trường hợp trong đó một thông báo đơn lẻ được ưu tiên
- bao gồm tin nhắn riêng từ một người đơn lẻ, hoặc biểu diễn danh sách
- các mục văn bản một hàng. Bạn có thể sử dụng
-({@link android.app.Notification.InboxStyle InboxStyle} hoặc
-{@link android.app.Notification.BigTextStyle BigTextStyle}) để hoàn thành
-việc này.
-</p>
-
-<h3 id ="post">Hiển thị Thông báo gộp</h3>
-
-<p>
-  Ứng dụng sẽ luôn đăng tóm tắt nhóm, ngay cả khi nhóm chỉ chứa
-  một thông báo con duy nhất. Hệ thống này sẽ ngăn chặn tóm tắt và hiển thị trực tiếp
-  thông báo con nếu nó chỉ chứa một thông báo duy nhất. Điều này đảm bảo
-  rằng hệ thống có thể cung cấp một trải nghiệm nhất quán khi người dùng trượt nhanh khỏi
-  thông báo con của nhóm.
-</p>
-
-<p class="note">
-  <strong>Lưu ý:</strong> Phiên bản Android N này không
-  ngăn chặn tóm tắt cho nhóm thông báo có chứa một thông báo con duy nhất. Chức năng
-  này sẽ được thêm vào trong phiên bản sau của Android N.
-</p>
-
-<h3>Thông báo lướt nhanh</h3>
-
-<p>Trong khi hệ thống thường hiển thị các thông báo con dưới dạng một nhóm, bạn có thể đặt
- chúng tạm thời hiển thị dưới dạng
- <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">
- thông báo cảnh báo</a>. Tính năng này đặc biệt hữu ích bởi vì nó cho phép
-  truy cập ngay lập tức thông báo con gần đây nhất và các hành động liên kết với thông báo con đó.
-</p>
-
-
-<h3>Tính tương thích ngược</h3>
-
-<p>
-  Cả nhóm thông báo và đầu vào từ xa đều là một phần của API {@link
-  android.app.Notification} vì Android 5.0 (API mức 21) hỗ trợ
-  các thiết bị Android Wear. Nếu bạn đã dựng các thông báo bằng các API này,
-  hành động duy nhất bạn cần phải thực hiện là xác minh rằng ứng dụng có hành vi tương ứng
-  với các hướng dẫn đã mô tả ở trên, và cân nhắc việc triển khai {@code
-  setRemoteInputHistory()}.
-</p>
-
-<p>
-  Để hỗ trợ tính tương thích ngược, các API giống vậy sẽ được cung cấp cho
-  lớp {@link android.support.v4.app.NotificationCompat}
-  của thư viện hỗ trợ, cho phép bạn dựng các thông báo hoạt động trên các phiên bản
-  Android cũ hơn. Trên máy tính bảng và thiết bị cầm tay, người dùng chỉ nhìn thấy thông báo tóm tắt,
-  vì vậy ứng dụng vẫn có kiểu hòm thư hoặc thông báo tương tự
-  biểu diễn cho toàn bộ nội dung thông tin của nhóm. Vì các thiết bị Android
-  Wear cho phép người dùng xem các thông báo con thậm chí trên
-  các mức nền tảng thấp hơn, bạn nên dựng các thông báo con dù cho mức API
-  là mức nào.
-</p>
-
-<h2 id="custom"> Dạng xem Tùy chỉnh</h2>
-<p>Bắt đầu từ Android N, bạn có thể tùy chỉnh dạng xem và
-vẫn có các trang trí hệ thống như tiêu đề thông báo, hành động, và
-các bố trí mở rộng được.</p>
-
-<p>Để kích hoạt khả năng này, Android N thêm các API sau để tạo kiểu cho dạng xem tùy chỉnh
-  của bạn:</p>
-
-<dl>
-<dt>
-{@code DecoratedCustomViewStyle()}</dt>
-<dd> Thông báo kiểu khác với thông báo
-media.</dd>
-<dt>
-{@code DecoratedMediaCustomViewStyle()}</dt>
-<dd> Thông báo media tạo kiểu.</dd>
-</dl>
-
-<p>Để sử dụng API mới này, hãy gọi phương thức {@code setStyle()}, chuyển nó sang
-kiểu dạng xem tùy chỉnh mong muốn.</p>
-
-<p>Đoạn mã này cho biết cách dựng đối tượng thông báo tùy chỉnh bằng phương thức
-{@code DecoratedCustomViewStyle()}.</p>
-
-<pre>
-Notification noti = new Notification.Builder()
-           .setSmallIcon(R.drawable.ic_stat_player)
-           .setLargeIcon(albumArtBitmap))
-           .setCustomContentView(contentView);
-           .setStyle(new Notification.DecoratedCustomViewStyle())
-           .build();
-
-</pre>
diff --git a/docs/html-intl/intl/zh-cn/about/versions/nougat/android-7.0-testing.jd b/docs/html-intl/intl/zh-cn/about/versions/nougat/android-7.0-testing.jd
deleted file mode 100644
index d1e1187..0000000
--- a/docs/html-intl/intl/zh-cn/about/versions/nougat/android-7.0-testing.jd
+++ /dev/null
@@ -1,190 +0,0 @@
-page.title=测试指南
-page.image=images/cards/card-n-guide_2x.png
-meta.tags="preview", "testing"
-page.tags="preview", "developer preview"
-
-@jd:body
-
-<div id="tb-wrapper">
-  <div id="tb">
-    <h2>本文内容</h2>
-      <ol>
-        <li><a href="#runtime-permissions">测试权限</a></li>
-        <li><a href="#doze-standby">测试低电耗模式和应用待机模式</a></li>
-        <li><a href="#ids">自动备份和设备标识符</a></li>
-      </ol>
-  </div>
-</div>
-
-<p>
-  利用 Android N,您有机会确保应用可使用下一平台版本。
-如 <a href="{@docRoot}preview/api-overview.html">API 概览</a>和<a href="{@docRoot}preview/behavior-changes.html">行为变更</a>中所述,该 Preview 包括大量 API 和可能影响应用的行为变更。
-
-使用 Preview 测试应用时,您应重点关注一些特定的系统变更,确保用户拥有愉悦的体验。
-
-
-</p>
-
-<p>
-  本指南介绍可使用您的应用测试 Preview 的哪些功能以及如何测试。您应确定优先测试以下特定 Preview 功能,因为它们可能会对应用行为产生较大影响。
-
-
-</p>
-
-<ul>
-  <li><a href="#runtime-permissions">权限</a>
-  </li>
-  <li><a href="#doze-standby">低电耗模式和应用待机模式</a>
-  </li>
-  <li><a href="#ids">自动备份和设备标识符</a></li>
-</ul>
-
-<p>
-  如需了解有关如何使用 Preview 系统映像设置设备或虚拟设备以进行测试的详细信息,请参阅<a href="{@docRoot}preview/setup-sdk.html">设置 Android N SDK</a>。
-
-
-</p>
-
-
-<h2 id="runtime-permissions">测试权限</h2>
-
-<p>
-  新<a href="{@docRoot}preview/features/runtime-permissions.html">权限</a>模型改变了用户向您的应用分配权限的方式。
-您的应用必须在运行时要求用户提供各项权限,而不是在安装过程中要求授予所有权限。
-
-对于用户而言,此行为有助于他们更精细地控制每个应用的 Activity,并更深入地了解应用为何请求提供特定权限的上下文信息。
-用户可以随时向应用授予某项权限或撤销其某项权限。
-预览版的这种功能最有可能会对应用行为产生影响,而且可能会阻止某些应用功能运行或只能在降级状态中运行。
-
-
-</p>
-
-<p class="caution">
-  这一变更会影响在新平台上运行的所有应用,即便这些应用并非面向新平台版本开发亦是如此。
-该平台为旧版应用提供有限的兼容性行为,但您现在应当开始计划将应用迁移到新权限模型,以便在官方平台启动时发布更新的应用版本。
-
-
-</p>
-
-
-<h3 id="permission-test-tips">测试提示</h3>
-
-<p>
-  使用以下测试提示有助于您计划并通过新权限行为执行应用测试。
-
-</p>
-
-<ul>
-  <li>识别应用的当前权限和相关的代码路径</li>
-  <li>跨受权限保护的服务和数据测试用户流程</li>
-  <li>使用授予/撤销权限的各种组合进行测试</li>
-  <li>使用 {@code adb} 工具从命令行管理权限:
-    <ul>
-      <li>按组列出权限和状态:
-        <pre>adb shell pm list permissions -d -g</pre>
-      </li>
-      <li>使用以下语法授予或撤销一项或多项权限:<br>
-        <pre>adb shell pm [grant|revoke] &lt;permission.name&gt; ...</pre>
-      </li>
-    </ul>
-  </li>
-  <li>针对使用权限的服务对应用进行分析</li>
-</ul>
-
-<h3 id="permission-test-strategy">测试策略</h3>
-
-<p>
-  权限更改会影响应用的结构和设计,以及您为用户提供的用户体验和流程。
-您应评估应用的当前权限使用情况并开始计划要提供的新流程。
-平台的正式版本提供兼容性行为,但您应计划更新应用,而不是依赖于这些行为。
-
-
-</p>
-
-<p>
-  确定应用实际需要和使用的权限,然后找出各种使用受权限保护的服务的代码路径。
-您可通过结合使用新平台测试和代码分析完成此操作。
-在测试中,您应通过将应用的 {@code targetSdkVersion} 更改为预览版,重点关注选择运行时权限。
-如需了解详细信息,请参阅<a href="{@docRoot}preview/setup-sdk.html#">设置 Android N SDK</a>。
-
-
-</p>
-
-<p>
-  使用已撤销和已添加权限的各种组合进行测试,突出显示依赖于权限的用户流程。
-如果依赖关系不明显或不符合逻辑,则您应考虑重构或划分该流程,以消除依赖关系或阐明需要权限的原因。
-
-
-</p>
-
-<p>
-  如需了解有关运行时权限行为、测试和最佳做法的详细信息,请参阅<a href="{@docRoot}preview/features/runtime-permissions.html">权限</a>开发者预览版页面。
-
-
-</p>
-
-
-<h2 id="doze-standby">测试低电耗模式和应用待机模式</h2>
-
-<p>
-  当设备处于空闲状态或应用未聚焦时,低电耗模式和应用待机模式的节能功能将限制应用可执行的后台处理工作量。
-系统可对应用实施的限制包括:限制或禁止访问网络、暂停后台任务、暂停通知、忽略唤醒请求和闹铃。
-
-要确保应用在完成这些节能优化后正常运行,您应通过模拟这些低功耗状态对应用进行测试。
-
-
-</p>
-
-<h4 id="doze">在低电耗模式下测试您的应用</h4>
-
-<p>要在低电耗模式下测试您的应用,请执行以下操作:</p>
-
-<ol>
-<li>使用 Android N 系统映像配置硬件设备或虚拟设备</li>
-<li>将设备连接到开发计算机并安装应用</li>
-<li>运行应用并使其保持活动状态</li>
-<li>通过运行以下命令,模拟进入低电耗模式的设备:
-
-<pre>
-$ adb shell dumpsys battery unplug
-$ adb shell dumpsys deviceidle step
-$ adb shell dumpsys deviceidle -h
-</pre>
-
-  </li>
-  <li>观察重新激活设备时的应用行为。确保应用在设备退出低电耗模式时正常恢复
-</li>
-</ol>
-
-
-<h4 id="standby">在应用待机模式下测试您的应用</h4>
-
-<p>要在应用待机模式下测试您的应用,请执行以下操作:</p>
-
-<ol>
-  <li>使用 Android N 系统映像配置硬件设备或虚拟设备</li>
-  <li>将设备连接到开发计算机并安装应用</li>
-  <li>运行应用并使其保持活动状态</li>
-  <li>通过运行以下命令,模拟进入待机模式的应用:
-
-<pre>
-$ adb shell am broadcast -a android.os.action.DISCHARGING
-$ adb shell am set-idle &lt;packageName&gt; true
-</pre>
-
-  </li>
-  <li>使用以下命令模拟如何唤醒应用:
-    <pre>$ adb shell am set-idle &lt;packageName&gt; false</pre>
-  </li>
-  <li>观察唤醒后的应用行为。确保应用从待机模式中正常恢复。
-特别地,您应检查应用的通知和后台作业是否按预期继续运行
-</li>
-</ol>
-
-<h2 id="ids">自动备份应用和设备特定的标识符</h2>
-
-<p>如果应用坚持在内部存储中使用任何设备特定的标识符,如 Google 云消息传递注册 ID,请确保遵循最佳做法将存储位置从自动备份中排除,如<a href="{@docRoot}preview/backup/index.html">自动备份应用</a>中所述。
-
-
-
- </p>
diff --git a/docs/html-intl/intl/zh-cn/about/versions/nougat/index.jd b/docs/html-intl/intl/zh-cn/about/versions/nougat/index.jd
index 74cd039..c1eb423 100644
--- a/docs/html-intl/intl/zh-cn/about/versions/nougat/index.jd
+++ b/docs/html-intl/intl/zh-cn/about/versions/nougat/index.jd
@@ -1,6 +1,6 @@
-page.title=Android N Developer Preview
-page.tags="preview","developer"
-meta.tags="preview", "android"
+page.title=Android 7.0 Nougat
+page.tags="androidn","versions"
+meta.tags="android n", "nougat", "android 7.0"
 fullpage=true
 forcelocalnav=true
 header.hide=1
@@ -17,62 +17,57 @@
   })
 </script>
 
-<section class="dac-expand dac-hero dac-light" style="background-color:#B2DFDB">
+<section class="dac-expand dac-hero dac-light">
   <div class="wrap" style="max-width:1100px;margin-top:0">
+  <a href="{@docRoot}about/versions/nougat/android-7.0.html">
     <div class="cols dac-hero-content" style="padding-bottom:1em;">
 
-      <div class="col-7of16 col-push-9of16" style="padding-left:2em">
-        <h1 class="dac-hero-title">Android N Developer Preview</h1>
+      <div class="col-7of16 col-push-8of16" style="padding-left:2em">
+        <h1 class="dac-hero-title">Android 7.0 Nougat</h1>
         <p class="dac-hero-description">
-          为 Android N 进行准备!
+          为 Android Nougat 进行准备!
           在 Nexus 和其他设备上<strong>测试您的应用</strong>。支持新系统行为以<strong>节省电量和内存</strong>。
 
           使用<strong>多窗口 UI</strong> 扩展您的应用,以便能够<strong>直接答复通知</strong>及执行其他操作。
 
         </p>
 
-        <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+        <a class="dac-hero-cta" href="{@docRoot}about/versions/nougat/android-7.0.html">
           <span class="dac-sprite dac-auto-chevron"></span>
           入门指南
-        </a><!--<br>
-        <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
-          Update to Android N (final SDK)
-        </a><br>-->
+        </a>
       </div>
-      <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
-        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png" srcset="{@docRoot}images/home/n-preview-hero.png 1x,
-             {@docRoot}images/home/n-preview-hero_2x.png 2x">
+      <div class="col-7of16 col-pull-6of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
+        <a  href="{@docRoot}about/versions/nougat/android-7.0.html">
+        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png"
+             srcset="{@docRoot}images/home/n-preview-hero.png 1x,
+             {@docRoot}images/home/n-preview-hero_2x.png 2x" />
+           </a>
       </div>
-    </div>
+    </div></a>
     <div class="dac-section dac-small">
       <div class="resource-widget resource-flow-layout col-16"
-           data-query="collection:preview/landing/resources"
+           data-query="collection:nougat/landing/resources"
            data-cardSizes="6x2"
-           data-maxResults="6"></div>
-    </div>
+           data-maxResults="3"></div>
+         </div>
   </div>
 </section>
 
+
 <div id="useUpdatedTemplates" style="display:none" class="dac-section dac-slim dac-gray dac-expand">
   <div class="wrap dac-offset-parent">
-    <a class="dac-fab dac-scroll-button" data-scroll-button href="#build-apps">
+    <a class="dac-fab dac-scroll-button" data-scroll-button href="#latest">
       <i class="dac-sprite dac-arrow-down-gray"></i>
     </a>
     <ul class="dac-actions">
       <li class="dac-action">
-        <a class="dac-action-link" href="https://developer.android.com/preview/bug">
+        <a class="dac-action-link" href="https://source.android.com/source/report-bugs.html">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
           报告问题
         </a>
       </li>
       <li class="dac-action">
-        <a class="dac-action-link" href="{@docRoot}preview/support.html">
-          <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
-          查阅版本说明
-        </a>
-      </li>
-      <li class="dac-action">
         <a class="dac-action-link" href="{@docRoot}preview/dev-community">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
           加入开发者社区
@@ -113,19 +108,33 @@
     data-initial-results="3"></div>
 </div></section>
 
-<section class="dac-section dac-gray"><div class="wrap">
-  <h1 class="dac-section-title">资源</h1>
+<section class="dac-section dac-gray" id="videos"><div class="wrap">
+  <h1 class="dac-section-title">Videos</h1>
   <div class="dac-section-subtitle">
-    这些必备信息可帮助您的应用为Android N做好准备。
+    New Android capabilities and the right way to use them in your apps.
   </div>
 
   <div class="resource-widget resource-flow-layout col-16"
-       data-query="collection:preview/landing/more"
+    data-query="collection:nougat/landing/videos/first,type:youtube+tag:androidn"
+    data-sortOrder="-timestamp"
+    data-cardSizes="6x6"
+    data-items-per-page="6"
+    data-maxResults="15"
+    data-initial-results="3">
+  </div>
+</div></section>
+
+<section class="dac-section dac-light" id="resources"><div class="wrap">
+  <h1 class="dac-section-title">资源</h1>
+  <div class="dac-section-subtitle">
+    这些必备信息可帮助您的应用为Android Nougat做好准备。
+  </div>
+
+  <div class="resource-widget resource-flow-layout col-16"
+       data-query="collection:nougat/landing/more"
        data-cardSizes="6x6"
        data-items-per-page="6"
        data-maxResults="15"
        data-initial-results="6"></div>
-
   </div>
-</section>
-
+</section>
\ No newline at end of file
diff --git a/docs/html-intl/intl/zh-cn/index.jd b/docs/html-intl/intl/zh-cn/index.jd
index ca3a84b..8872d16 100644
--- a/docs/html-intl/intl/zh-cn/index.jd
+++ b/docs/html-intl/intl/zh-cn/index.jd
@@ -15,33 +15,30 @@
   })
 </script>
 
-<section class="dac-expand dac-hero dac-invert" style="background-color:#455A64">
-  <div class="wrap" style="max-width:1100px;margin-top:0">
-    <div class="col-7of16 col-push-9of16" style="padding-left:2em;">
-      <a href="{@docRoot}preview/index.html">
-        <h1 class="dac-hero-title">Android N Developer Preview</h1>
-        <p class="dac-hero-description">
-          Get ready for the next version of Android!
-          <strong>Test your apps</strong> on Nexus and other devices. Support new system
-          behaviors to <strong>save power and memory</strong>.
+<section class="dac-expand dac-hero" style="background-color:#b2dfdb;">
+  <div class="wrap" style="max-width:1000px;margin-top:0">
+    <div class="col-7of16 col-push-8of16">
+      <a href="{@docRoot}about/versions/nougat/index.html">
+        <h1 class="dac-hero-title" style="color:#004d40">Android 7.0 Nougat!</h1>
+        <p class="dac-hero-description" style="color:#004d40">
+          <strong>Android 7.0 Nougat is here!</strong>
+          Get your apps ready for the latest version of Android, with new system
+          behaviors to <strong>save battery and memory</strong>.
           Extend your apps with <strong>multi-window UI</strong>,
           <strong>direct reply notifications</strong> and more.
         </p>
-        <a class="dac-hero-cta" href="/preview/index.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
+        <a class="dac-hero-cta" href="{@docRoot}about/versions/nougat/index.html" style="color:#004d40">
+          <span class="dac-sprite dac-auto-chevron" style="background-color:#b2dfdb"></span>
           Learn more
-        </a><!--<br>
-        <a class="dac-hero-cta" href="/preview/support.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
-          Update to Developer Preview (final SDK)
-        </a><br>-->
+        </a>
+        </a>
       </a>
     </div>
-    <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:0em;padding-right:1.5em;">
-      <a href="{@docRoot}preview/index.html">
-        <img style="" class="dac-hero-image" src="/images/home/n-preview-hero.png"
-             srcset="/images/home/n-preview-hero.png 1x,
-             /images/home/n-preview-hero_2x.png 2x">
+    <div class="col-6of16 col-pull-6of16 dac-hero-figure" style="padding-left:1em;padding-top:1em;">
+      <a href="{@docRoot}about/versions/nougat/index.html">
+        <img class="dac-hero-image" src="{@docRoot}images/home/nougat_bg.jpg"
+             srcset="{@docRoot}images/home/nougat_bg.jpg 1x,
+             {@docRoot}images/home/nougat_bg_2x.jpg 2x">
         </a>
     </div>
   </div>
diff --git a/docs/html-intl/intl/zh-cn/preview/download_mp2.jd b/docs/html-intl/intl/zh-cn/preview/download_mp2.jd
deleted file mode 100644
index ba5249a..0000000
--- a/docs/html-intl/intl/zh-cn/preview/download_mp2.jd
+++ /dev/null
@@ -1,359 +0,0 @@
-page.title=下载
-page.image=images/cards/card-download_16-9_2x.png
-
-@jd:body
-
-<div style="position:relative; min-height:600px">
-
-  <div class="wrap" id="tos" style="position:absolute;display:none;width:inherit;">
-
-    <p class="sdk-terms-intro">在下载和安装预览版 Android SDK 的组件之前,您必须同意下列条款和条件。
-</p>
-
-    <h2 class="norule">条款和条件</h2>
-
-    <div class="sdk-terms" onfocus="this.blur()" style="width:678px">
-本协议是 Android SDK 预览版许可协议(以下称为“许可协议”)。
-
-1. 简介
-
-1.1 Android SDK 预览版(在本许可协议中简称为“预览版”,具体包括 Android 系统文件、封装 API 以及预览版库文件(若可用))依据本许可协议的条款授权您使用。本许可协议在您与 Google 之间就您对“预览版”的使用构成具有法律约束力的合约。
-
-1.2 “Android”是指以 Android 开源项目(项目网址为 http://source.android.com/,其内容会不时更新)名义提供、面向设备的 Android 软件栈。
-
-1.3 “Google”是指 Google Inc.,是一家特拉华州公司,主要营业地位于:1600 Amphitheatre Parkway, Mountain View, CA 94043, United States。
-
-2. 接受许可协议
-
-2.1 要使用“预览版”,您必须先同意本许可协议。如果您不接受本许可协议,则不得使用“预览版”。
-
-2.2 点击接受并/或使用“预览版”,即表示您特此同意本许可协议的条款。
-
-2.3 如果依照美国或其他国家/地区(包括您居住或您使用“预览版”所在的国家/地区)的法律,您被禁止获取“预览版”,则您不得使用“预览版”,也不得接受本许可协议。
-
-2.4 如果您将在贵公司或组织内部使用“预览版”,则您同意代表您的雇主或其他实体接受本许可协议的约束,并且您表示并保证您拥有完全的合法授权令您的雇主或上述实体受本许可协议的约束。如果您不具备必要的授权,则不得代表您的雇主或其他实体接受本许可协议或使用“预览版”。
-
-3. Google 预览版许可
-
-3.1 Google 依据本许可协议的条款授予您个人或在贵公司或组织内部有限使用“预览版”的免版税、不可转让、非独占性、不可再授权且可撤销的许可,其用途仅限开发在 Android 平台上运行的应用。
-
-3.2 您同意 Google 或第三方拥有“预览版”中存在或相关的全部合法权利、所有权和利益,包括“预览版”中存在的任何知识产权。“知识产权”是指根据专利法、版权法、商业机密法、商标法享有的任何及全部权利,以及其他任何及全部专有权利。Google 保留所有未明确授予您的权利。
-
-3.3 您不得将“预览版”用于本许可协议未明确允许的任何用途。您不得:(a) 对“预览版”或“预览版”的任何部分进行复制(备份用途除外)、修改、改编、再分发、反编译、逆向工程、反汇编或创建其衍生品;或 (b) 将“预览版”的任何部分加载到移动手持终端或除个人计算机之外的任何其他硬件设备上,将“预览版”的任何部分与其他软件合并,或者发行任何融入“预览版”某一部分的软件或设备。
-
-3.4 您同意您将不会进行任何可能引起或导致 Android 碎片化的行动,包括但不限于分发、参与创建或以任何方式推广从“预览版”衍生的软件开发工具包。
-
-3.5 对于依据开源软件许可授权的“预览版”组件,其使用、复制和分发仅受该开源软件许可条款的制约,不受本许可协议的约束。您同意在依照被授予的所有权利作为被许可方期间,在遵守此类开源软件许可协议方面始终保持良好的信誉,并避免进行任何可能导致终止、暂停或违反此类权利的行动。
-
-3.6 您同意 Google 所提供“预览版”的形式和性质可随时发生变更,而无需事先通知您,并且未来的“预览版”版本可能会与在之前的“预览版”版本上开发的应用不兼容。您同意 Google 可单方面决定在未事先通知您的情况下全面停止(永久性或暂时性)向您或用户提供“预览版”(或“预览版”内的任何功能)。
-
-3.7 本许可协议内没有任何条款授予您使用 Google 的任何商品名、商标、服务标志、徽标、域名或其他独特品牌特征的权利。
-
-3.8 您同意您不会移除、遮盖或篡改“预览版”上可能贴有或“预览版”内可能包含的任何专有权利声明(包括版权声明和商标声明)。
-
-4. 您对“预览版”的使用
-
-4.1 Google 同意本许可协议中的任何条款均未授予 Google 从您(或您的许可方)处获取您依照本许可协议使用“预览版”开发的任何软件应用中存在或与其相关的权利、所有权或利益,包括这些应用中存在的任何知识产权。
-
-4.2 您同意只出于 (a) 本许可协议和 (b) 相关管辖区域内任何适用法律、法规或公认惯例或准则(包括有关向美国或其他相关国家/地区出口数据或软件或从美国或其他相关国家/地区进口数据或软件的任何法律)所允许的目的而使用“预览版”和编写应用。
-
-4.3 您同意,如果您使用“预览版”开发应用,您将会保护用户的隐私权和合法权利。如果用户向您提供用户名、密码或其他登录信息或个人信息,您必须确保用户知晓这些信息将供您的应用使用,并且您必须为这些用户提供足以满足法律要求的隐私声明和保护。如果您的应用存储由用户提供的个人信息或敏感信息,其存储方式必须安全。如果用户向您提供 Google 帐户信息,您的应用只能在用户允许时出于用户所许可的有限目的使用该信息访问用户的 Google 帐户。
-
-4.4 您同意您不会利用“预览版”从事任何干扰、中断、损坏或以未经授权方式访问 Google 或任何第三方的服务器、网络或其他财产或服务的Activity(包括应用的开发或分发)。
-
-4.5 您同意您对通过 Android 和/或 Android 应用创建、传输或显示的任何数据、内容或资源以及您的行为所导致的后果(包括 Google 可能遭受的任何损失或损害)负全责(Google 在上述方面对您或任何第三方不承担任何责任)。
-
-4.6 您同意您为违反本许可协议、任何适用的第三方合约或服务条款或任何适用法律或法规下的义务以及任何上述违规行为所导致的后果(包括 Google 或任何第三方可能遭受的任何损失或损害)负全责(Google 在上述方面对您或任何第三方不承担任何责任)。
-
-4.7 “预览版”正在开发中,您的测试和反馈是开发过程的重要环节。使用“预览版”,即表示您承认某些功能仍在开发实现之中,您不应期望“预览版”具备稳定版本的全部功能。您同意不使用此“预览版”公开发布或发运任何应用,因为此“预览版”在 Android SDK 正式发行之后将不再受支持。
-
-5. 您的开发者凭据
-
-5.1 您同意,对于 Google 可能向您发放或可能由您自行选择的任何开发者凭据,您有责任保持其机密性,并且您对以您的开发者凭据名义开发的所有应用负全责。
-
-6. 隐私权和信息
-
-6.1 为持续创新和改进“预览版”,Google 可能会从软件收集某些使用统计数据,包括但不限于唯一标识符、关联的 IP 地址、软件的版本号以及有关软件使用了“预览版”中哪些工具和/或服务及其使用方式的信息。在收集任何上述信息之前,“预览版”都会通知您并征求您的同意。如果您拒绝同意,我们将不会收集这些信息。
-
-6.2 我们会对收集的数据进行汇总调查,以便改进“预览版”,并会按照 Google 的隐私政策(网址为 http://www.google.com/policies/privacy/)维护数据。
-
-7. 第三方应用
-
-7.1 如果您使用“预览版”运行由第三方开发或访问由第三方提供的数据、内容或资源的应用,您同意 Google 对这些应用、数据、内容或资源不承担任何责任。您理解,您通过上述第三方应用可能访问到的所有数据、内容或资源由其提供者负全责,Google 对您因使用或访问其中任何第三方应用、数据、内容或资源而遭受的任何损失或损害不承担任何责任。
-
-7.2 您应知晓,通过此类第三方应用提供给您的数据、内容和资源可能受提供商(或代表他们的其他人员或公司)所拥有的知识产权的保护。除非相关所有者明确给予许可,否则您不得修改、出租、租赁、借出、出售、分发这些数据、内容或资源(的全部或部分),或以其为基础创建衍生品。
-
-7.3 您承认您对上述第三方应用、数据、内容或资源的使用可能受到您与相关第三方之间单独订立的条款的制约。
-
-8. 使用 Google API
-
-8.1 Google API
-
-8.1.1 如果您使用任何 API 从 Google 检索数据,即表示您承认这些数据可能受到 Google 或这些数据提供方(或代表他们的其他人员或公司)拥有的知识产权的保护。您对任何上述 API 的使用可能受到附加服务条款的制约。除非相关服务条款允许,否则您不得修改、出租、租赁、借出、出售、分发这些数据(的全部或部分),或以其为基础创建衍生品。
-
-8.1.2 如果您使用任何 API 从 Google 检索用户数据,即表示您承认并同意您只有在征得用户明确同意时才会检索数据,并且只能在用户允许时出于用户许可的有限目的检索数据。
-
-9. 终止许可协议
-
-9.1 本许可协议将持续有效,直至您或 Google 按以下规定终止本协议。
-
-9.2 如果您想终止本许可协议,可通过停止使用“预览版”以及任何相关开发者凭据予以终止。
-
-9.3 Google 有权在向您在作出通知后,有理由或无理由地随时终止与您订立的这份许可协议。
-
-9.4 本许可协议将在下列情况下自动终止,而无需另行通知或采取其他行动,以先符合条件者为准:
-(A) Google 在您居住或使用服务所在国家/地区停止向用户提供“预览版”或“预览版”的某些部分;
-(B) Google 发行 Android SDK 的最终版本。
-
-9.5 在本许可协议终止时,本许可协议中向您授予的许可将终止,您应立即完全停止使用“预览版”,并且第 10、11、12 和 14 节的条款将无限期继续存在。
-
-10. 免责声明
-
-10.1 您明确理解并同意,您使用“预览版”的风险将由您自行承担,并且“预览版”是按“原样”和“现状”提供,Google 不提供任何类型的担保。
-
-10.2 您对“预览版”的使用以及通过使用“预览版”下载或以其他方式获得的任何材料由您自行决定,风险自负,并且对于因此类使用而对您的计算机系统或其他设备造成的任何损害或数据损失由您单方面负责。在不对上文所述予以限制的条件下,您了解“预览版”并非稳定版本,可能存在将导致重大损害的错误、缺陷和安全漏洞,包括无法挽回地完全无法使用您的计算机系统或其他设备。
-
-10.3 Google 进一步明确拒绝任何类型的所有担保和条件,无论明示或暗示,包括但不限于有关适销性、特定用途适用性以及非侵权的暗示担保和条件。
-
-11. 有限责任
-
-11.1 您明确理解并同意,对于您可能遭遇的任何直接、间接、附带、特殊、继发或惩罚性损害(包括任何数据损失),Google 及其子公司和附属公司以及其许可方在任何责任理论下对您概不承担任何责任,无论 Google 或其代表是否已被告知或是否本应知晓发生任何上述损失的可能性。
-
-12. 赔偿
-
-12.1 您同意,在法律所允许的最大限度内,为 Google、其附属公司及其各自的董事、高管、员工和代理商提供辩护,使其免于因下列情况引起或产生的任何及所有索赔、诉讼、起诉或诉讼程序以及任何及所有损失、债务、损害、成本和费用(包括合理的律师费用)而承担责任或遭受损害:(a) 您对“预览版”的使用;(b) 您在“预览版”上开发的任何应用侵犯任何人的任何知识产权或诽谤任何人或侵犯其公开权或隐私权;以及 (c) 您的任何行为有悖于本许可协议
-
-13. 许可协议的更改
-
-13.1 Google 可能会在分发新版本“预览版”时对许可协议做出更改。做出这些更改后,Google 将在提供“预览版”的网站上公布新版本的许可协议。
-
-14. 一般法律条款
-
-14.1 本许可协议构成您与 Google 之间的完整法律协议,管辖您对“预览版”(不包括 Google 可能依据另外的书面协议向您提供的任何服务)的使用,并完全取代您之前与 Google 之间签订的、与“预览版”有关的任何协议。
-
-14.2 您同意,如果 Google 未行使或未强制执行本许可协议包含的任何法定权利或救济(或 Google 在任何适用法律下享有的相关利益),不得视为 Google 正式放弃这些权利,Google 仍可获得这些权利或救济。
-
-14.3 如果任何拥有管辖权的法院将本许可协议的任何条款裁定为无效,则该条款将从本许可协议中删除,而不会影响本许可协议的其余部分。本许可协议的其余条款将继续有效且可强制执行。
-
-14.4 您承认并同意,Google 集团旗下的每一家公司都将成为本许可协议的第三方受益人,并且此类其他公司将有权直接强制执行和依赖本许可协议中任何授予其利益(或支持其权利)的条款。除此之外,任何其他人员或公司均不得成为本许可协议的第三方受益人。
-
-14.5 出口限制。“预览版”受美国出口法律和法规的制约。您必须遵守适用于“预览版”的所有国内和国际出口法律和法规。这些法律包括目的地、最终用户和最终用途方面的限制。
-
-14.6 未经 Google 事先书面批准,您不得擅自转让或转移本许可协议,未经此类批准而试图进行的任何转让均为无效。未经 Google 事先书面批准,您不得委托您依据本许可协议所应承担的责任或义务。
-
-14.7 本许可协议以及您与 Google 依据本许可协议而建立的关系受加利福尼亚州法律管辖,而无论其是否与其他法律条款冲突。您与 Google 同意服从位于加利福尼亚州圣克拉拉县内法院的专属司法管辖权,以解决本许可协议引起的任何法律事务。尽管有上述规定,您同意仍允许 Google 在任何管辖区域申请禁令救济(或同等类型的紧急法律救济)。
-  </div><!-- sdk terms -->
-
-
-
-    <div id="sdk-terms-form">
-      <p>
-        <input id="agree" type="checkbox" name="agree" value="1" onclick="onAgreeChecked()" />
-        <label id="agreeLabel" for="agree">我已阅读并同意上述条款和条件</label>
-      </p>
-      <p><a href="" class="button disabled" id="downloadForRealz" onclick="return onDownloadForRealz(this);"></a></p>
-    </div>
-
-
-  </div><!-- end TOS -->
-
-
-  <div id="landing">
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>本文内容</h2>
-      <ol>
-        <li><a href="#sdk">预览版 SDK</a></li>
-        <li><a href="#docs">开发者文档</a></li>
-        <li><a href="#images">硬件系统映像</a></li>
-      </ol>
-     <h2>Legacy downloads</h2>
-        <ol>
-           <li><a href="{@docRoot}preview/download_mp1.html">Developer Preview Archive</a></li>
-        </ol>
-  </div>
-</div>
-
-
-<p>
-  Android M 预览版 SDK 包括开发工具、Android 系统文件和库文件,旨在帮助您在下一版本的平台中测试您的应用以及该平台提供的新 API。
-本文旨在介绍如何获得“预览版”的可下载组件,以便测试您的应用。
-
-</p>
-
-
-<h2 id="sdk">预览版 SDK</h2>
-
-<p>
-  预览版 SDK 可通过 <a href="{@docRoot}tools/help/sdk-manager.html">Android SDK 管理器</a>下载。如需了解有关下载和配置预览版 SDK 的详细信息,请参阅<a href="{@docRoot}preview/setup-sdk.html#downloadSdk">设置预览版 SDK</a>。
-
-</p>
-
-
-<h2 id="docs">开发者文档</h2>
-
-<p>
-  开发者文档下载软件包提供详细的 API 参考信息和“预览版”的 API 差异报告。
-</p>
-
-<table>
-  <tr>
-    <th scope="col">Description</th>
-    <th scope="col">Download / Checksums</th>
-  </tr>
-  <tr id="docs-dl">
-    <td>Android M Preview 2<br>Developer Docs</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >m-preview-2-developer-docs.zip</a><br>
-      MD5: 1db6fff9c722b0339757e1cdf43663a8<br>
-      SHA-1: 5a4ae88d644e63824d21b0e18f8e3977a7665157
-    </td>
-  </tr>
-</table>
-
-
-<h2 id="images">硬件系统映像</h2>
-
-<p>
-  这些系统映像允许您在实际设备上安装预览版平台,以便进行测试。
-通过使用这些映像之一配置设备,您可以安装并测试您的应用,以了解其在下一版本平台上的性能表现。
-在设备上安装系统映像的过程会<em>删除设备中的所有数据</em>,因此您应该在安装系统映像之前备份数据。
-
-
-</p>
-
-<p class="warning">
-  <b>警告:</b>以下 Android 系统映像是预览版,可能会随时发生变化。您对这些系统映像的使用受 Android SDK 预览版许可协议的制约。
-Android 预览版系统映像并非稳定版本,可能包含会对您的计算机系统、设备和数据造成损害的错误和缺陷。
-
-Android 预览版系统映像未经过与出厂操作系统相同的测试,可能会导致您的手机和安装的服务与应用停止工作。
-
-
-</p>
-
-<table>
-  <tr>
-    <th scope="col">Device</th>
-    <th scope="col">Download / Checksums</th>
-  </tr>
-  <tr id="hammerhead">
-    <td>Nexus 5 (GSM/LTE) <br>"hammerhead"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >hammerhead-MPZ79M-preview-b1f4bde4.tgz</a><br>
-      MD5: 2ca9f18bf47a061b339bab52647ceb0d<br>
-      SHA-1: b1f4bde447eccbf8ce5d9b8b8ba954e3eac8e939
-    </td>
-  </tr>
-  <tr id="shamu">
-    <td>Nexus 6 <br>"shamu"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >shamu-MPZ79M-preview-e1024040.tgz</a><br>
-      MD5: 24a2118da340b9afedfbdfc026f6ff81<br>
-      SHA-1: e10240408859d5188c4aae140e1c539130ba614b
-    </td>
-  </tr>
-  <tr id="volantis">
-    <td>Nexus 9 <br>"volantis"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >volantis-MPZ79M-preview-9f305342.tgz</a><br>
-      MD5: 9edabf0a4c61b247f1cbb9dfdc0a899e<br>
-      SHA-1: 9f30534216f10899a6a75495fc7e92408ea333a7
-    </td>
-  </tr>
-
-  <tr id="fugu">
-    <td>Nexus Player <br>"fugu"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >fugu-MPZ79N-preview-fb63af98.tgz</a><br>
-      MD5: e8d081137a20b66df595ee69523314b5<br>
-      SHA-1: fb63af98302dd97be8de9313734d389ccdcce250
-    </td>
-  </tr>
-
-</table>
-
-<h3 id="install-image">将映像安装到设备</h3>
-
-<p>
-  要使用设备映像进行测试,您必须将其安装到兼容设备上。请按照下面的说明安装系统映像:
-
-</p>
-
-<ol>
-  <li>下载并解压此处列出的系统映像包之一。</li>
-  <li>备份设备中您希望予以保留的任何数据。</li>
-  <li>按照
-<a href="https://developers.google.com/android/nexus/images#instructions">developers.google.com/android</a>
- 中的说明将映像刷入设备中。</li>
-</ol>
-
-<p class="note">
-  <strong>注:</strong>为开发设备刷入预览版系统映像之后,它将通过无线 (OTA) 更新自动升级到下一个预览版本。
-
-</p>
-
-<h3 id="revertDevice">将设备还原至出厂规格</h3>
-
-<p>
-  如果您想要卸载预览版并将设备还原至出厂规格,请转到
-<a href="http://developers.google.com/android/nexus/images">developers.google.com/android</a> 并下载要为设备刷入的映像。
-按照该页面上的说明将映像刷入设备中。
-
-</p>
-
-  </div><!-- landing -->
-
-</div><!-- relative wrapper -->
-
-
-
-<script>
-  var urlRoot = "http://storage.googleapis.com/androiddevelopers/shareables/preview/";
-  function onDownload(link) {
-
-    $("#downloadForRealz").html("Download " + $(link).text());
-    $("#downloadForRealz").attr('href', urlRoot + $(link).text());
-
-    $("#tos").fadeIn('fast');
-    $("#landing").fadeOut('fast');
-
-    return true;
-  }
-
-
-  function onAgreeChecked() {
-    /* verify that the TOS is agreed */
-    if ($("input#agree").is(":checked")) {
-      /* reveal the download button */
-      $("a#downloadForRealz").removeClass('disabled');
-    } else {
-      $("a#downloadForRealz").addClass('disabled');
-    }
-  }
-
-  function onDownloadForRealz(link) {
-    if ($("input#agree").is(':checked')) {
-    /*
-      $("#tos").fadeOut('fast');
-      $("#landing").fadeIn('fast');
-    */
-
-      ga('send', 'event', 'M Preview', 'System Image', $("#downloadForRealz").html());
-
-    /*
-      location.hash = "";
-    */
-      return true;
-    } else {
-      return false;
-    }
-  }
-
-  $(window).hashchange( function(){
-    if (location.hash == "") {
-      location.reload();
-    }
-  });
-
-</script>
diff --git a/docs/html-intl/intl/zh-cn/preview/features/background-optimization.jd b/docs/html-intl/intl/zh-cn/preview/features/background-optimization.jd
deleted file mode 100644
index 4ce58aa..0000000
--- a/docs/html-intl/intl/zh-cn/preview/features/background-optimization.jd
+++ /dev/null
@@ -1,391 +0,0 @@
-page.title=后台优化
-page.metaDescription=隐式广播的新限制。
-page.keywords="android N", "implicit broadcasts", "job scheduler"
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>
-      本文内容
-    </h2>
-
-    <ol>
-      <li>
-        <a href="#connectivity-action">对 CONNECTIVITY_ACTION 的限制</a>
-      </li>
-
-      <li>
-        <a href="#sched-jobs">安排连入无限流量连接时的网络作业</a>
-
-      </li>
-
-      <li>
-        <a href="#monitor-conn">在应用运行时监控网络连接</a>
-
-      </li>
-
-      <li>
-        <a href="#media-broadcasts">对 NEW_PICTURE 和 NEW_VIDEO 的限制</a>
-
-      </li>
-
-      <li>
-        <a href="#new-jobinfo">新的 JobInfo 方法</a>
-      </li>
-
-      <li>
-        <a href="#new-jobparam">新的 JobParameter 方法</a>
-      </li>
-
-      <li>
-        <a href="#further-optimization">进一步优化您的应用</a>
-      </li>
-    </ol>
-  </div>
-</div>
-
-<p>
-  后台进程非常耗费内存和电池。例如,隐式广播可以启动许多已注册侦听它的后台进程,即使这些进程可能没有执行许多工作。
-
-这会严重影响设备性能和用户体验。
-
-</p>
-
-<p>
-  为缓解这个问题,Android N 应用了以下限制:
-
-</p>
-
-<ul>
-  <li>面向 Preview 的应用不会收到 {@link
-android.net.ConnectivityManager#CONNECTIVITY_ACTION} 广播,即使它们在清单中注册接收这些广播。
-运行的应用如果使用 {@link android.content.Context#registerReceiver Context.registerReceiver()} 注册
-{@link android.content.BroadcastReceiver},则仍可在主线程上侦听 {@code CONNECTIVITY_CHANGE}。
-
-
-  </li>
-
-  <li>应用无法发送或接收 {@link
-android.hardware.Camera#ACTION_NEW_PICTURE} 或 {@link
-android.hardware.Camera#ACTION_NEW_VIDEO} 广播。此项优化会影响所有应用,而不仅仅是面向 Preview 的应用。
-
-  </li>
-</ul>
-
-<p>
-  如果您的应用使用任何 Intent,您仍需要尽快移除它们的依赖关系,以正确适配 Android N 设备。
-
-  Android 框架提供多个解决方案来缓解对这些隐式广播的需求。
-例如,{@link android.app.job.JobScheduler}
-和<a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-{@code GcmNetworkManager}</a> 提供了一个稳健可靠的机制来安排满足指定条件(例如连入无限流量网络)时所执行的网络操作。
-
-现在,您还可以使用 {@link android.app.job.JobScheduler}
-来响应内容提供程序所发生的变更。{@link android.app.job.JobInfo}
-对象封装了 {@link android.app.job.JobScheduler}
-用来安排您的作业的参数。如果符合作业条件,系统将在应用的 {@link android.app.job.JobService} 上执行此作业。
-
-</p>
-
-<p>
-  在本文档中,我们将学习如何使用备用方法(如 {@link android.app.job.JobScheduler})调整您的应用以符合这些新限制。
-
-
-</p>
-
-<h2 id="connectivity-action">
-  对 CONNECTIVITY_ACTION 的限制
-</h2>
-
-<p>
-  面向 Android N 的应用不会收到 {@link
-android.net.ConnectivityManager#CONNECTIVITY_ACTION} 广播,即使它们在清单中注册接收这些广播亦是如此,依赖此广播的流程也不会启动。
-
-这可能会给需要侦听网络变化或者需要在设备接入无限流量网络时执行批量网络活动的应用造成问题。
-
-Android 框架中已存在多个可绕过此限制的解决方案,但需要根据您想要应用实现的目标来选择正确的解决方案。
-
-
-</p>
-
-<p class="note">
-  <strong>注:</strong>当应用运行时,通过
-{@link android.content.Context#registerReceiver Context.registerReceiver()}
-中注册的 {@link android.content.BroadcastReceiver} 将继续接收这些广播。
-</p>
-
-<h3 id="sched-jobs">
-  安排连入无限流量连接时的网络作业
-</h3>
-
-<p>
-  使用 {@link android.app.job.JobInfo.Builder JobInfo.Builder} 类构建
-{@link android.app.job.JobInfo} 对象时,应用 {@link
-android.app.job.JobInfo.Builder#setRequiredNetworkType
-setRequiredNetworkType()} 方法,并将 {@link android.app.job.JobInfo
-JobInfo.NETWORK_TYPE_UNMETERED} 作为作业参数传递。以下代码示例展示如何安排当设备接入无限流量网络且正在充电时要运行的服务:
-
-
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-      (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo job = new JobInfo.Builder(
-    MY_BACKGROUND_JOB,
-    new ComponentName(context, MyJobService.class))
-      .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
-      .setRequiresCharging(true)
-      .build();
-  js.schedule(job);
-}
-</pre>
-
-<p>
-  当符合作业条件时,应用会收到回调以运行指定的{@code JobService.class} 中的 {@link android.app.job.JobService#onStartJob onStartJob()} 方法。
-
-如需查看 {@link
-  android.app.job.JobScheduler} 实现的更多示例,请参阅 <a href="{@docRoot}samples/JobScheduler/index.html">JobScheduler 示例应用</a>。
-</p>
-
-<p>
-  使用 GMSCore 服务且面向 Android 5.0(API 级别 21)或更低版本系统的应用可以使用<a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-{@code GcmNetworkManager}</a> 并指定 {@code Task.NETWORK_STATE_UNMETERED}。
-
-</p>
-
-<h3 id="monitor-conn">
-  在应用运行时监控网络连接
-</h3>
-
-<p>
-  注册了 {@link android.content.BroadcastReceiver} 的运行的应用仍可侦听 {@code CONNECTIVITY_CHANGE}。
-不过,{@link
-android.net.ConnectivityManager} API 提供了一个更稳健可靠的方法,可以仅在符合指定的网络条件时才请求回调。
-
-</p>
-
-<p>
-  {@link android.net.NetworkRequest} 对象根据 {@link android.net.NetworkCapabilities} 定义网络回调的参数。
-使用 {@link
-android.net.NetworkRequest.Builder NetworkRequest.Builder} 类创建 {@link android.net.NetworkRequest} 对象。然后,{@link
-android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,
-android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()}
-将 {@link android.net.NetworkRequest} 对象传递给系统。
-当符合网络条件时,应用会收到回调以执行在其 {@link
-android.net.ConnectivityManager.NetworkCallback} 类中定义的
-{@link android.net.ConnectivityManager.NetworkCallback#onAvailable
-onAvailable()} 方法。
-
-</p>
-
-<p>
-  应用继续接收回调,直至应用退出或调用
-{@link android.net.ConnectivityManager#unregisterNetworkCallback
-unregisterNetworkCallback()}。
-</p>
-
-<h2 id="media-broadcasts">
-  对 NEW_PICTURE 和 NEW_VIDEO 的限制
-</h2>
-
-<p>
-  在 Android N 中,应用无法发送或接收 {@link
-android.hardware.Camera#ACTION_NEW_PICTURE} 或 {@link
-android.hardware.Camera#ACTION_NEW_VIDEO} 广播。此限制有助于缓解必须唤醒多个应用以处理新图像或视频时对性能和用户体验造成的影响。
-
-Android N 扩展了 {@link android.app.job.JobInfo} 和 {@link
-android.app.job.JobParameters} 以提供备用解决方案。
-
-</p>
-
-<h3 id="new-jobinfo">
-  新的 JobInfo 方法
-</h3>
-
-<p>
-  为了针对内容 URI 变化触发作业,Android N 使用以下方法扩展了 {@link android.app.job.JobInfo} API:
-
-</p>
-
-<dl>
-  <dt>
-    {@code JobInfo.TriggerContentUri()}
-  </dt>
-
-  <dd>
-    封装针对内容 URI 变化触发作业所需的参数。
-  </dd>
-
-  <dt>
-    {@code JobInfo.Builder.addTriggerContentUri()}
-  </dt>
-
-  <dd>
-    将 {@code TriggerContentUri} 对象传递给 {@link
-android.app.job.JobInfo}。{@link android.database.ContentObserver}
-监控已封装的内容 URI。如果存在多个与某个作业关联的 {@code
-TriggerContentUri} 对象,则系统会提供一个回调,即使其报告仅一个内容 URI 发生变化。
-
-  </dd>
-
-  <dd>
-    如果给定 URI 的任何子级发生变化,则添加 {@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS} 标志以触发作业。
-此标志对应于传递给 {@link
-android.content.ContentResolver#registerContentObserver    registerContentObserver()} 的
-{@code notifyForDescendants} 参数。
-
-  </dd>
-</dl>
-
-<p class="note">
-  <strong>注:</strong> {@code TriggerContentUri()} 无法与 {@link android.app.job.JobInfo.Builder#setPeriodic
-setPeriodic()} 或 {@link android.app.job.JobInfo.Builder#setPersisted
-setPersisted()} 结合使用。
-若要持续监控内容变化,则可在应用的 {@link
-android.app.job.JobService} 完成处理最新的回调前安排新的
-{@link android.app.job.JobInfo}。
-</p>
-
-<p>
-  以下示例代码展示如何安排当系统报告内容 URI {@code MEDIA_URI} 所发生变化时要触发的作业:
-
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-          (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo.Builder builder = new JobInfo.Builder(
-          MY_BACKGROUND_JOB,
-          new ComponentName(context, MediaContentJob.class));
-  builder.addTriggerContentUri(
-          new JobInfo.TriggerContentUri(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
-          JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
-  js.schedule(builder.build());
-}
-</pre>
-<p>
-  当系统报告指定内容 URI 所发生变化时,应用将收到一个回调,并向 {@code MediaContentJob.class} 中的 {@link android.app.job.JobService#onStartJob onStartJob()}
-方法传递一个 {@link android.app.job.JobParameters} 对象。
-
-
-</p>
-
-<h3 id="new-jobparam">
-  新的 JobParameter 方法
-</h3>
-
-<p>
-  Android N 也扩展了{@link android.app.job.JobParameters},以允许应用接收有关哪些内容权限和 URI 已触发作业的有用信息:
-
-
-</p>
-
-<dl>
-  <dt>
-    {@code Uri[] getTriggeredContentUris()}
-  </dt>
-
-  <dd>
-    返回已触发作业的 URI 数组。如果没有任何 URI 触发作业(例如,作业是因截止期限或其他一些原因触发的),或者已更改的 URI 数量超过 50,该数组将为 {@code
-null}。
-
-
-  </dd>
-
-  <dt>
-    {@code String[] getTriggeredContentAuthorities()}
-  </dt>
-
-  <dd>
-    返回已触发作业的内容权限的字符串数组。
-    如果返回的数组不是 {@code null},请使用 {@code getTriggeredContentUris()}
-检索有关哪些 URI 已更改的详细信息。
-  </dd>
-</dl>
-
-<p>
-  以下示例代码重写 {@link
-android.app.job.JobService#onStartJob JobService.onStartJob()} 方法并记录已触发作业的内容权限和 URI:
-
-</p>
-
-<pre>
-&#64;Override
-public boolean onStartJob(JobParameters params) {
-  StringBuilder sb = new StringBuilder();
-  sb.append("Media content has changed:\n");
-  if (params.getTriggeredContentAuthorities() != null) {
-      sb.append("Authorities: ");
-      boolean first = true;
-      for (String auth :
-          params.getTriggeredContentAuthorities()) {
-          if (first) {
-              first = false;
-          } else {
-             sb.append(", ");
-          }
-           sb.append(auth);
-      }
-      if (params.getTriggeredContentUris() != null) {
-          for (Uri uri : params.getTriggeredContentUris()) {
-              sb.append("\n");
-              sb.append(uri);
-          }
-      }
-  } else {
-      sb.append("(No content)");
-  }
-  Log.i(TAG, sb.toString());
-  return true;
-}
-</pre>
-
-<h2 id="further-optimization">
-  进一步优化您的应用
-</h2>
-
-<p>
-  优化您的应用以在低内存设备上或在低内存条件下运行,这样可以提升性能和用户体验。
-删除后台服务依赖关系和静态注册的隐式广播接收器可帮助您的应用在此类设备上运行得更好。
-
-尽管 Android N 采取了措施以减少部分问题,但建议您优化自己的应用,使其能够在完全不使用这些后台进程的情况下运行。
-
-
-
-</p>
-
-<p>
-  Android N 推出了一些附加 <a href="{@docRoot}tools/help/adb.html">Android 调试桥 (ADB)</a> 命令,您可以使用这些命令测试在禁用那些后台进程情况下的应用行为:
-
-</p>
-
-<ul>
-  <li>要模拟隐式广播和后台服务不可用的条件,请输入以下命令:
-
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set &lt;package&gt; RUN_IN_BACKGROUND ignore}
-</pre>
-  </li>
-
-  <li>要重新启用隐式广播和后台服务,请输入以下命令:
-
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set &lt;package&gt; RUN_IN_BACKGROUND allow}
-</pre>
-  </li>
-</ul>
diff --git a/docs/html-intl/intl/zh-cn/preview/features/icu4j-framework.jd b/docs/html-intl/intl/zh-cn/preview/features/icu4j-framework.jd
deleted file mode 100644
index 9a1dfa8..0000000
--- a/docs/html-intl/intl/zh-cn/preview/features/icu4j-framework.jd
+++ /dev/null
@@ -1,159 +0,0 @@
-page.title=ICU4J Android 框架 API
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>本文内容:</h2>
-<ol>
-    <li><a href="#relation">与 ICU4J 的关系</a></li>
-    <li><a href="#migration">从 ICU4J 迁移至 android.icu API </a></li>
-    <li><a href="#licence">授权</a></li>
-</ol>
-
-<h2>另请参阅</h2>
-<ol>
-  <li>
-    <a class="external-link" href="http://userguide.icu-project.org">ICU4J 的文档</a>
-  </li>
-
-  <li>
-    <a class="external-link" href="http://site.icu-project.org/#TOC-What-is-ICU-">ICU4J 支持的最新标准</a>
-
-  </li>
-</ol>
-</div>
-</div>
-
-<p>
-  ICU4J 是一个广泛使用的开源 Java 库集合,为软件应用提供 Unicode 和全球化支持。
-Android N 在 {@code android.icu} 软件包下显示 Android 框架中的 ICU4J API 子集,供应用开发者使用。
-
-这些 API 使用设备上具有的本地化数据。
-因此,您可以通过不将 ICU4J 库编译到 APK 来减少 APK 占用空间;相反,您可以只在框架中调用它们。
-
-(在此情况下,您可能想要提供<a href="{@docRoot}google/play/publishing/multiple-apks.html">多个版本的 APK</a>,这样,运行比 Android N 低的 Android 版本的用户可以下载包含 ICU4J 库的应用版本。)
-
-
-
-</p>
-
-<p>
-  本文档开头提供了有关支持这些库所需的最低 Android API 级别的一些基本信息。
-然后,介绍关于 Android 特定的 ICU4J 实现您需要了解的内容。
-最后,介绍如何在 Android 框架中使用 ICU4J API。
-
-</p>
-
-<h2 id="relation">与 ICU4J 的关系</h2>
-
-<p>
-  Android N 通过
-<code>android.icu</code> 软件包(而非 <code>com.ibm.icu</code>)显示 ICU4J API 的子集。由于种种原因,Android 框架可能选择不显示 ICU4J API;例如,Android N 不显示一些已弃用的 API 或 ICU 团队尚未将其声明为“稳定”的 API。
-
-
-
-由于 ICU 团队将来会弃用这些 API,因此,Android 也会将其标记为已弃用,但将继续包含它们。
-
-</p>
-
-<p class="table-caption"><strong>表 1.</strong> Android N 中使用的 ICU 和 CLDR 版本。
-</p>
-<table>
-<tr>
-<th>Android API 级别</th>
-<th>ICU 版本</th>
-<th>CLDR 版本</th>
-</tr>
-<tr>
-<td>Android N</td>
-<td>56</td>
-<td>28</td>
-</tr>
-</table>
-
-<p>以下是几点注意事项:</p>
-
-<ul>
-<li>ICU4J Android 框架 API 不包含所有的 ICU4J API。</li>
-<li>NDK 开发者应了解 Android ICU4C 不受支持。</li>
-<li>Android 框架中的 API 不会取代 Android 对<a href="{@docRoot}guide/topics/resources/localization.html">使用资源进行本地化</a>的支持。
-
-</li>
-</ul>
-
-<h2 id="migration">从 com.ibm.icu 迁移至 android.icu 软件包</h2>
-
-<p>
-  如果您已在应用中使用 ICU4J API,且
-<code>android.icu</code> API 符合您的要求,那么要迁移至框架 API,需要将 Java 导入从 <code>com.ibm.icu</code> 更改为 <code>android.icu</code>。
-
-然后,您可以从 APK 移除您自己的 ICU4J 文件的副本。
-
-</p>
-
-<p class="note">
-  <b>注</b>:ICU4J 框架 API 使用 {@code android.icu}
-命名空间,而不是 {@code com.ibm.icu}。这是为了避免在包含自己的 {@code com.ibm.icu} 库的 APK 中出现命名空间冲突。
-
-</p>
-
-<h3 id="migrate-from-android">
-  从其他 Android SDK API 迁移至 android.icu API
-</h3>
-
-<p>
-  <code>java</code> 和 <code>android</code> 软件包中的某些类与在 ICU4J 中找到的一些类等效。
-不过,ICU4J 通常为标准和语言提供更广泛的支持。
-
-</p>
-<p>下面是一些入门示例:</p>
-<table>
-<tr>
-<th>类</th>
-<th>替代项</th>
-</tr>
-<tr>
-<td><code>java.lang.Character</code> </td>
-<td><code>android.icu.lang.UCharacter</code> </td>
-</tr>
-<tr>
-<td><code>java.text.BreakIterator</code> </td>
-<td><code>android.icu.text.BreakIterator</code> </td>
-</tr>
-<tr>
-<td><code>java.text.DecimalFormat</code> </td>
-<td><code>android.icu.text.DecimalFormat</code> </td>
-</tr>
-<tr>
-<td><code>java.util.Calendar</code></td>
-<td>
-<code>android.icu.util.Calendar</code></td>
-</tr>
-<tr>
-<td><code>android.text.BidiFormatter</code>
- </td>
-<td><code>android.icu.text.Bidi</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateFormat</code>
- </td>
-<td><code>android.icu.text.DateFormat</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateUtils</code> </td>
-<td><code>android.icu.text.DateFormat</code>
-<code>android.icu.text.RelativeDateTimeFormatter</code>
-</td>
-</tr>
-</table>
-
-<h2 id="licence">授权</h2>
-
-<p>
-  ICU4J 按照 ICU 许可发布。如需了解详情,请参阅 <a class="external-link" href="http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-">ICU 用户指南</a>。
-
-</p>
diff --git a/docs/html-intl/intl/zh-cn/preview/features/multilingual-support.jd b/docs/html-intl/intl/zh-cn/preview/features/multilingual-support.jd
deleted file mode 100644
index 248d6a0..0000000
--- a/docs/html-intl/intl/zh-cn/preview/features/multilingual-support.jd
+++ /dev/null
@@ -1,221 +0,0 @@
-page.title=语言和区域设置
-page.tags=androidn
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>本文内容:</h2>
-<ol>
-	  <li><a href="#preN">解析语言资源所面临的挑战</a></li>
-    <li><a href="#postN">对资源解析策略的改进</a></li>
-    <li><a href="#design">设计您的应用以支持附加区域设置</a>
-</li>
-
-</ol>
-
-</div>
-</div>
-
-<p>Android N 为多语言用户提供增强的支持,让他们可以在设置中选择多个区域设置。
-Android N 通过大幅扩展受支持的区域设置数量并更改系统解析资源的方式来提供此功能。
-
-全新的解析资源方法更加稳健,并且设计为与现有 APK 兼容,但要格外细心,以发现任何异常行为。
-
-例如,您应进行测试,以确保应用默认显示预期的语言。
-另外,如果应用支持多语言,您应确保此支持合乎预期。
-
-最后,对于您没有将其显式设计为支持的语言,应设法确保应用能够妥善地处理它们。
-</p>
-
-<p>本文档开头介绍 Android N 之前的资源解析策略。接下来介绍 Android N 改进的资源解析策略。
-
-最后,介绍如何充分利用扩展的区域设置数量来支持更多的多语言用户。
-</p>
-
-<h2 id="preN">解析语言资源所面临的挑战</h2>
-
-<p>在 Android N 之前,Android 并非始终能够成功匹配应用和系统区域设置。
-</p>
-
- <p>例如,假设您遇到了以下情况:</p>
- <ul>
- <li>您的应用的默认语言为{@code en_US}“US English”,但它也在 {@code es_ES}资源文件中对西班牙字符串进行了本地化。
-
-</li>
- <li> 将设备设置为 {@code es_MX} </li>
-
-<p>当您的 Java 代码引用字符串时,系统会从默认 ({@code en_US}) 资源文件加载字符串,即使应用在 {@code es_ES} 下有本地化的西班牙语资源。
-
-这是因为当系统无法找到精确匹配时,它会继续通过将国家/地区代码从区域设置中剥离来查找资源。
-
-最后,如果未找到匹配,系统会恢复为默认模式,即 {@code en_US}。
- </p>
-
-
-<p>如果用户选择应用根本不支持的语言(如法语),则系统也会默认显示 {@code en_US}。
-例如:</p>
-
-<p class="table-caption" id="t-resource-res">
-<strong>表 1.</strong> 没有精确区域设置匹配项的资源解析。
-</p>
-<table>
-<tbody>
-<tr>
-<th>用户设置</th>
-<th>应用资源</th>
-<th>资源解析</th>
-</tr>
-<tr>
-<td>fr_CH</td>
-<td>
-默认值 (en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
- <td>
-尝试 fr_CH =&gt; 失败<br>
-尝试 fr =&gt; 失败<br>
-使用默认值 (en)
-</td>
- </tr>
- </tbody>
-</table>
-
-
-<p>在此示例中,系统在不知道用户是否理解英语的情况下显示英语字符串。
-目前,此行为很常见。
-Android N 应该会大幅减少出现此类结果的频率。
-</p>
-
-<h2 id="postN">对资源解析策略的改进</h2>
-<p>Android N 可提供更稳健的资源解析,并自动查找更好的备用方法。
-不过,为了加速解析和提升可维护性,您应以最常用的母语存储资源。
-
- 例如,如果您之前将西班牙语资源存储在 {@code es-US} 目录中,请将它们移动到 {@code es-419} 目录,该目录包含拉丁美洲西班牙语。
-
- 同理,如果您在名为 {@code en-GB} 的文件夹中存储有资源字符串,则将此文件夹重命名为 {@code en-001}(国际英语),因为 <code>en-GB</code> 字符串的最常用母语为 {@code en-001}。
-
-
- 以下示例介绍为什么这些做法可提升性能和资源解析的可靠性。
-</p>
-
-<h3>资源解析示例</h3>
-
-<p>使用 Android N,以不同的方式解析<strong>表 1</strong> 中所描述的案例:
-</p>
-
-<p class="table-caption" id="t-improved-res">
-<strong>表 2.</strong> 针对没有精确区域设置匹配项时改进的资源解析策略。
-</p>
-<table>
-<tr>
-<th>用户设置</th>
-<th>应用资源</th>
-<th>资源解析</th>
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-</ol>
-</td>
-<td>
-默认值 (en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
-<td>
-尝试 fr_CH =&gt; 失败<br>
-尝试 fr =&gt; 失败<br>
-尝试 fr 的子项 =&gt; fr_FR<br>
-使用 fr_FR
-</td>
-</tr>
-
-</table>
-
-
-<p>现在,用户获得的是法语资源而不是英语。此示例还表明对于 Android N,您为什么应将法语字符串存储在 {@code fr}(而非 {@code fr_FR})中。此处的做法是匹配最接近的母语,从而使解析更快速且更具预见性。
-
-
-</p>
-
-<p>除了这个改进的解析逻辑外,Android 现在还提供更多的用户语言以供选择。
-下面,我们将意大利语指定为附加用户语言,但假设应用不支持法语,再次尝试上面的示例。
-  </p>
-
-<p class="table-caption" id="t-2d-choice">
-<strong>表 3.</strong> 应用仅与用户的次优区域设置匹配时的资源解析。
-</p>
-<table>
-<tr>
-<th>用户设置</th>
-<th>应用资源</th>
-<th>资源解析</th>
-
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-<li> it_CH</li>
-</ol>
-</td>
-<td>
-默认值 (en)<br>
-de_DE<br>
-es_ES<br>
-it_IT<br>
-</td>
-<td>
-尝试 fr_CH =&gt; 失败<br>
-尝试 fr =&gt; 失败<br>
-尝试 fr 的子项 =&gt; 失败<br>
-尝试 it_CH =&gt; 失败<br>
-尝试 it =&gt; 失败<br>
-尝试 it 的子项 =&gt; it_IT<br>
-使用 it_IT
-</td>
-
-</tr>
-
-</table>
-<p>用户仍会获取他们理解的语言,即使应用不支持法语。
-</p>
-
-
-<h2 id="design">设计您的应用以支持附加区域设置</h2>
-<h3>LocaleList API</h3>
-
-<p>Android N 添加了新的 API {@code LocaleList.getDefault()},从而让应用可以直接查询用户已指定的语言列表。
-您可以使用此 API 创建更成熟的应用行为和更优化的内容显示。
-
-例如,搜索可以基于用户的设置以多种语言显示结果。
-浏览器应用可避免翻译以用户理解的语言显示的页面,键盘应用可自动启用所有适用的布局。
-
- </p>
-
-<h3>格式化程序</h3>
-
-<p>直到 Android 6.0(API 级别 23),Android 仅支持许多常用语言(en、es、ar、fr、ru)的一个或两个区域设置。
-
-由于每种语言只有几种变体,因此,应用可以通过在资源文件中将一些数字和日期存储为硬编码字符串解决此问题。
-
-不过,随着 Android 扩展了支持的区域设置集,即使在一个区域设置中,日期、时间、货币及类似信息也会存在显著差异。
-
-
-对您的格式进行硬编码会让最终用户困惑不已。
-因此,在针对 Android N 开发应用时请务必使用格式化程序代替硬编码数字和日期字符串。
-</p>
-
-<p>阿拉伯语就是最好的例子,Android N 将对其的支持从一个 {@code ar_EG} 扩展到 27 个阿拉伯语区域设置。
-这些区域设置可以共享大多数资源,但其中一些资源首选 ASCII 数字,另一些则首选本地数字。
-例如,如果您想要创建一个具有数字变量的句子,如“Choose a 4 digit pin”,则按如下所示使用格式化程序:
-
-</p>
-
-<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>
diff --git a/docs/html-intl/intl/zh-cn/preview/features/notification-updates.jd b/docs/html-intl/intl/zh-cn/preview/features/notification-updates.jd
deleted file mode 100644
index 900eea6..0000000
--- a/docs/html-intl/intl/zh-cn/preview/features/notification-updates.jd
+++ /dev/null
@@ -1,393 +0,0 @@
-page.title=通知
-page.tags=通知
-helpoutsWidget=true
-page.image=/preview/images/notifications-card.png
-
-trainingnavtop=true
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-
-<!-- table of contents -->
-<h2>本文内容包括</h2>
-<ol>
-  <li><a href="#direct">直接回复</a></li>
-  <li><a href="#bundle">捆绑通知</a></li>
-  <li><a href="#custom">自定义视图</a></li>
-  <li><a href="#style">消息样式</a></li>
-</ol>
-
-</div>
-</div>
-
-<p>Android N 引入了一些新 API,允许应用发布具有高度可见性和交互性的通知。
-</p>
-
-<p>Android N 扩展了现有 {@link android.support.v4.app.RemoteInput} 通知 API,以支持手持式设备上的内联回复。
-此功能允许用户从通知栏快速进行回复,无需访问应用。
-</p>
-
-<p>
-  此外,Android N 还允许捆绑类似的通知并将它们显示为一则通知。
-为了实现此功能,Android N 使用现有的 {@link
-  android.support.v4.app.NotificationCompat.Builder#setGroup
-  NotificationCompat.Builder.setGroup()} 方法。用户可以从通知栏展开各通知,并分别对每则通知进行回复和清除等操作。
-
-
-</p>
-
-<p>最后,Android N 还添加了一些新 API,允许您在应用的自定义通知视图中使用系统装饰元素。
-这些 API 可帮助确保通知视图与标准模板的展示效果相一致。
-
-</p>
-
-<p>本文重点介绍您在应用中使用新通知功能时应加以考虑的一些重要变更。
-</p>
-
-<h2 id="direct">直接回复</h2>
-
-<p>利用 Android N 中的直接回复功能,用户可以直接在通知界面内快速回复短信或更新任务列表。
-
-在手持式设备上,可通过通知中另外附加的按钮进行内联回复操作。
-当用户通过键盘回复时,系统会将文本回复附加到您为通知操作指定的 Intent,并将 Intent 发送到手持式设备应用。
-
-
-
-
-
-<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
-  {@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
-<p class="img-caption">
-  <strong>图 1.</strong>Android N 添加了 <strong>Reply</strong> 操作按钮。
-
-</p>
-
-<h3>添加内联回复操作</h3>
-
-<p>要创建支持直接回复的通知操作:
-</p>
-
-<ol>
-<li>创建一个可添加到通知操作的 {@link android.support.v4.app.RemoteInput.Builder} 实例。
-
-该类的构造函数接受系统用作文本输入密钥的字符串。
-之后,手持式设备应用使用该密钥检索输入的文本。
-
-
-<pre>
-// Key for the string that's delivered in the action's intent.
-private static final String KEY_TEXT_REPLY = "key_text_reply";
-String replyLabel = getResources().getString(R.string.reply_label);
-RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
-        .setLabel(replyLabel)
-        .build();
-</pre>
-</li>
-<li>使用 <code>addRemoteInput()</code> 向操作附加 {@link android.support.v4.app.RemoteInput} 对象。
-
-
-<pre>
-// Create the reply action and add the remote input.
-Notification.Action action =
-        new Notification.Action.Builder(R.drawable.ic_reply_icon,
-                getString(R.string.label), replyPendingIntent)
-                .addRemoteInput(remoteInput)
-                .build();
-</pre>
-</li>
-
-<li>对通知应用操作并发出通知。
-
-<pre>
-// Build the notification and add the action.
-Notification newMessageNotification =
-        new Notification.Builder(mContext)
-                .setSmallIcon(R.drawable.ic_message)
-                .setContentTitle(getString(R.string.title))
-                .setContentText(getString(R.string.content))
-                .addAction(action))
-                .build();
-
-// Issue the notification.
-NotificationManager notificationManager =
-        NotificationManager.from(mContext);
-notificationManager.notify(notificationId, newMessageNotification);
-
-</pre>
-</li>
-
-</ol>
-
-
-<p> 在触发通知操作时系统提示用户输入回复。
- </p>
-
-<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
-    {@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>图 2.</strong>用户从通知栏输入文本。
-</p>
-
-<h3>
-  从内联回复检索用户输入
-</h3>
-
-<p>
-  要从通知界面接收用户输入并发送到在回复操作的 Intent 中声明的 Activity:
-
-</p>
-
-<ol>
-  <li>通过传递通知操作的 Intent 作为输入参数来调用 {@link android.support.v4.app.RemoteInput#getResultsFromIntent
- getResultsFromIntent()}。
-该方法返回含有文本回复的 {@link android.os.Bundle}。
-
-
-    <pre>
-Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-</pre>
-  </li>
-
-  <li>使用产生的密钥查询捆绑包(提供给 {@link
- android.support.v4.app.RemoteInput.Builder} 构造函数)。以下代码段说明了方法如何从捆绑包检索输入文本:
-
-
-
-    <pre>
-// Obtain the intent that started this activity by calling
-// Activity.getIntent() and pass it into this method to
-// get the associated string.
-
-private CharSequence getMessageText(Intent intent) {
-    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-    if (remoteInput != null) {
-        return remoteInput.getCharSequence(KEY_TEXT_REPLY);
-    }
-    return null;
- }
-</pre>
-  </li>
-
-  <li>使用您为上一项通知提供的相同的通知 ID 来建立和发布另一项通知。
-进度指示器从通知界面消失,以告知用户已回复成功。
-
-在处理这项新通知时,使用被传递到接收器 {@code onReceive()} 方法的上下文。
-
-
-    <pre>
-// Build a new notification, which informs the user that the system
-// handled their interaction with the previous notification.
-Notification repliedNotification =
-        new Notification.Builder(context)
-                .setSmallIcon(R.drawable.ic_message)
-                .setContentText(getString(R.string.replied))
-                .build();
-
-// Issue the new notification.
-NotificationManager notificationManager =
-        NotificationManager.from(context);
-notificationManager.notify(notificationId, repliedNotification);
-</pre>
-  </li>
-</ol>
-
-<p>
-  对于交互式应用(例如聊天),这可以用来在处理检索到的文本时添加其他上下文。
-例如,这些应用可以显示多行聊天记录。
-当用户通过 {@link
-  android.support.v4.app.RemoteInput} 回复时,您可以使用 {@code setRemoteInputHistory()} 方法更新回复历史。
-
-</p>
-
-<p>
-  在应用收到远程输入后,必须更新或取消通知。
-如果用户使用直接回复来对远程更新进行回复,则不可取消通知。
-
-否则,更新通知以显示用户的回复。对于使用 {@code MessagingStyle} 的通知,您应该添加回复来作为最新消息。
-
-当使用其它模板时,您可以将用户的回复追加到远程输入历史。
-
-</p>
-
-<h2 id="bundle">捆绑通知</h2>
-
-<p>Android N 为开发者提供了表示通知队列的新方法:
- <i>捆绑通知</i>。这类似于 Android Wear 中的<a href="{@docRoot}training/wearables/notifications/stacks.html">通知堆栈</a>功能。
-
-例如,如果应用为接收的消息创建通知,那么在接收到多个消息时,应用会将通知捆绑在一起成为一个群组。
-
-您可以使用现有的 {@link android.support.v4.app.NotificationCompat.Builder#setGroup
-Builder.setGroup()} 方法捆绑类似的通知。
-</p>
-
-<p>
-  通知组对组内的通知施加层次结构。
-  层次结构的顶层是父级通知,其显示该群组的摘要信息。
-用户可以逐步展开通知组,随着用户深入展开,系统将显示更多信息。
-
-当用户展开捆绑包时,系统将显示其所有子通知的更多信息;当用户展开其中一则通知时,系统显示该通知的所有内容。
-
-
-</p>
-
-<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
-          {@docRoot}preview/images/bundles_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>图 3.</strong>用户可以逐步展开通知组。
-
-</p>
-
-<p class="note">
-  <strong>注:</strong>如果同一应用发送了四条或以上通知,并且未指定分组,系统会自动将它们分到一组。
-
-
-</p>
-
-<p>如需了解如何将通知添加到组,请参阅<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">将各通知添加到组</a>。
-
-</p>
-
-
-<h3 id="best-practices">捆绑通知最佳做法</h3>
-<p>本节提供了有关何时使用通知组而非早期版本 Android 平台中的 {@link android.app.Notification.InboxStyle InboxStyle} 通知的指南。
-
-
-</p>
-
-<h3>何时使用捆绑通知</h3>
-
-<p>只有在您的用例满足以下所有条件时才应使用通知组:
-</p>
-
-<ul>
-  <li>子通知为完整通知,且可以单独显示,无需群组摘要。
-</li>
-  <li>单独显示子通知更合理。例如:
-
-  </li>
-  <ul>
-    <li>子通知可操作,且每个子通知均有特定的操作。</li>
-    <li>子通知中包含用户想要查看的更多信息。</li>
-  </ul>
-</ul>
-
-<p>好的通知组用例示例包括:显示传入消息列表的短信应用,或显示收到的电子邮件列表的电子邮件应用。
-
-</p>
-
-<p>
-适合显示单一通知的用例示例包括:从某一个人收到的单独消息,或以列表表示的单行文本项目。
-
-您可以使用 {@link android.app.Notification.InboxStyle InboxStyle} 或
-{@link android.app.Notification.BigTextStyle BigTextStyle} 实现此功能。
-
-
-</p>
-
-<h3 id ="post">显示捆绑通知</h3>
-
-<p>
-  即使组内仅含有一则子通知,应用也应发布组摘要。
-如果只含有一则通知,系统将取消摘要并直接显示子通知。
-这样可确保用户在滑动切换组内的子通知时,系统仍可以提供一致的用户体验。
-
-
-</p>
-
-<p class="note">
-  <strong>注:</strong>本版本 Android N 目前还无法在仅含一则子通知时取消通知组的摘要。
-我们将在之后版本的 Android N 中添加此功能。
-
-</p>
-
-<h3>扫视通知</h3>
-
-<p>虽然系统通常以群组的方式显示子通知,但您可以进行设置,使其暂时作为<a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">浮动通知</a>显示。
-
-
-该功能非常实用,因为其允许用户立即访问最近的子通知以及与其相关的操作。
-
-</p>
-
-
-<h3>后向兼容性</h3>
-
-<p>
-  自 Android 5.0(API 级别 21)起,{@link
-  android.app.Notification} API 中就添加了通知组和远程输入,以支持 Android Wear 设备。
-如果您已经使用这些 API 构建通知,则只需验证应用行为是否符合上述指南,并考虑实现 {@code
-  setRemoteInputHistory()}。
-
-
-</p>
-
-<p>
-  为了支持后向兼容性,支持库的 {@link android.support.v4.app.NotificationCompat} 类中提供了相同的 API,以便您构建可在早期 Android 版本中运行的通知。
-
-
-在手持式设备和平板电脑上,用户只能看到摘要通知,因此应用应仍提供收件箱式或类似形式的通知显示模式,以显示群组的全部信息内容。
-
-鉴于 Android Wear 设备允许用户查看所有子通知,包括更早级别平台上的通知,您应在不依赖 API 级别的基础上构建子通知。
-
-
-
-</p>
-
-<h2 id="custom"> 自定义视图</h2>
-<p>从 Android N 开始,您将可以自定义通知视图,同时仍可以使用系统装饰元素,例如通知标头、操作和可展开的布局。
-
-</p>
-
-<p>为启用该功能,Android N 添加了以下 API,以便您样式化自己的自定义视图:
-</p>
-
-<dl>
-<dt>
-{@code DecoratedCustomViewStyle()}</dt>
-<dd> 样式化除媒体通知外的其他通知。
-</dd>
-<dt>
-{@code DecoratedMediaCustomViewStyle()}</dt>
-<dd> 样式化媒体通知。</dd>
-</dl>
-
-<p>如需使用这些新 API,可调用 {@code setStyle()} 方法,并向其传递所需的自定义视图样式。
-</p>
-
-<p>此代码段显示了如何使用 {@code DecoratedCustomViewStyle()} 方法构建自定义通知对象。
-</p>
-
-<pre>
-Notification notification = new Notification.Builder()
-           .setSmallIcon(R.drawable.ic_stat_player)
-           .setLargeIcon(albumArtBitmap))
-           .setCustomContentView(contentView);
-           .setStyle(new Notification.DecoratedCustomViewStyle())
-           .build();
-
-</pre>
-
-<h2 id="style">消息传递样式</h2>
-<p>
-  Android N 引入了一项新的 API 来自定义通知样式。
-  使用 <code>MessageStyle</code> 类,您可以更改在通知中显示的多个标签,包括会话标题、其他消息和通知的内容视图。
-
-
-</p>
-
-<p>
-  以下代码段演示了如何使用 <code>MessageStyle</code> 类来自定义通知样式。
-
-</p>
-
-<pre>
-  Notification notification = new Notification.Builder()
-             .setStyle(new Notification.MessagingStyle("Me")
-                 .setConversationTitle("Team lunch")
-                 .addMessage("Hi", timestamp1, null) // Pass in null for user.
-                 .addMessage("What's up?", timestamp2, "Coworker")
-                 .addMessage("Not much", timestamp3, null)
-                 .addMessage("How about lunch?", timestamp4, "Coworker"));
-</pre>
diff --git a/docs/html-intl/intl/zh-tw/about/versions/nougat/index.jd b/docs/html-intl/intl/zh-tw/about/versions/nougat/index.jd
index e899bc0..d4db467 100644
--- a/docs/html-intl/intl/zh-tw/about/versions/nougat/index.jd
+++ b/docs/html-intl/intl/zh-tw/about/versions/nougat/index.jd
@@ -1,6 +1,6 @@
-page.title=Android N Developer Preview
-page.tags="preview","developer"
-meta.tags="preview", "android"
+page.title=Android 7.0 Nougat
+page.tags="androidn","versions"
+meta.tags="android n", "nougat", "android 7.0"
 fullpage=true
 forcelocalnav=true
 header.hide=1
@@ -17,66 +17,61 @@
   })
 </script>
 
-<section class="dac-expand dac-hero dac-light" style="background-color:#B2DFDB">
+<section class="dac-expand dac-hero dac-light">
   <div class="wrap" style="max-width:1100px;margin-top:0">
+  <a href="{@docRoot}about/versions/nougat/android-7.0.html">
     <div class="cols dac-hero-content" style="padding-bottom:1em;">
 
-      <div class="col-7of16 col-push-9of16" style="padding-left:2em">
-        <h1 class="dac-hero-title">Android N Developer Preview</h1>
+      <div class="col-7of16 col-push-8of16" style="padding-left:2em">
+        <h1 class="dac-hero-title">Android 7.0 Nougat</h1>
         <p class="dac-hero-description">
-          為 Android N 做好準備!
+        為 Android Nougat 做好準備!
           在 Nexus 與其他裝置上<strong>測試您的應用程式</strong>。支援新系統行為以<strong>節省電力與記憶體</strong>。使用<strong>多視窗 UI</strong>、<strong>直接回覆通知</strong>等延伸您的應用程式。
 
 
 
         </p>
 
-        <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+        <a class="dac-hero-cta" href="{@docRoot}about/versions/nougat/android-7.0.html">
           <span class="dac-sprite dac-auto-chevron"></span>
-          開始使用</a>
-<!--<br>
-        <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
-          Update to Android N (final SDK)
-        </a><br>-->
+          開始使用
+        </a>
       </div>
-      <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
-        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png" srcset="{@docRoot}images/home/n-preview-hero.png 1x,
-             {@docRoot}images/home/n-preview-hero_2x.png 2x">
+      <div class="col-7of16 col-pull-6of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
+        <a  href="{@docRoot}about/versions/nougat/android-7.0.html">
+        <img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png"
+             srcset="{@docRoot}images/home/n-preview-hero.png 1x,
+             {@docRoot}images/home/n-preview-hero_2x.png 2x" />
+           </a>
       </div>
-    </div>
+    </div></a>
     <div class="dac-section dac-small">
       <div class="resource-widget resource-flow-layout col-16"
-           data-query="collection:preview/landing/resources"
+           data-query="collection:nougat/landing/resources"
            data-cardSizes="6x2"
-           data-maxResults="6"></div>
-    </div>
+           data-maxResults="3"></div>
+         </div>
   </div>
 </section>
 
+
 <div id="useUpdatedTemplates" style="display:none" class="dac-section dac-slim dac-gray dac-expand">
   <div class="wrap dac-offset-parent">
-    <a class="dac-fab dac-scroll-button" data-scroll-button href="#build-apps">
+    <a class="dac-fab dac-scroll-button" data-scroll-button href="#latest">
       <i class="dac-sprite dac-arrow-down-gray"></i>
     </a>
     <ul class="dac-actions">
       <li class="dac-action">
-        <a class="dac-action-link" href="https://developer.android.com/preview/bug">
+        <a class="dac-action-link" href="https://source.android.com/source/report-bugs.html">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
           回報問題
-</a>
-      </li>
-      <li class="dac-action">
-        <a class="dac-action-link" href="{@docRoot}preview/support.html">
-          <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
-          查看版本資訊</a>
-
+        </a>
       </li>
       <li class="dac-action">
         <a class="dac-action-link" href="{@docRoot}preview/dev-community">
           <i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
-          加入開發人員社群</a>
-
+          加入開發人員社群
+        </a>
       </li>
     </ul>
   </div><!-- end .wrap -->
@@ -102,19 +97,44 @@
   </div><!-- end .wrap -->
 </div>
 
-<section class="dac-section dac-light"><div class="wrap">
-  <h1 class="dac-section-title">資源</h1>
+<section class="dac-section dac-light dac-small" id="latest"><div class="wrap">
+  <h2 class="norule">Latest</h2>
+  <div class="resource-widget resource-flow-layout col-16"
+    data-query="type:blog+tag:androidn+tag:featured, type:youtube+tag:androidn+tag:featured"
+    data-sortOrder="-timestamp"
+    data-cardSizes="6x6"
+    data-items-per-page="6"
+    data-maxResults="15"
+    data-initial-results="3"></div>
+</div></section>
+
+<section class="dac-section dac-gray" id="videos"><div class="wrap">
+  <h1 class="dac-section-title">Videos</h1>
   <div class="dac-section-subtitle">
-    以下重要資訊可幫助您的應用程式準備好使用 Android N。
+    New Android capabilities and the right way to use them in your apps.
   </div>
 
   <div class="resource-widget resource-flow-layout col-16"
-       data-query="collection:preview/landing/more"
+    data-query="collection:nougat/landing/videos/first,type:youtube+tag:androidn"
+    data-sortOrder="-timestamp"
+    data-cardSizes="6x6"
+    data-items-per-page="6"
+    data-maxResults="15"
+    data-initial-results="3">
+  </div>
+</div></section>
+
+<section class="dac-section dac-light" id="resources"><div class="wrap">
+  <h1 class="dac-section-title">資源</h1>
+  <div class="dac-section-subtitle">
+    以下重要資訊可幫助您的應用程式準備好使用 Android Nougat。
+  </div>
+
+  <div class="resource-widget resource-flow-layout col-16"
+       data-query="collection:nougat/landing/more"
        data-cardSizes="6x6"
        data-items-per-page="6"
        data-maxResults="15"
        data-initial-results="6"></div>
-
   </div>
-</section>
-
+</section>
\ No newline at end of file
diff --git a/docs/html-intl/intl/zh-tw/index.jd b/docs/html-intl/intl/zh-tw/index.jd
index a5772ef..540801a 100644
--- a/docs/html-intl/intl/zh-tw/index.jd
+++ b/docs/html-intl/intl/zh-tw/index.jd
@@ -15,33 +15,30 @@
   })
 </script>
 
-<section class="dac-expand dac-hero dac-invert" style="background-color:#455A64">
-  <div class="wrap" style="max-width:1100px;margin-top:0">
-    <div class="col-7of16 col-push-9of16" style="padding-left:2em;">
-      <a href="{@docRoot}preview/index.html">
-        <h1 class="dac-hero-title">Android N Developer Preview</h1>
-        <p class="dac-hero-description">
-          Get ready for the next version of Android!
-          <strong>Test your apps</strong> on Nexus and other devices. Support new system
-          behaviors to <strong>save power and memory</strong>.
+<section class="dac-expand dac-hero" style="background-color:#b2dfdb;">
+  <div class="wrap" style="max-width:1000px;margin-top:0">
+    <div class="col-7of16 col-push-8of16">
+      <a href="{@docRoot}about/versions/nougat/index.html">
+        <h1 class="dac-hero-title" style="color:#004d40">Android 7.0 Nougat!</h1>
+        <p class="dac-hero-description" style="color:#004d40">
+          <strong>Android 7.0 Nougat is here!</strong>
+          Get your apps ready for the latest version of Android, with new system
+          behaviors to <strong>save battery and memory</strong>.
           Extend your apps with <strong>multi-window UI</strong>,
           <strong>direct reply notifications</strong> and more.
         </p>
-        <a class="dac-hero-cta" href="/preview/index.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
+        <a class="dac-hero-cta" href="{@docRoot}about/versions/nougat/index.html" style="color:#004d40">
+          <span class="dac-sprite dac-auto-chevron" style="background-color:#b2dfdb"></span>
           Learn more
-        </a><!--<br>
-        <a class="dac-hero-cta" href="/preview/support.html">
-          <span class="dac-sprite dac-auto-chevron"></span>
-          Update to Developer Preview (final SDK)
-        </a><br>-->
+        </a>
+        </a>
       </a>
     </div>
-    <div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:0em;padding-right:1.5em;">
-      <a href="{@docRoot}preview/index.html">
-        <img style="" class="dac-hero-image" src="/images/home/n-preview-hero.png"
-             srcset="/images/home/n-preview-hero.png 1x,
-             /images/home/n-preview-hero_2x.png 2x">
+    <div class="col-6of16 col-pull-6of16 dac-hero-figure" style="padding-left:1em;padding-top:1em;">
+      <a href="{@docRoot}about/versions/nougat/index.html">
+        <img class="dac-hero-image" src="{@docRoot}images/home/nougat_bg.jpg"
+             srcset="{@docRoot}images/home/nougat_bg.jpg 1x,
+             {@docRoot}images/home/nougat_bg_2x.jpg 2x">
         </a>
     </div>
   </div>
diff --git a/docs/html-intl/intl/zh-tw/preview/download_mp2.jd b/docs/html-intl/intl/zh-tw/preview/download_mp2.jd
deleted file mode 100644
index 3b54080..0000000
--- a/docs/html-intl/intl/zh-tw/preview/download_mp2.jd
+++ /dev/null
@@ -1,359 +0,0 @@
-page.title=下載
-page.image=images/cards/card-download_16-9_2x.png
-
-@jd:body
-
-<div style="position:relative; min-height:600px">
-
-  <div class="wrap" id="tos" style="position:absolute;display:none;width:inherit;">
-
-    <p class="sdk-terms-intro">在下載和安裝 Android 預覽版
-SDK 的元件之前 ,您必須同意遵守下列條款和條件。</p>
-
-    <h2 class="norule">條款和條件</h2>
-
-    <div class="sdk-terms" onfocus="this.blur()" style="width:678px">
-這是「Android SDK 預覽版授權協議」(以下稱「授權協議」)。
-
-1.簡介
-
-1.1「Android SDK 預覽版」(在「授權協議」中稱為「預覽版」,包括 (如果有可用的) Android 系統檔案、經過封裝的 API 和預覽版程式庫檔案) 是在「授權協議」之條款的約束下授權給您使用。「授權協議」就您對「預覽版」的使用,構成您與 Google 間具法律約束力之合約。
-
-1.2「Android」係指「Android 軟體開放原始碼專案」(http://source.android.com/) 所提供的 Android 裝置軟體堆疊 (不定期更新)。
-
-1.3「Google」係指 Google Inc.,是一家在美國德拉瓦州註冊的公司,地址為 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States。
-
-2.接受「授權協議」
-
-2.1 必須先同意遵守「授權協議」,才能使用此「預覽版」。如果不接受「授權協議」,您就無法使用此「預覽版」。
-
-2.2 按一下 [接受] 且/或使用「預覽版」,即表示您同意「授權協議」的條款。
-
-2.3 如果您是美國或其他國家/地區 (包括您所居住或使用此「預覽版」的國家/地區) 的法律所禁止接收此「預覽版」的人員,就不得使用此「預覽版」及接受「授權協議」。
-
-2.4 如果您將在公司或組織內部使用「預覽版」,您就要代表雇主或其他實體同意受「授權協議」約束,且您代表並保證具備完整法定權限來約束您的雇主或這類實體遵守「授權協議」。如果您不具備必要的權限,就不得代表您的雇主或其他實體接受「授權協議」或使用此「預覽版」。
-
-3.Google 的預覽版授權
-
-3.1 在「授權協議」之條款的約束下,Google 授權您使用此「預覽版」,此授權為買斷式、不可轉讓、非獨占性、不可轉授權、有限且可撤銷,僅在您公司或組織內部私下或內部使用。此「預覽版」僅供您用於開發在 Android 平台上執行的應用程式。
-
-3.2 您同意 Google 或第三方對此「預覽版」擁有一切法定權利及權益,包括存在於此「預覽版」中的任何「智慧財產權」。「智慧財產權」係指專利法、著作權法、商業秘密法、商標法及任何和所有其他專利權下的任何及一切權利。Google 保留一切未明確授予您的權利。
-
-3.3 您不得將此「預覽版」用於「授權協議」未明文許可的任何用途。除非適用的第三方授權所需,否則您不得:(a) 對此「預覽版」或其任何部分進行複製 (備份用途除外)、修改、改編、轉散佈、反向組譯、還原工程、解編或製作衍生成品;或是 (b) 將此「預覽版」的任何部分載入至行動電話或個人電腦以外的任何其他硬體裝置、將此「預覽版」的任何部分與其他軟體結合,或散佈包含此「預覽版」之任一部分的任何軟體或裝置。
-
-3.4 您同意不會從事任何可能導致或造成 Android 分裂的活動,包括但不限於以任何形式散佈從此「預覽版」衍生的軟體開發套件、參其製作或宣傳。
-
-3.5 對開放原始碼軟體授權下所授權之「預覽版」的使用、複製及散佈,完全受該開放原始碼軟體授權的條款管制,而不受「授權協議」管制。您同意遵守從這類開放原始碼軟體授權獲得的所有權利,並且避免採取任何可能終止、中止或侵害這類權利的行為。
-
-3.6 您同意 Google 可在不事先通知您的情況下變更其所提供之「預覽版」的形式和本質,且此「預覽版」的未來版本可與在此「預覽版」的先前版本上開發的應用程式不相容。您同意 Google 通常可全權斟酌永久或暫時停止提供此「預覽版」(或此「預覽版」的任何功能) 給您或使用者,毋須事先通知。
-
-3.7「授權協議」中的所有條款皆未授予您任何使用 Google 之商業名稱、商標、服務標章、標誌、網域名稱或其他明確品牌特徵的權利。
-
-3.8 您同意不會移除、遮蔽或更改可能附加至或內含在此「預覽版」中的任何專利權通知 (包括著作權和商標通知)。
-
-4.您對「預覽版」的使用
-
-4.1 Google 同意在「授權協議」下,任何條款皆未從您 (或您的授權人) 賦予 Google 對您使用此「預覽版」開發之任何軟體應用程式的任何權利及權益,包括存在於這些應用程式中的任何智慧財產權。
-
-4.2 您同意只就 (a)「授權協議」和 (b) 相關管轄權中任何適用法律、規定或是普遍獲得接受之慣例或指導方針 (包括任何有關將資料或軟體輸出或輸入美國或其他相關國家/地區的法律) 所允許的用途使用此「預覽版」及撰寫應用程式。
-
-4.3 您同意如果使用此「預覽版」開發應用程式,您將保護使用者的隱私權和法定權利。如果使用者提供您使用者名稱、密碼或是其他登入資訊或個人資訊,您必須告知使用者這類資訊將提供給您的應用程式使用,並且必須為這些使用者提供法定充分的隱私權通知和保護。如果您的應用程式會儲存使用者所提供的個人或敏感資訊,它必須確保這些資訊安全無虞。如果使用者提供 Google 帳戶資訊給您,則只有在每個使用者已授權您存取其 Google 帳戶並僅限用於使用者所授權之用途的情況下,您的應用程式才能使用該資訊來存取使用者的 Google 帳戶。
-
-4.4 您同意不會使用此「預覽版」從事任何不當Activity,例如開發或散佈會以未經授權的方式干擾、妨礙、損害或存取 Google 或任何第三方之伺服器、網路或是其他財產或服務的應用程式。
-
-4.5 您同意對您透過 Android 裝置和 (或) Android 應用程式建立、傳輸或顯示的任何資料、內容或資源,以及上述行為造成的後果 (包括 Google 可能蒙受的任何損失或損害) 負起全責 (而 Google 對您或任何第三方就上述一切不需負任何責任)。
-
-4.6 您同意對違反在此「授權協議」、任何適用之第三方合約或《服務條款》或是任何適用之法律或規定下所必須遵守的義務,以及違反相關義務造成的後果 (包括 Google 或任何第三方可能蒙受的任何損失或損害) 負起全責 (而 Google 對您或任何第三方就上述一切不需負任何責任)。
-
-4.7「預覽版」目前正在開發中,因此您的測試與意見反應對開發程序非常重要。使用「預覽版」,您即認同某些功能仍處於開發階段,因此您不應期待「預覽版」擁有穩定版本的完整功能。在官方 Android SDK 發行之後,此「預覽版」不再受到支援時,您同意不使用此「預覽版」公開散佈或隨附任何應用程式。
-
-5.您的開發人員認證
-
-5.1 您同意負責保密 Google 可能核發給您或您自己選擇的任何開發人員認證,並且對在您開發人員認證名義下開發的所有應用程式負起全責。
-
-6.隱私權和資訊
-
-6.1 為了持續更新及改進此「預覽版」,Google 可能會從軟體收集某些使用狀況統計數據,包括但不限於軟體的唯一識別碼、相關 IP 位址、版本號碼,以及有關使用此「預覽版」中的哪些工具和 (或) 服務及其使用方式的相關資訊。在收集這類資訊之前,此「預覽版」會先通知您並徵求您的同意。如果您不同意,Google 將不會收集這類資訊。
-
-6.2 Google 會彙總並檢查收集到的資料,據以改善此「預覽版」,並且會依據《Google 隱私權政策》(http://www.google.com/policies/privacy/) 加以妥善保存。
-
-7.第三方應用程式
-
-7.1 如果您使用此「預覽版」來執行第三方開發的應用程式,或是執行會存取第三方所提供之資料、內容或資源的應用程式,您同意 Google 不需對這類應用程式、資料、內容或資源負任何責任。您瞭解您透過第三方應用程式存取的所有資料、內容或資源是由其提供者負起全責,而 Google 對您因使用或存取任何這些第三方應用程式、資料、內容或資源所造成的損失或損害不需負任何責任。
-
-7.2 您瞭解第三方應用程式提供給您的資料、內容或資源可能受到提供者 (或代表他們的其他人員或公司) 所擁有的智慧財產權保護。您不得根據這類資料、內容或資源 (不論是整個或部分) 修改、出租、出借、販售、散佈或製作衍生成品,除非相關擁有者明確授權您從事上述活動。
-
-7.3 您瞭解使用第三方應用程式、資料、內容或資源可能受到您與相關第三方之間的個別條款約束。
-
-8.使用 Google API
-
-8.1 Google API
-
-8.1.1 如果您使用任何 API 從 Google 擷取資料,您瞭解這些資料可能受到 Google 或資料提供者 (或代表他們的其他人員或公司) 所擁有的智慧財產權保護。您對任何這類 API 的使用可能受到其他《服務條款》約束。除非相關《服務條款》明文允許,否則您不得根據這類資料 (不論是整個或部分) 修改、出租、出借、販售、散佈或製作衍生成品。
-
-8.1.2 使用任何 API 從 Google 擷取使用者的資料時,您瞭解並同意只有在該使用者明確同意且授權您擷取其資料,而且僅限用於使用者所授權之用途的情況下,您才能擷取資料。
-
-9.終止「授權協議」
-
-9.1 除非您或 Google 終止「授權協議」(請見下方說明),否則「授權協議」將持續具有效力。
-
-9.2 如果想終止「授權協議」,只要停止使用此「預覽版」及任何相關的開發人員憑證即可。
-
-9.3 Google 可隨時通知您終止「授權協議」,無論有無原因。
-
-9.4「授權協議」在先發生下列任一情況時,將自動終止而不另行通知或採取其他行動:
-(A) Google 決定不再提供此「預覽版」或此「預覽版」的特定部分給您所居住或使用此服務之國家/地區的使用者;或
-(B) Google 發行最終版本的 Android SDK。
-
-9.5 當「授權條款」終止時,您在「授權協議」所獲得的授權也將會一併終止,您將立即停止「預覽版」的所有使用,而第 10、11、12 和 14 項的條款將無限期持續適用。
-
-10.免責聲明
-
-10.1 您明確瞭解並同意完全自負使用此「預覽版」的風險,並且此「預覽版」是依「現況」和「可提供性」提供,Google 不負任何擔保責任。
-
-10.2 您對使用此「預覽版」及透過此「預覽版」以下載或其他方式取得的任何內容,需自行斟酌和自負風險,而且您對因這類使用而對您的電腦系統或其他裝置所造成的任何損害或資料遺失,需負起全責。不限於前述,您瞭解此「預覽版」不是穩定的版本,可能會包含許多錯誤、瑕疵和安全性弱點而對您的電腦系統或其他裝置造成嚴重的損害,包括完全、不可回復的損失。
-
-10.3 Google 進一步明確表示不提供任何形式的瑕疵擔保和條件 (不論明示或默示),包括但不限於適售性、適合特定用途及未侵權的默示擔保和條件。
-
-11.責任限制
-
-11.1 您明確瞭解並同意在任何歸責理論下,就可能由您引起的任何直接、間接、附隨性、特殊性、衍生性或懲罰性損害賠償 (包括任何資料遺失),不論 Google 或其代表是否已獲告知或應已瞭解發生任何這類損失的可能性,Google、其子公司和關係企業及其授權人不必對您負起任何責任。
-
-12.賠償
-
-12.1 在法律允許的最大範圍內,您同意為 Google、其子公司及其個別董監事、主管、員工和代理人,就任何和一切索賠、法律行動、訴訟或訴訟程序,以及因下列原因而引起的任何和一切損失、責任、損害賠償、費用及開支 (包括合理的律師費),提供辯護、賠償損失並確保其免於承擔賠償責任:(a) 您使用此「預覽版」;(b) 您使用此「預覽版」開發的應用程式侵害任何人的任何智慧財產權,或是詆毀任何人或違反其公開權或隱私權;以及 (c) 您未遵守「授權協議」。
-
-13.對「授權協議」做出的變更
-
-13.1 Google 可在散佈此「預覽版」的新版本時修改「授權協議」。做出這類變更後,Google 會在提供此「預覽版」的網站上提供「授權協議」的新版本。
-
-14.一般法律條款
-
-14.1「授權協議」構成您與 Google 之間的法律協議,用於管制您對此「預覽版」(不包括 Google 依據個別書面協議提供給您的任何服務) 的使用,並完全取代先前您與 Google 之間就此「預覽版」簽署的相關協議。
-
-14.2 您同意如果 Google 未行使或執行「授權協議」所含的任何法律權利或救濟 (或在任何適用法律下對 Google 有利的權益),並不代表 Google 正式放棄權利,Google 日後仍可行使這些權利或救濟。
-
-14.3 如果經任何法院 (就此事宜依管轄權決定) 裁決「授權協議」中有任何條款無效,則該條款將自「授權協議」中移除,「授權協議」的其餘部分則不受影響。「授權協議」的其餘條款將持續具有效力且可執行。
-
-14.4 您瞭解並同意 Google 旗下子公司體系的每位成員都是「授權協議」的第三方受益人,而且這類其他公司有權直接執行和依據「授權協議」中對其授予權益 (或對其有利之權利) 的任何條款。除此之外的任何其他人員或公司皆非「授權協議」的第三方受益人。
-
-14.5 出口限制。此「預覽版」受美國出口法規約束。您必須遵守適用於此「預覽版」的所有國內和國際出口法規。這些法律包括對目的地、使用者及最終用途的限制。
-
-14.6 未事先取得 Google 事先書面核准的情況下,您不得轉讓或轉移「授權協議」,未經這類核准的任何轉讓將會失效。您不得在未事先取得 Google 書面核准的情況下,委派其「授權協議」涵蓋的責任或義務。
-
-14.7「授權協議」以及您與 Google 就「授權協議」構成的關係皆受加州法律管轄,毋須理會其法律牴觸條款。您和 Google 同意服從位於加州聖塔克拉拉 (Santa Clara, California) 郡內法院的專屬管轄權,以解決由「授權協議」產生的任何法律事務。儘管如此,您同意 Google 仍可在任何管轄權中申請禁制令救濟 (或同等類型的緊急法定救濟)。
-  </div><!-- sdk terms -->
-
-
-
-    <div id="sdk-terms-form">
-      <p>
-        <input id="agree" type="checkbox" name="agree" value="1" onclick="onAgreeChecked()" />
-        <label id="agreeLabel" for="agree">我已閱讀並同意上述條款及細則</label>
-      </p>
-      <p><a href="" class="button disabled" id="downloadForRealz" onclick="return onDownloadForRealz(this);"></a></p>
-    </div>
-
-
-  </div><!-- end TOS -->
-
-
-  <div id="landing">
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>本文件內容</h2>
-      <ol>
-        <li><a href="#sdk">預覽版 SDK</a></li>
-        <li><a href="#docs">開發人員文件</a></li>
-        <li><a href="#images">硬體系統映像</a></li>
-      </ol>
-     <h2>Legacy downloads</h2>
-        <ol>
-           <li><a href="{@docRoot}preview/download_mp1.html">Developer Preview Archive</a></li>
-        </ol>
-  </div>
-</div>
-
-
-<p>
-  Android M 預覽版 SDK 有開發工具、Android 系統檔案以及程式庫檔案,可以幫助測試您的應用程式和下一個平台版本隨附的新 API。
-本文件會說明如何取得可下載的預覽版元件來測試您的應用程式。
-
-</p>
-
-
-<h2 id="sdk">預覽版 SDK</h2>
-
-<p>
-  預覽版 SDK 可透過 <a href="{@docRoot}tools/help/sdk-manager.html">Android SDK 管理器</a>下載取得。如需有關下載和設定預覽版 SDK 的詳細資訊,請參閱<a href="{@docRoot}preview/setup-sdk.html#downloadSdk">設定預覽版 SDK</a>。
-
-</p>
-
-
-<h2 id="docs">開發人員文件</h2>
-
-<p>
-  開發人員文件下載套件提供詳細的 API 參考資料和預覽版的 API 差異報告。
-</p>
-
-<table>
-  <tr>
-    <th scope="col">Description</th>
-    <th scope="col">Download / Checksums</th>
-  </tr>
-  <tr id="docs-dl">
-    <td>Android M Preview 2<br>Developer Docs</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >m-preview-2-developer-docs.zip</a><br>
-      MD5: 1db6fff9c722b0339757e1cdf43663a8<br>
-      SHA-1: 5a4ae88d644e63824d21b0e18f8e3977a7665157
-    </td>
-  </tr>
-</table>
-
-
-<h2 id="images">硬體系統映像</h2>
-
-<p>
-  這些系統映像可以讓您在實體裝置上安裝預覽版的平台來進行測試。
-使用其中一個映像設定裝置,您就可以安裝並測試您的應用程式,瞭解應用程式在下一個版本的平台上表現如何。
-在裝置上安裝系統映像的過程中,會「移除裝置當中所有的資料」,因此您應該在安裝系統映像之前備份您的資料。<em></em>
-
-
-</p>
-
-<p class="warning">
-  <b>警告:</b>下列 Android 系統映像是預覽版,可能隨時會有變更。使用這些系統映像受到「Android SDK 預覽版授權協議」的約束。
-Android 預覽版系統映像還不是穩定的版本,可能會包含許多錯誤和瑕疵而對您的電腦系統、裝置和資料造成損害。
-
-預覽版的 Android 系統映像與出廠作業系統的測試不同,可能會導致您的手機和安裝的服務與應用程式停止運作。
-
-
-</p>
-
-<table>
-  <tr>
-    <th scope="col">Device</th>
-    <th scope="col">Download / Checksums</th>
-  </tr>
-  <tr id="hammerhead">
-    <td>Nexus 5 (GSM/LTE) <br>"hammerhead"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >hammerhead-MPZ79M-preview-b1f4bde4.tgz</a><br>
-      MD5: 2ca9f18bf47a061b339bab52647ceb0d<br>
-      SHA-1: b1f4bde447eccbf8ce5d9b8b8ba954e3eac8e939
-    </td>
-  </tr>
-  <tr id="shamu">
-    <td>Nexus 6 <br>"shamu"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >shamu-MPZ79M-preview-e1024040.tgz</a><br>
-      MD5: 24a2118da340b9afedfbdfc026f6ff81<br>
-      SHA-1: e10240408859d5188c4aae140e1c539130ba614b
-    </td>
-  </tr>
-  <tr id="volantis">
-    <td>Nexus 9 <br>"volantis"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >volantis-MPZ79M-preview-9f305342.tgz</a><br>
-      MD5: 9edabf0a4c61b247f1cbb9dfdc0a899e<br>
-      SHA-1: 9f30534216f10899a6a75495fc7e92408ea333a7
-    </td>
-  </tr>
-
-  <tr id="fugu">
-    <td>Nexus Player <br>"fugu"</td>
-    <td><a href="#top" onclick="onDownload(this)"
-      >fugu-MPZ79N-preview-fb63af98.tgz</a><br>
-      MD5: e8d081137a20b66df595ee69523314b5<br>
-      SHA-1: fb63af98302dd97be8de9313734d389ccdcce250
-    </td>
-  </tr>
-
-</table>
-
-<h3 id="install-image">在裝置上安裝映像</h3>
-
-<p>
-  如果要使用裝置映像進行測試,您必須先在相容的裝置上安裝映像。請依照下面的指示安裝系統映像:
-
-</p>
-
-<ol>
-  <li>下載此處列出的其中一個系統映像,然後解壓縮。</li>
-  <li>備份您要保留的所有裝置資料。</li>
-  <li>依照
-<a href="https://developers.google.com/android/nexus/images#instructions">developers.google.com/android</a>
-的指示,將映像更新到您的裝置。</li>
-</ol>
-
-<p class="note">
-  <strong>注意:</strong>在您使用預覽版系統映像更新開發裝置之後,裝置就會透過無線 (OTA) 更新方式自動升級為下一個預覽版版本。
-
-</p>
-
-<h3 id="revertDevice">將裝置還原成出廠規格</h3>
-
-<p>
-  如果您要解除安裝預覽版並將裝置還原成出廠規格,請至
-<a href="http://developers.google.com/android/nexus/images">developers.google.com/android</a> 並下載您要為裝置更新的映像。
-依照該頁面的指示,將映像更新到您的裝置。
-
-</p>
-
-  </div><!-- landing -->
-
-</div><!-- relative wrapper -->
-
-
-
-<script>
-  var urlRoot = "http://storage.googleapis.com/androiddevelopers/shareables/preview/";
-  function onDownload(link) {
-
-    $("#downloadForRealz").html("Download " + $(link).text());
-    $("#downloadForRealz").attr('href', urlRoot + $(link).text());
-
-    $("#tos").fadeIn('fast');
-    $("#landing").fadeOut('fast');
-
-    return true;
-  }
-
-
-  function onAgreeChecked() {
-    /* verify that the TOS is agreed */
-    if ($("input#agree").is(":checked")) {
-      /* reveal the download button */
-      $("a#downloadForRealz").removeClass('disabled');
-    } else {
-      $("a#downloadForRealz").addClass('disabled');
-    }
-  }
-
-  function onDownloadForRealz(link) {
-    if ($("input#agree").is(':checked')) {
-    /*
-      $("#tos").fadeOut('fast');
-      $("#landing").fadeIn('fast');
-    */
-
-      ga('send', 'event', 'M Preview', 'System Image', $("#downloadForRealz").html());
-
-    /*
-      location.hash = "";
-    */
-      return true;
-    } else {
-      return false;
-    }
-  }
-
-  $(window).hashchange( function(){
-    if (location.hash == "") {
-      location.reload();
-    }
-  });
-
-</script>
diff --git a/docs/html-intl/intl/zh-tw/preview/features/background-optimization.jd b/docs/html-intl/intl/zh-tw/preview/features/background-optimization.jd
deleted file mode 100644
index 123498b..0000000
--- a/docs/html-intl/intl/zh-tw/preview/features/background-optimization.jd
+++ /dev/null
@@ -1,390 +0,0 @@
-page.title=背景最佳化
-page.metaDescription=對隱含式廣播的新限制。
-page.keywords="android N", "implicit broadcasts", "job scheduler"
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>
-      此文件內容
-    </h2>
-
-    <ol>
-      <li>
-        <a href="#connectivity-action">CONNECTIVITY_ACTION 上的限制</a>
-      </li>
-
-      <li>
-        <a href="#sched-jobs">在非計量付費連線上排程網路工作</a>
-
-      </li>
-
-      <li>
-        <a href="#monitor-conn">監視應用程式執行時的網路連線能力</a>
-
-      </li>
-
-      <li>
-        <a href="#media-broadcasts">NEW_PICTURE 與 NEW_VIDEO 上的限制</a>
-
-      </li>
-
-      <li>
-        <a href="#new-jobinfo">新的 JobInfo 方法</a>
-      </li>
-
-      <li>
-        <a href="#new-jobparam">新的 JobParameter 方法</a>
-      </li>
-
-      <li>
-        <a href="#further-optimization">進一步最佳化您的應用程式</a>
-      </li>
-    </ol>
-  </div>
-</div>
-
-<p>
-  背景處理程序可能耗用大量的記憶體或電池電力。例如,隱含式廣播可能會啟動許多已註冊要接聽它的背景處理程序,即使那些處理程序可能不會執行太多工作。
-
-這可能會對裝置效能與使用者體驗兩者造成實質影響。
-
-</p>
-
-<p>
-  為減輕此問題,N Developer Preview 套用下列限制:
-
-</p>
-
-<ul>
-  <li>目標為 Preview 的應用程式,如果在宣示說明中註冊以接收廣播,則不會收到 {@link
-  android.net.ConnectivityManager#CONNECTIVITY_ACTION} 廣播。
-在前景執行的應用程式,只要使用 {@link
-  android.content.Context#registerReceiver Context.registerReceiver()} 註冊 {@link android.content.BroadcastReceiver},即可在主要執行緒中接聽 {@code CONNECTIVITY_CHANGE}。
-
-
-  </li>
-
-  <li>應用程式無法傳送或接收 {@link
-  android.hardware.Camera#ACTION_NEW_PICTURE} 或 {@link
-  android.hardware.Camera#ACTION_NEW_VIDEO} 廣播。這種最佳化方式會影響所有應用程式,而不只是目標為 Preview 的應用程式。
-
-  </li>
-</ul>
-
-<p>
-  Android 架構提供數種解決方案來減少這些隱含式廣播的需求。
-例如,{@link android.app.job.JobScheduler} 與 <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-  {@code GcmNetworkManager}</a> 提供的健全機制,可在符合指定條件 (例如,連線到非計量付費網路) 的情況下排程網路操作。
-
-
-您甚至可以使用 {@link android.app.job.JobScheduler} 對內容提供者的變更採取因應動作。{@link android.app.job.JobInfo} 物件會封裝 {@link android.app.job.JobScheduler} 用來排程您的工作的參數。
-
-
-符合工作的條件時,系統會在應用程式的 {@link android.app.job.JobService} 上執行此工作。
-
-</p>
-
-<p>
-  在此文件中,我們將學習如何使用替代方法 (例如
-  {@link android.app.job.JobScheduler}) 改寫您的應用程式以配合這些新的限制。
-
-</p>
-
-<h2 id="connectivity-action">
-  CONNECTIVITY_ACTION 上的限制
-</h2>
-
-<p>
-  目標為 N Developer Preview 的應用程式,如果在宣示說明中註冊以接收廣播,則不會收到 {@link
-  android.net.ConnectivityManager#CONNECTIVITY_ACTION} 廣播,而相依於此廣播的處理程序將不會啟動。
-
-這可能會在裝置連線到非計量付費網路時,對想要接聽網路變更或執行大量網路活動的應用程式造成問題。
-
-Android 架構中已經有數個可以避過此限制的解決方案,但是選擇適當的方法取決於您想要應用程式完成什麼工作。
-
-
-</p>
-
-<p class="note">
-  <strong>注意:</strong>使用
-  {@link android.content.Context#registerReceiver Context.registerReceiver()}
- 註冊的 {@link android.content.BroadcastReceiver} 會在應用程式位於前景時繼續接收這些廣播。
-</p>
-
-<h3 id="sched-jobs">
-  在非計量付費連線上排程網路工作
-</h3>
-
-<p>
-  使用 {@link android.app.job.JobInfo.Builder JobInfo.Builder} 類別建置 {@link android.app.job.JobInfo} 物件時,請套用 {@link
-  android.app.job.JobInfo.Builder#setRequiredNetworkType
-  setRequiredNetworkType()} 方法並傳遞 {@link android.app.job.JobInfo
-  JobInfo.NETWORK_TYPE_UNMETERED} 當做工作參數。
-下列程式碼範例會排程服務,讓它在裝置連線到非計量付費網路和收費時執行:
-
-
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-      (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo job = new JobInfo.Builder(
-    MY_BACKGROUND_JOB,
-    new ComponentName(context, MyJobService.class))
-      .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
-      .setRequiresCharging(true)
-      .build();
-  js.schedule(job);
-}
-</pre>
-
-<p>
-  符合您工作的條件時,您的應用程式會收到一個回呼,在指定的 {@code JobService.class} 中執行{@link android.app.job.JobService#onStartJob onStartJob()} 方法。
-
-如果要檢視更多 {@link
-  android.app.job.JobScheduler} 實作的範例,請參閱 <a href="{@docRoot}samples/JobScheduler/index.html">JobScheduler 範例應用程式</a>。
-</p>
-
-<p>
-  使用 GMSCore 服務且目標為 Android 5.0 (API 層級 21) 或更低的應用程式,可以使用 <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
-  {@code GcmNetworkManager}</a> 並指定 {@code Task.NETWORK_STATE_UNMETERED}。
-
-</p>
-
-<h3 id="monitor-conn">
-  監視應用程式執行時的網路連線能力
-</h3>
-
-<p>
-  在前景執行的應用程式,只要使用註冊的 {@link
-  android.content.BroadcastReceiver} ,仍然可以接聽 {@code
-  CONNECTIVITY_CHANGE}。然而,{@link
-  android.net.ConnectivityManager} API 提供更建全的方法,只在符合指定的網路條件時才要求回呼。
-
-</p>
-
-<p>
-  {@link android.net.NetworkRequest} 物件以 {@link android.net.NetworkCapabilities} 的方式定義網路回呼的參數。
-您使用 {@link
-  android.net.NetworkRequest.Builder NetworkRequest.Builder} 類別建立{@link android.net.NetworkRequest} 物件。接著 {@link
-  android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,
-  android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()}
- 會將 {@link android.net.NetworkRequest} 物件傳遞到系統。
-符合網路條件時,應用程式會收到回呼,執行它的 {@link
-  android.net.ConnectivityManager.NetworkCallback} 類別中定義的
-  {@link android.net.ConnectivityManager.NetworkCallback#onAvailable
-  onAvailable()} 方法。
-
-</p>
-
-<p>
-  應用程式會持續收到回呼,直到應用程式結束或呼叫
-  {@link android.net.ConnectivityManager#unregisterNetworkCallback
-  unregisterNetworkCallback()} 才停止。
-</p>
-
-<h2 id="media-broadcasts">
-  NEW_PICTURE 與 NEW_VIDEO 上的限制
-</h2>
-
-<p>
-  在 N Developer Preview 中,應用程式無法傳送或接收 {@link
-  android.hardware.Camera#ACTION_NEW_PICTURE} 或 {@link
-  android.hardware.Camera#ACTION_NEW_VIDEO} 廣播。在必須喚醒數個應用程式來處理新的影像或視訊時,此限制有助於降低對效能與使用者體驗的影響。
-
-N Developer Preview 擴充 {@link android.app.job.JobInfo} 與 {@link
-  android.app.job.JobParameters} 來提供替代解決方案。
-
-</p>
-
-<h3 id="new-jobinfo">
-  新的 JobInfo 方法
-</h3>
-
-<p>
-  為了在內容 URI 變更時觸發工作,N Developer Preview 使用下列方法擴充 {@link android.app.job.JobInfo} API:
-
-</p>
-
-<dl>
-  <dt>
-    {@code JobInfo.TriggerContentUri()}
-  </dt>
-
-  <dd>
-    封裝在內容 URI 變更時觸發工作所需的參數。
-  </dd>
-
-  <dt>
-    {@code JobInfo.Builder.addTriggerContentUri()}
-  </dt>
-
-  <dd>
-    將 {@code TriggerContentUri} 物件傳遞到 {@link
-    android.app.job.JobInfo}。{@link android.database.ContentObserver} 會監視封裝的內容 URI。
-如果有多個 {@code
-    TriggerContentUri} 物件與工作關聯,即使系統只回報其中一個內容 URI 中的變更,也會提供一個回呼。
-
-  </dd>
-
-  <dd>
-    新增 {@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS} 旗標,以在特定 URI 的任何子系變更時觸發工作。
-此旗標對應傳遞到 {@link
-    android.content.ContentResolver#registerContentObserver
-    registerContentObserver()} 的 {@code notifyForDescendants} 參數。
-
-  </dd>
-</dl>
-
-<p class="note">
-  <strong>注意:</strong>{@code TriggerContentUri()} 無法與 {@link android.app.job.JobInfo.Builder#setPeriodic
-  setPeriodic()} 或 {@link android.app.job.JobInfo.Builder#setPersisted
-  setPersisted()} 結合使用。
-為了持續監視內容變更,請在應用程式的 {@link
-  android.app.job.JobService} 完成處理最近的回呼之前,排程新的
-  {@link android.app.job.JobInfo}。
-</p>
-
-<p>
-  下列範例程式碼會排程一個工作,在系統回報內容 URI {@code MEDIA_URI} 變更時觸發該工作:
-
-</p>
-
-<pre>
-public static final int MY_BACKGROUND_JOB = 0;
-...
-public static void scheduleJob(Context context) {
-  JobScheduler js =
-          (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
-  JobInfo.Builder builder = new JobInfo.Builder(
-          MY_BACKGROUND_JOB,
-          new ComponentName(context, MediaContentJob.class));
-  builder.addTriggerContentUri(
-          new JobInfo.TriggerContentUri(MEDIA_URI,
-          JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
-  js.schedule(builder.build());
-}
-</pre>
-<p>
-  當系統回報指定內容 URI 中有變更時,您的應用程式會收到一個回呼,而且會傳遞一個 {@link android.app.job.JobParameters} 物件到 {@code MediaContentJob.class} 中的 {@link android.app.job.JobService#onStartJob onStartJob()} 方法。
-
-
-
-</p>
-
-<h3 id="new-jobparam">
-  新的 JobParameter 方法
-</h3>
-
-<p>
-  N Developer Preview 也擴充 {@link android.app.job.JobParameters} 以允許您的應用程式接收有關內容授權單位與觸發工作之 URI 的實用資訊:
-
-
-</p>
-
-<dl>
-  <dt>
-    {@code Uri[] getTriggeredContentUris()}
-  </dt>
-
-  <dd>
-    傳回觸發工作之 URI 的陣列。如果沒有 URI 觸發工作 (例如,工作是因為期限到了或一些其他原因而觸發),或是變更的 URI 數目大於 50 時,這將會是 {@code
-    null}。
-
-
-  </dd>
-
-  <dt>
-    {@code String[] getTriggeredContentAuthorities()}
-  </dt>
-
-  <dd>
-    傳回觸發工作之內容授權單位的字串陣列。
-    如果傳回的陣列不是 {@code null},請使用 {@code getTriggeredContentUris()} 來擷取變更的 URI 的詳細資訊。
-
-  </dd>
-</dl>
-
-<p>
-  下列範例程式碼會覆寫 {@link
-  android.app.job.JobService#onStartJob JobService.onStartJob()} 方法,並記錄觸發工作的內容授權單位與 URI:
-
-</p>
-
-<pre>
-&#64;Override
-public boolean onStartJob(JobParameters params) {
-  StringBuilder sb = new StringBuilder();
-  sb.append("Media content has changed:\n");
-  if (params.getTriggeredContentAuthorities() != null) {
-      sb.append("Authorities: ");
-      boolean first = true;
-      for (String auth :
-          params.getTriggeredContentAuthorities()) {
-          if (first) {
-              first = false;
-          } else {
-             sb.append(", ");
-          }
-           sb.append(auth);
-      }
-      if (params.getTriggeredContentUris() != null) {
-          for (Uri uri : params.getTriggeredContentUris()) {
-              sb.append("\n");
-              sb.append(uri);
-          }
-      }
-  } else {
-      sb.append("(No content)");
-  }
-  Log.i(TAG, sb.toString());
-  return true;
-}
-</pre>
-
-<h2 id="further-optimization">
-  進一步最佳化您的應用程式
-</h2>
-
-<p>
-  最佳化您的應用程式,讓它可以在低記憶體裝置上或低記憶體狀況下執行,這樣可以改進效能與使用者體驗。
-移除背景服務上的相依性與靜態註冊的隱含式廣播接收器,有助於讓您的應用程式在此類裝置上執行得更順暢。
-
-雖然 N Developer Preview 採取一些步驟來減少一些此類問題,但是還是建議您最佳化您的應用程式,讓它完全不必使用這些背景處理程序。
-
-
-
-</p>
-
-<p>
-  N Developer Preview 引進一些額外的 <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge (ADB)</a> 命令,您可以使用這些命令測試在那些背景處理程序停用時的應用程式行為:
-
-</p>
-
-<ul>
-  <li>如果要模擬隱含式廣播與背景服務無法使用的情況,請輸入下列命令:
-
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore}
-</pre>
-  </li>
-
-  <li>如果要重新啟用隱含式廣播與背景服務,請輸入下列命令:
-
-  </li>
-
-  <li style="list-style: none; display: inline">
-<pre class="no-pretty-print">
-{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow}
-</pre>
-  </li>
-</ul>
\ No newline at end of file
diff --git a/docs/html-intl/intl/zh-tw/preview/features/icu4j-framework.jd b/docs/html-intl/intl/zh-tw/preview/features/icu4j-framework.jd
deleted file mode 100644
index b6816b8..0000000
--- a/docs/html-intl/intl/zh-tw/preview/features/icu4j-framework.jd
+++ /dev/null
@@ -1,160 +0,0 @@
-page.title=ICU4J Android 架構 API
-page.tags=androidn
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>此文件內容:</h2>
-<ol>
-    <li><a href="#relation">與 ICU4J 的關係</a></li>
-    <li><a href="#migration">從 ICU4J 遷移到 android.icu API</a></li>
-    <li><a href="#licence">授權</a></li>
-</ol>
-
-<h2>另請參閱</h2>
-<ol>
-  <li>
-    <a class="external-link" href="http://userguide.icu-project.org">ICU4J 文件</a>
-  </li>
-
-  <li>
-    <a class="external-link" href="http://site.icu-project.org/#TOC-What-is-ICU-">ICU4J 支援的最新標準</a>
-
-  </li>
-</ol>
-</div>
-</div>
-
-<p>
-  ICU4J 是廣為使用的一組開放原始碼 Java 程式庫,為軟體應用程式提供 Unicode 與全球化支援。
-Android N 在 Android 架構中公開一個 ICU4J API 的子集,供應用程式開發人員在 {@code android.icu} 套件下使用。
-
-這些 API 使用裝置上呈現的當地語系化資料。
-因此,您可以不用將 ICU4J 程式庫編譯到 APK 而降低 APK 的使用;相反地,您只需在架構中呼叫這些程式庫
-
-(在此情況中,您可能要提供<a href="{@docRoot}google/play/publishing/multiple-apks.html">多個版本的 APK</a>,這樣執行低於 Android N 之 Android 版本的使用者即可下載包含 ICU4J 程式庫的應用程式版本)。
-
-
-
-</p>
-
-<p>
-  此文件一開始先提供支援這些程式庫所需之最低 Android API 層級的一些基本資訊。
-接著它說明 Android 特定實作 ICU4J 的相關須知事項。
-最後,它告訴您如何在 Android 架構中使用 ICU4J API。
-
-</p>
-
-<h2 id="relation">與 ICU4J 的關係</h2>
-
-<p>
-  Android N 透過
-  <code>android.icu</code> 套件 (而非 <code>com.ibm.icu</code>) 公開一個 ICU4J API 的子集。Android 架構可能因為各種原因選擇不公開 ICU4J API;例如,Android N 沒有公開一些已過時的 API 或 ICU 團隊尚未宣布為穩定的 API。
-
-
-
-因為 ICU 團隊將來會將 API 視為過時,所以 Android 也會將這些 API 標示為已過時但繼續包含它們。
-
-</p>
-
-<p class="table-caption"><strong>表 1.</strong> Android N 中使用的 ICU 與 CLDR 版本。
-</p>
-<table>
-<tr>
-<th>Android API 層級</th>
-<th>ICU 版本</th>
-<th>CLDR 版本</th>
-</tr>
-<tr>
-<td>Android N</td>
-<td>56</td>
-<td>28</td>
-</tr>
-</table>
-
-<p>以下是一些必須注意的重要事項:</p>
-
-<ul>
-<li>ICU4J Android 架構 API 不包含所有 ICU4J API。</li>
-<li>NDK 開發人員應該知道 Android ICU4C 不被支援。</li>
-<li>Android 架構中的 API 沒有取代 Android 對<a href="{@docRoot}guide/topics/resources/localization.html">使用資源進行當地語系化</a>的支援。
-
-</li>
-</ul>
-
-<h2 id="migration">從 com.ibm.icu 遷移到 android.icu 套件</h2>
-
-<p>
-  如果您已經在應用程式中使用 ICU4J API,而且
-  <code>android.icu</code> API 符合您的需求,那麼遷移到架構 API 需要您將 Java 匯入從 <code>com.ibm.icu</code> 變更為 <code>android.icu</code>。
-
-接著您可以從 APK 移除您自己的 ICU4J 檔案。
-
-</p>
-
-<p class="note">
-  <b>注意</b>:ICU4J 架構 API 使用 {@code android.icu} 命名空間而非 {@code com.ibm.icu}。
-這是為了避免包含自己的 {@code com.ibm.icu} 程式庫的 APK 中發生命名空間衝突。
-
-</p>
-
-<h3 id="migrate-from-android">
-  從其他 Android SDK API 遷移到 android.icu API
-</h3>
-
-<p>
-  <code>java</code> 與 <code>android</code> 套件中的一些類別包含可在 ICU4J 中找到的同等項目。
-然而,ICU4J 通常為標準與語言提供更廣泛的支援。
-
-</p>
-<p>以下提供一些快速入門範例:</p>
-<table>
-<tr>
-<th>類別</th>
-<th>替代項目</th>
-</tr>
-<tr>
-<td><code>java.lang.Character</code> </td>
-<td><code>android.icu.lang.UCharacter</code> </td>
-</tr>
-<tr>
-<td><code>java.text.BreakIterator</code> </td>
-<td><code>android.icu.text.BreakIterator</code> </td>
-</tr>
-<tr>
-<td><code>java.text.DecimalFormat</code> </td>
-<td><code>android.icu.text.DecimalFormat</code> </td>
-</tr>
-<tr>
-<td><code>java.util.Calendar</code></td>
-<td>
-<code>android.icu.util.Calendar</code></td>
-</tr>
-<tr>
-<td><code>android.text.BidiFormatter</code>
- </td>
-<td><code>android.icu.text.Bidi</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateFormat</code>
- </td>
-<td><code>android.icu.text.DateFormat</code>
- </td>
-</tr>
-<tr>
-<td><code>android.text.format.DateUtils</code> </td>
-<td><code>android.icu.text.DateFormat</code>
-<code>android.icu.text.RelativeDateTimeFormatter</code>
-</td>
-</tr>
-</table>
-
-<h2 id="licence">授權</h2>
-
-<p>
-  ICU4J 是根據 ICU 授權而發行。如需詳細資料,請參閱 <a class="external-link" href="http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-">ICU 使用者指南</a>。
-
-</p>
diff --git a/docs/html-intl/intl/zh-tw/preview/features/multilingual-support.jd b/docs/html-intl/intl/zh-tw/preview/features/multilingual-support.jd
deleted file mode 100644
index 5570b4d..0000000
--- a/docs/html-intl/intl/zh-tw/preview/features/multilingual-support.jd
+++ /dev/null
@@ -1,217 +0,0 @@
-page.title=語言和地區設定
-page.tags=androidn
-page.image=images/cards/card-nyc_2x.jpg
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>此文件內容:</h2>
-<ol>
-	  <li><a href="#preN">解析語言資源中的挑戰</a></li>
-    <li><a href="#postN">對資源解析策略所做的改進</a></li>
-    <li><a href="#design">設計您的應用程式支援其他地區設定</a>
-</li>
-
-</ol>
-
-</div>
-</div>
-
-<p>Android N 增強對多語言使用者的支援,讓他們可在設定中選取多個地區設定。
-Android N 藉由擴充支援的地區設定數量和改變系統解析資源的方式來提供多語言支援。
-
-解析資源的新方法更加健全,而且它的設計是與現有 APK 相容,但是您應該特別注意任何未預期的行為。
-
-例如,您應該進行測試,確認應用程式預設在預期的語言。
-此外,如果您的應用程式支援多個語言,則應該確保這項支援也能如預定方式運作。
-
-最後,您應該試著確認應用程式可以順暢地處理沒有明確設計要支援的語言。
-</p>
-
-<p>本文件一開始會先說明在 Android N 之前的資源解析策略。接下來,它會描述 Android N 的已改進的資源解析策略。
-
-最後,它會說明如何利用擴充的地區設定數量來支援更多的多語言使用者。
-</p>
-
-<h2 id="preN">解析語言資源中的挑戰</h2>
-
-<p>在 Android N 之前,Android 並不總能成功地對應應用程式與系統地區設定。
-舉例來說,假設您應用程式的預設語言的是 US English,但是它的 {@code es_ES} 資源檔案中也包含當地語言化的西班牙文字串。
-
-</p>
-<p>當您的 Java 程式碼參考這些字串時,它會以下列方式來解析字串語言:
-</p>
-<ul>
-<li>如果裝置設定為 {@code es_MX} (Spanish-Mexico),Android 會從 {@code es_ES} 資源檔案載入字串。
-</li>
-<li>如果裝置設定為 {@code en_AU},Android 會返回使用 {@code
-en_US}。如果使用者選擇應用程式完全不支援的語言 (如法文),系統也會預設成 {@code en_US}。
-</li>
-</ul>
-
-
-<p>出現這些解析問題的原因,是如果系統找不到符合的項目,它會剝除地區設定中的國家/地區代碼。
-例如:</p>
-<p class="table-caption" id="t-resource-res">
-<strong>表 1.</strong> 沒有完全符合的地區設定的資源解析。
-</p>
-<table>
-<tbody>
-<tr>
-<th>使用者設定</th>
-<th>應用程式資源</th>
-<th>資源解析</th>
-</tr>
-<tr>
-<td>fr_CH</td>
-<td>
-預設 (en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
- <td>
-嘗試 fr_CH =&gt; 失敗<br>
-嘗試 fr =&gt; 失敗<br>
-使用預設 (en)
-</td>
- </tr>
- </tbody>
-</table>
-
-
-<p>在此例中,系統會顯示英文字串,而不知道使用者是否了解英文。
-現在這種行為相當常見。
-Android N 可以大幅降低出現這類結果的頻率。
-</p>
-
-<h2 id="postN">對資源解析策略所做的改進</h2>
-<p>Android N 帶來更健全的資源解析,而且會自動發現更佳的遞補。
-然而,為了加速解析和改進維護能力,您應該將資源存放在最常用的父系語言中。
-
- 例如,如果之前將西班牙文資源存放在 {@code es-US} 目錄,請將它們移到包含拉丁美洲西班牙文的 {@code es-419} 目錄。
-
- 同樣地,如果在名為 {@code en-GB} 的資料夾中包含資源字串,請將資料夾重新命名為 {@code en-001} (國際英文),因為 <code>en-GB</code> 字串的最常見父系為 {@code en-001}。
-
-
- 下列範例說明為什麼這些做法可改善資源解析的效能和可靠性。
-</p>
-
-<h3>資源解析範例</h3>
-
-<p>在 Android N 中,<strong>表 1</strong> 中所述的案例會用不同的方式解析:
-</p>
-
-<p class="table-caption" id="t-improved-res">
-<strong>表 2.</strong> 沒有完全符合的地區設定的已改進解析策略。
-</p>
-<table>
-<tr>
-<th>使用者設定</th>
-<th>應用程式資源</th>
-<th>資源解析</th>
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-</ol>
-</td>
-<td>
-預設 (en)<br>
-de_DE<br>
-es_ES<br>
-fr_FR<br>
-it_IT<br>
-</td>
-<td>
-嘗試 fr_CH =&gt; 失敗<br>
-嘗試 fr =&gt; 失敗<br>
-嘗試 fr 的子項 =&gt; fr_FR<br>
-使用 fr_FR
-</td>
-</tr>
-
-</table>
-
-
-<p>現在使用者會取得法文資源而非英文資源。這個範例也顯示為什麼在 Android N 中,您應該將法文字串存放在 {@code fr} 而非 {@code fr_FR} 中。以下是比對最接近父系語言的動作步驟,這些步驟可讓解析更快、更容易預測。
-
-
-</p>
-
-<p>除了這個已改進的解析邏輯之外,現在 Android 還提供更多使用者語言供您選擇。
-讓我們指定義大利文做為額外的使用者語言但應用程式不支援法文的情況,再試一次上述的範例。
-  </p>
-
-<p class="table-caption" id="t-2d-choice">
-<strong>表 3.</strong> 應用程式只比對到符合使用者第二個慣用地區設定時的資源解析。
-</p>
-<table>
-<tr>
-<th>使用者設定</th>
-<th>應用程式資源</th>
-<th>資源解析</th>
-
-</tr>
-<tr>
-<td><ol>
-<li> fr_CH</li>
-<li> it_CH</li>
-</ol>
-</td>
-<td>
-預設 (en)<br>
-de_DE<br>
-es_ES<br>
-it_IT<br>
-</td>
-<td>
-嘗試 fr_CH =&gt; 失敗<br>
-嘗試 fr =&gt; 失敗<br>
-嘗試 fr 的子項 =&gt; 失敗<br>
-嘗試 it_CH =&gt; 失敗<br>
-嘗試 it =&gt; 失敗<br>
-嘗試 it 的子項 =&gt; it_IT<br>
-使用 it_IT
-</td>
-
-</tr>
-
-</table>
-<p>即使應用程式不支援法文,但是使用者仍然取得他們了解的語言。
-</p>
-
-
-<h2 id="design">設計您的應用程式支援其他地區設定</h2>
-<h3>LocaleList API</h3>
-
-<p>Android N 增加了新的 API {@code LocaleList.GetDefault()}
-,讓應用程式直接查詢使用者指定的語言清單。這個 API 可讓您建立更精細的應用程式行為,也能更好的最佳化內容的顯示方式。
-
-例如,搜尋可以根據使用者的設定以多語言顯示結果。
-瀏覽器應用程式可以避免提供以使用者已知語言來翻譯網頁的選項,鍵盤應用程式可以自動啟用所有適當的版面配置。
-
- </p>
-
-<h3>格式設定</h3>
-
-<p>直到 Android 6.0 (API 層級 23),Android 還只支援許多常用語言 (en、es、ar、fr、ru) 的一或兩個地區設定。
-
-因為每種語言只有幾種變體,所以應用程式不用在資源檔案中將一些數字和日期儲存為硬式編碼字串。
-
-然而,隨著 Android 擴充了支援的地區設定之後,即使在單一地區設定中,日期、時間、貨幣和類似資訊的格式可能會有顯著的差異。
-
-
-硬式編碼您的格式會對使用者產生令人混淆的體驗。
-因此,針對 Android N 進行開發時,請務必使用格式子,而不要硬式編碼數字和日期字串。
-</p>
-
-<p>最主要的範例是阿拉伯文,它對 Android N 的支援從一個 {@code ar_EG} 擴充到 27 個阿拉伯地區設定。
-這些地區設定可以共用大多數的資源,但是有些地區設定慣用 ASCII 數字,而其他地區設定慣用當地數字。
-例如,在您想要建立一個包含數字變數的句子時,例如 "Choose a 4 digit pin",請使用如下所示的格式設定:
-
-</p>
-
-<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>
diff --git a/docs/html-intl/intl/zh-tw/preview/features/notification-updates.jd b/docs/html-intl/intl/zh-tw/preview/features/notification-updates.jd
deleted file mode 100644
index 5ebcebb..0000000
--- a/docs/html-intl/intl/zh-tw/preview/features/notification-updates.jd
+++ /dev/null
@@ -1,328 +0,0 @@
-page.title=通知
-page.tags=notifications
-helpoutsWidget=true
-page.image=/preview/images/notifications-card.png
-
-trainingnavtop=true
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-
-<!-- table of contents -->
-<h2>本文件包括</h2>
-<ol>
-  <li><a href="#direct">直接回覆</a></li>
-  <li><a href="#bundle">整合式通知</a></li>
-  <li><a href="#custom">自訂檢視</a></li>
-</ol>
-
-</div>
-</div>
-
-<p>Android N 引進數個新 API,允許應用程式張貼相當顯眼且互動式的通知。
-</p>
-
-<p>Android N 擴充現有的 {@link android.support.v4.app.RemoteInput}
-通知 API,支援在手機上內嵌回覆。此功能允許使用者從通知欄快速回應,而不必造訪您的應用程式。
-</p>
-
-<p>
-  Android N 也允許您將類似的通知結合成單一通知。
-Android N 使用現有的 {@link
-  android.support.v4.app.NotificationCompat.Builder#setGroup
-  NotificationCompat.Builder.setGroup()} 方法來實現此目標。使用者能擴充每個通知,並可個別從通知欄執行動作,例如回覆和關閉每一個通知。
-
-
-</p>
-
-<p>最後,Android N 還新增 API 讓您在應用程式的自訂通知檢視中利用系統的裝飾。
-這些 API 可協助確保通知檢視和標準範本的呈現方式一致。
-
-</p>
-
-<p>本文件將強調說明一些重要變更,您應該在應用程式中使用新的通知功能時納入考量。
-</p>
-
-<h2 id="direct">直接回覆</h2>
-
-<p>使用 Android N 中的直接回覆功能,使用者可直接在通知介面內快速回應文字訊息或更新工作清單。
-
-在手持式裝置上,內嵌回覆動作看起來就像是通知附加的額外按鈕。
-當使用者透過鍵盤回覆時,系統會在您為通知動作指定的意圖附加文字回應,然後將意圖傳送給您的手持裝置應用程式。
-
-
-
-
-
-<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
-  {@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
-<p class="img-caption">
-  <strong>圖 1.</strong> Android N 新增「回覆」<strong></strong>
-  操作按鈕.
-</p>
-
-<h3>新增內嵌回覆動作</h3>
-
-<p>建立支援直接回覆的通知動作:
-</p>
-
-<ol>
-<li>建立您可以新增至通知動作的 {@link android.support.v4.app.RemoteInput.Builder}
-  實例。
-此類別的建構函式接受字串,系統可當成文字輸入的金鑰使用。
-稍後,您的手持裝置應用程式會使用該金鑰,擷取輸入的文字。
-
-
-<pre>
-// Key for the string that's delivered in the action's intent
-private static final String KEY_TEXT_REPLY = "key_text_reply";
-String replyLabel = getResources().getString(R.string.reply_label);
-RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
-        .setLabel(replyLabel)
-        .build();
-</pre>
-</li>
-<li>使用 <code>addRemoteInput()</code> 將 {@link android.support.v4.app.RemoteInput}
- 物件附加到動作。
-
-<pre>
-// Create the reply action and add the remote input
-Notification.Action action =
-        new Notification.Action.Builder(R.drawable.ic_reply_icon,
-                getString(R.string.label), replyPendingIntent)
-                .addRemoteInput(remoteInput)
-                .build();
-</pre>
-</li>
-
-<li>將動作套用到通知並發出通知。
-
-<pre>
-// Build the notification and add the action
-Notification notification =
-        new Notification.Builder(mContext)
-                .setSmallIcon(R.drawable.ic_message)
-                .setContentTitle(getString(R.string.title))
-                .setContentText(getString(R.string.content))
-                .addAction(action))
-                .build();
-
-// Issue the notification
-NotificationManager notificationManager =
-        NotificationManager.from(mContext);
-notificationManager.notify(notificationId, notification);
-
-</pre>
-</li>
-
-</ol>
-
-
-<p> 當使用者觸發通知動作時,系統會提示使用者輸入回應。
- </p>
-
-<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
-    {@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>圖 2.</strong> 使用者從通知欄輸入文字。
-</p>
-
-<h3>從內嵌回覆擷取使用者輸入</h3>
-
-<p>從您在回覆動作的意圖中所宣告動作的通知介面接收使用者輸入:
-</p>
-<ol>
-<li> 透過將通知動作的意圖傳遞為輸入參數,來呼叫 {@link android.support.v4.app.RemoteInput#getResultsFromIntent
-  getResultsFromIntent()}。
-這個方法會傳回包含文字回應的 {@link android.os.Bundle}。
-
-</li>
-
-<pre>
-Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-</pre>
-
-<li>使用 (提供給 {@link
-  android.support.v4.app.RemoteInput.Builder} 建構函式的) 結果金鑰查詢組合。
-</li>
-</ol>
-
-<p>下列程式碼片段說明方法如何從組合中擷取輸入文字:
-</p>
-
-<pre>
-// Obtain the intent that started this activity by calling
-// Activity.getIntent() and pass it into this method to
-// get the associated string.
-
-private CharSequence getMessageText(Intent intent) {
-    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
-    if (remoteInput != null) {
-            return remoteInput.getCharSequence(KEY_TEXT_REPLY);
-            }
-    return null;
- }
-</pre>
-
-<p>應用程式可以套用邏輯,決定擷取文字時要採取的動作。對於互動式應用程式 (像是聊天),要在通知本身提供更多內容 (例如,多行聊天歷程記錄,包括使用者自己的訊息),使用者才能適當回應。當使用者透過 {@link android.support.v4.app.RemoteInput} 回應時,請使用 {@code setRemoteInputHistory()}
- 方法在回覆歷程記錄中包括文字。
-
-
-
-
-
-</p>
-
-<h2 id="bundle">整合式通知</h2>
-
-<p>Android N 提供開發人員呈現通知佇列的全新方式:
- <i>整合式通知</i>。這類似於 Android Wear
-  中的<a href="{@docRoot}training/wearables/notifications/stacks.html">通知堆疊</a>。
-例如,若您的應用程式會為接收的訊息建立通知,收到多個訊息時,會將通知結合成單一群組。
-
-您可以使用現有的 {@link android.support.v4.app.NotificationCompat.Builder#setGroup
-Builder.setGroup()} 方法,結合類似的通知。
-</p>
-
-<p>
-  通知群組會對其中所含的通知強制施行階層。
-  階層的最上方是上層通知,顯示該群組的摘要資訊。
-使用者可以逐漸擴充通知群組,而系統會在使用者更深入探查時顯示更多資訊。
-
-當使用者擴充組合時,系統會為所有子通知揭露更多資訊。當使用者擴充當中的其中一個通知時,系統會顯示該通知的所有內容。
-
-
-</p>
-
-<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
-          {@docRoot}preview/images/bundles_2x.png 2x" width="300">
-<p class="img-caption">
-  <strong>圖 3.</strong> 使用者可以逐漸擴充通知群組。
-
-</p>
-
-<p>若要了解如何將通知新增至群組,請參閱<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">將每個通知新增至群組</a>。
-
-</p>
-
-
-<h3 id="best-practices">整合式通知最佳做法</h3>
-<p>本節提供使用通知群組時的指導方針,而不是舊版 Android 平台可用的 {@link android.app.Notification.InboxStyle InboxStyle}
-通知。
-
-</p>
-
-<h3>使用整合式通知的時機</h3>
-
-<p>只有當您的使用案例與下列條件全部相符時,才應該使用通知群組:
-</p>
-
-<ul>
-  <li>子通知是完整通知,也能個別顯示,而不需要群組摘要。
-</li>
-  <li>讓子通知個別出現有其優點。例如:
-
-  </li>
-  <ul>
-    <li>能以特定動作來對每個子通知執行動作。</li>
-    <li>可讓使用者想讀取的子通知能有更多資訊。</li>
-  </ul>
-</ul>
-
-<p>良好的通知群組使用案例範例包括:顯示一連串傳入訊息的訊息傳送應用程式,或顯示一系列所接收電子郵件清單的電子郵件應用程式。
-
-</p>
-
-<p>
-建議使用的單一通知案例範例包括:來自單人的個別訊息,或以清單呈現單行的文字項目。
-
-您可以使用
-({@link android.app.Notification.InboxStyle InboxStyle} 或
-{@link android.app.Notification.BigTextStyle BigTextStyle}) 來完成。
-
-</p>
-
-<h3 id ="post">顯示整合式通知</h3>
-
-<p>
-  應用程式應一律張貼群組摘要,即使群組當中只包含單一子項。
-如果只包含單一通知,系統會抑制摘要,並直接顯示子通知。
-這可確保當使用者滑動離開群組子項時,系統能提供一致的體驗。
-
-
-</p>
-
-<p class="note">
-  <strong>注意:</strong>本版 Android N 還不會抑制包含單一子通知的通知群組摘要。
-更新的 Android N 版本才會新增此功能。
-
-</p>
-
-<h3>預覽通知</h3>
-
-<p>雖然系統通常會將子通知顯示為群組,但您可以設定子通知,暫時顯示為<a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">抬頭通知</a>
-。
-
-此功能允許立即存取最新的子通知和與它相關的動作,因此特別實用。
-
-</p>
-
-
-<h3>回溯相容性</h3>
-
-<p>
-  自從 Android 5.0 (API 層級 21) 支援 Android Wear 裝置以來,通知群組與遠端輸入都是 {@link
-  android.app.Notification} API 的一部分。
-如果您已使用這些 API 建置通知,您必須採取的動作只有確認應用程式行為符合上述的指導方針,以及考慮實作 {@code
-  setRemoteInputHistory()}。
-
-
-</p>
-
-<p>
-  為了支援回溯相容性,相同的 API 可與支援程式庫的 {@link android.support.v4.app.NotificationCompat}
- 類別搭配使用,讓您建置能在舊版 Android 上運作的通知。
-
-在手持裝置與平板電腦上,使用者只會看到摘要通知,應用程式應仍要為群組的完整資訊內容提供收件匣樣式或同等的通知呈現方式。
-
-雖然 Android
-  Wear 裝置即使在較舊的平台層級上,也允許使用者查看所有子通知,但不論 API 層級為何,您都應該建置子通知。
-
-
-</p>
-
-<h2 id="custom"> 自訂檢視</h2>
-<p>從 Android N 開始,您可以自訂通知檢視,也仍然可以取得系統裝飾,例如通知標題、動作及可擴充的版面配置。
-
-</p>
-
-<p>若要啟用此功能,Android N 新增下列 API 供您設定自訂檢視的樣式:
-</p>
-
-<dl>
-<dt>
-{@code DecoratedCustomViewStyle()}</dt>
-<dd> 設定媒體通知以外的通知樣式。
-</dd>
-<dt>
-{@code DecoratedMediaCustomViewStyle()}</dt>
-<dd> 設定媒體通知樣式</dd>
-</dl>
-
-<p>若要使用這個新 API,請呼叫 {@code setStyle()} 方法,再傳遞給想要的自訂檢視樣式。
-</p>
-
-<p>此程式碼片段顯示如何使用
-{@code DecoratedCustomViewStyle()} 方法,建構自訂通知物件。</p>
-
-<pre>
-Notification noti = new Notification.Builder()
-           .setSmallIcon(R.drawable.ic_stat_player)
-           .setLargeIcon(albumArtBitmap))
-           .setCustomContentView(contentView);
-           .setStyle(new Notification.DecoratedCustomViewStyle())
-           .build();
-
-</pre>
diff --git a/docs/html/_redirects.yaml b/docs/html/_redirects.yaml
index a1eb11e..aefe1c1 100644
--- a/docs/html/_redirects.yaml
+++ b/docs/html/_redirects.yaml
@@ -802,13 +802,13 @@
 - from: /preview/dev-community
   to: https://plus.google.com/communities/103655397235276743411
 - from: /preview/bug
-  to: https://code.google.com/p/android/issues/entry?template=Developer%20preview%20report
+  to: https://source.android.com/source/report-bugs.html
 - from: /preview/bug/
-  to: https://code.google.com/p/android/issues/entry?template=Developer%20preview%20report
+  to: https://source.android.com/source/report-bugs.html
 - from: /preview/bugreport
-  to: https://code.google.com/p/android/issues/entry?template=Developer%20preview%20report
+  to: https://source.android.com/source/report-bugs.html
 - from: /preview/bugreport/
-  to: https://code.google.com/p/android/issues/entry?template=Developer%20preview%20report
+  to: https://source.android.com/source/report-bugs.html
 - from: /preview/bugs
   to: https://code.google.com/p/android/issues/list?can=2&q=label%3ADevPreview-N
 - from: /preview/bugs/
diff --git a/docs/html/about/_book.yaml b/docs/html/about/_book.yaml
index 0e91c08..642113b 100644
--- a/docs/html/about/_book.yaml
+++ b/docs/html/about/_book.yaml
@@ -4,10 +4,65 @@
   section:
   - title: Android 7.0 for Developers
     path: /about/versions/nougat/android-7.0.html
+    path_attributes:
+    - name: es-lang
+      value: Información general de la API
+    - name: in-lang
+      value: Android N untuk Pengembang
+    - name: ja-lang
+      value: API の概要
+    - name: ko-lang
+      value: API 개요
+    - name: pt-br-lang
+      value: Visão geral da API
+    - name: ru-lang
+      value: Обзор API-интерфейсов
+    - name: vi-lang
+      value: Android N cho Nhà phát triển
+    - name: zh-cn-lang
+      value: API 概览
+    - name: zh-tw-lang
+      value: API 總覽
   - title: Android 7.0 Behavior Changes
     path: /about/versions/nougat/android-7.0-changes.html
+    path_attributes:
+    - name: es-lang
+      value: Cambios en los comportamientos
+    - name: in-lang
+      value: Perubahan Perilaku
+    - name: ja-lang
+      value: 動作の変更点
+    - name: ko-lang
+      value: 동작 변경
+    - name: pt-br-lang
+      value: Mudanças de comportamento
+    - name: ru-lang
+      value: Изменения в работе
+    - name: vi-lang
+      value: Các thay đổi Hành vi
+    - name: zh-cn-lang
+      value: 行为变更
+    - name: zh-tw-lang
+      value: 行為變更
   - title: Android 7.0 Samples
     path: /about/versions/nougat/android-7.0-samples.html
+    path_attributes:
+    - name: es-lang
+      value: Ejemplos
+    - name: in-lang
+      value: Contoh
+    - name: ja-lang
+      value: サンプル
+    - name: ko-lang
+      value: 샘플
+    - name: pt-br-lang
+      value: Exemplos
+    - name: ru-lang
+      value: Примеры
+    - name: zh-cn-lang
+      value: 示例
+    - name: zh-tw-lang
+      value: 範例
 
 - title: Marshmallow
   path: /about/versions/marshmallow/index.html
diff --git a/docs/html/about/versions/nougat/index.jd b/docs/html/about/versions/nougat/index.jd
index bb56d30..30a3576 100644
--- a/docs/html/about/versions/nougat/index.jd
+++ b/docs/html/about/versions/nougat/index.jd
@@ -1,6 +1,6 @@
 page.title=Android 7.0 Nougat
-page.tags="preview","developer"
-meta.tags="preview", "android"
+page.tags="androidn","versions"
+meta.tags="android n", "nougat", "android 7.0"
 fullpage=true
 forcelocalnav=true
 header.hide=1
@@ -108,7 +108,6 @@
     data-initial-results="3"></div>
 </div></section>
 
-
 <section class="dac-section dac-gray" id="videos"><div class="wrap">
   <h1 class="dac-section-title">Videos</h1>
   <div class="dac-section-subtitle">
@@ -125,11 +124,10 @@
   </div>
 </div></section>
 
-
 <section class="dac-section dac-light" id="resources"><div class="wrap">
   <h1 class="dac-section-title">Resources</h1>
   <div class="dac-section-subtitle">
-    Essential information to help you get your apps ready for Android N.
+    Essential information to help you get your apps ready for Android Nougat.
   </div>
 
   <div class="resource-widget resource-flow-layout col-16"
@@ -138,7 +136,5 @@
        data-items-per-page="6"
        data-maxResults="15"
        data-initial-results="6"></div>
-
   </div>
-</section>
-
+</section>
\ No newline at end of file
diff --git a/docs/html/guide/topics/renderscript/compute.jd b/docs/html/guide/topics/renderscript/compute.jd
index 13880ec..89cfff9 100755
--- a/docs/html/guide/topics/renderscript/compute.jd
+++ b/docs/html/guide/topics/renderscript/compute.jd
@@ -10,12 +10,13 @@
 
     <ol>
       <li><a href="#writing-an-rs-kernel">Writing a RenderScript Kernel</a></li>
-      <li><a href="#access-rs-apis">Accessing RenderScript APIs</a>
+      <li><a href="#access-rs-apis">Accessing RenderScript APIs from Java</a>
         <ol>
           <li><a href="#ide-setup">Setting Up Your Development Environment</a></li>
         </ol>
       </li>
       <li><a href="#using-rs-from-java">Using RenderScript from Java Code</a></li>
+      <li><a href="#single-source-rs">Single-Source RenderScript</a></li>
       <li><a href="#reduction-in-depth">Reduction Kernels in Depth</a>
         <ol>
           <li><a href="#writing-reduction-kernel">Writing a reduction kernel</a></li>
@@ -45,12 +46,16 @@
 <p>To begin with RenderScript, there are two main concepts you should understand:</p>
 <ul>
 
-<li>High-performance compute kernels are written in a C99-derived language. A <i>compute
-    kernel</i> is a function or collection of functions that you can direct the RenderScript runtime
-    to execute in parallel across a collection of data.</li>
+<li>The <em>language</em> itself is a C99-derived language for writing high-performance compute
+code. <a href="#writing-an-rs-kernel">Writing a RenderScript Kernel</a> describes
+how to use it to write compute kernels.</li>
 
-<li>A Java API is used for managing the lifetime of RenderScript resources and controlling kernel
-execution.</li>
+<li>The <em>control API</em> is used for managing the lifetime of RenderScript resources and
+controlling kernel execution. It is available in three different languages: Java, C++ in Android
+NDK, and the C99-derived kernel language itself.
+<a href="#using-rs-from-java">Using RenderScript from Java Code</a> and
+<a href=#single-source-rs>Single-Source RenderScript</a> describe the first and the third
+options, respectively.</li>
 </ul>
 
 <h2 id="writing-an-rs-kernel">Writing a RenderScript Kernel</h2>
@@ -77,7 +82,9 @@
 access script globals from Java code, and these are often used for parameter passing to RenderScript
 kernels.</p></li>
 
-<li><p>Zero or more <strong><i>compute kernels</i></strong>. There are two kinds of compute
+<li><p>Zero or more <strong><i>compute kernels</i></strong>. A compute kernel is a function
+or collection of functions that you can direct the RenderScript runtime to execute in parallel
+across a collection of data. There are two kinds of compute
 kernels: <i>mapping</i> kernels (also called <i>foreach</i> kernels)
 and <i>reduction</i> kernels.</p>
 
@@ -243,9 +250,9 @@
 precision (such as SIMD CPU instructions).</p>
 
 
-<h2 id="access-rs-apis">Accessing RenderScript APIs</h2>
+<h2 id="access-rs-apis">Accessing RenderScript APIs from Java</h2>
 
-<p>When developing an Android application that uses RenderScript, you can access its API in
+<p>When developing an Android application that uses RenderScript, you can access its API from Java in
   one of two ways:</p>
 
 <ul>
@@ -377,7 +384,7 @@
 <ul>
 
 <li><strong>ScriptC</strong>: These are the user-defined scripts as described in <a
-href="#writing-an-rs-kernel">Writing a RenderScript Kernel</a> above. Every script has a Java class
+href="#writing-an-rs-kernel"><i>Writing a RenderScript Kernel</i></a> above. Every script has a Java class
 reflected by the RenderScript compiler in order to make it easy to access the script from Java code;
 this class has the name <code>ScriptC_<i>filename</i></code>. For example, if the mapping kernel
 above were located in <code>invert.rs</code> and a RenderScript context were already located in
@@ -448,6 +455,116 @@
   a <code>get()</code> method to obtain the result of a reduction. <code>get()</code> is
   synchronous, and is serialized with respect to the reduction (which is asynchronous).</p>
 
+<h2 id="single-source-rs">Single-Source RenderScript</h2>
+
+<p>Android 7.0 (API level 24) introduces a new programming feature called <em>Single-Source
+RenderScript</em>, in which kernels are launched from the script where they are defined, rather than
+from Java. This approach is currently limited to mapping kernels, which are simply referred to as "kernels"
+in this section for conciseness. This new feature also supports creating allocations of type
+<a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_allocation>
+<code>rs_allocation</code></a> from inside the script. It is now possible to
+implement a whole algorithm solely within a script, even if multiple kernel launches are required.
+The benefit is twofold: more readable code, because it keeps the implementation of an algorithm in
+one language; and potentially faster code, because of fewer transitions between Java and
+RenderScript across multiple kernel launches.</p>
+
+<p>In Single-Source RenderScript, you write kernels as described in <a href="#writing-an-rs-kernel">
+Writing a RenderScript Kernel</a>. You then write an invokable function that calls
+<a href="{@docRoot}guide/topics/renderscript/reference/rs_for_each.html#android_rs:rsForEach">
+<code>rsForEach()</code></a> to launch them. That API takes a kernel function as the first
+parameter, followed by input and output allocations. A similar API
+<a href="{@docRoot}guide/topics/renderscript/reference/rs_for_each.html#android_rs:rsForEachWithOptions">
+<code>rsForEachWithOptions()</code></a> takes an extra argument of type
+<a href="{@docRoot}guide/topics/renderscript/reference/rs_for_each.html#android_rs:rs_script_call_t">
+<code>rs_script_call_t</code></a>, which specifies a subset of the elements from the input and
+output allocations for the kernel function to process.</p>
+
+<p>To start RenderScript computation, you call the invokable function from Java.
+Follow the steps in <a href="#using-rs-from-java">Using RenderScript from Java Code</a>.
+In the step <a href="#launching_kernels">launch the appropriate kernels</a>, call
+the invokable function using <code>invoke_<i>function_name</i>()</code>, which will start the
+whole computation, including launching kernels.</p>
+
+<p>Allocations are often needed to save and pass
+intermediate results from one kernel launch to another. You can create them using
+<a href="{@docRoot}guide/topics/renderscript/reference/rs_allocation_create.html#android_rs:rsCreateAllocation">
+rsCreateAllocation()</a>. One easy-to-use form of that API is <code>
+rsCreateAllocation_&ltT&gt&ltW&gt(&hellip;)</code>, where <i>T</i> is the data type for an
+element, and <i>W</i> is the vector width for the element. The API takes the sizes in
+dimensions X, Y, and Z as arguments. For 1D or 2D allocations, the size for dimension Y or Z can
+be omitted. For example, <code>rsCreateAllocation_uchar4(16384)</code> creates a 1D allocation of
+16384 elements, each of which is of type <code>uchar4</code>.</p>
+
+<p>Allocations are managed by the system automatically. You
+do not have to explicitly release or free them. However, you can call
+<a href="{@docRoot}guide/topics/renderscript/reference/rs_object_info.html#android_rs:rsClearObject">
+<code>rsClearObject(rs_allocation* alloc)</code></a> to indicate you no longer need the handle
+<code>alloc</code> to the underlying allocation,
+so that the system can free up resources as early as possible.</p>
+
+<p>The <a href="#writing-an-rs-kernel">Writing a RenderScript Kernel</a> section contains an example
+kernel that inverts an image. The example below expands that to apply more than one effect to an image,
+using Single-Source RenderScript. It includes another kernel, <code>greyscale</code>, which turns a
+color image into black-and-white. An invokable function <code>process()</code> then applies those two kernels
+consecutively to an input image, and produces an output image. Allocations for both the input and
+the output are passed in as arguments of type
+<a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_allocation>
+<code>rs_allocation</code></a>.</p>
+
+<pre>
+// File: singlesource.rs
+
+#pragma version(1)
+#pragma rs java_package_name(com.android.rssample)
+
+static const float4 weight = {0.299f, 0.587f, 0.114f, 0.0f};
+
+uchar4 RS_KERNEL invert(uchar4 in, uint32_t x, uint32_t y) {
+  uchar4 out = in;
+  out.r = 255 - in.r;
+  out.g = 255 - in.g;
+  out.b = 255 - in.b;
+  return out;
+}
+
+uchar4 RS_KERNEL greyscale(uchar4 in) {
+  const float4 inF = rsUnpackColor8888(in);
+  const float4 outF = (float4){ dot(inF, weight) };
+  return rsPackColorTo8888(outF);
+}
+
+void process(rs_allocation inputImage, rs_allocation outputImage) {
+  const uint32_t imageWidth = rsAllocationGetDimX(inputImage);
+  const uint32_t imageHeight = rsAllocationGetDimY(inputImage);
+  rs_allocation tmp = rsCreateAllocation_uchar4(imageWidth, imageHeight);
+  rsForEach(invert, inputImage, tmp);
+  rsForEach(greyscale, tmp, outputImage);
+}
+</pre>
+
+<p>You can call the <code>process()</code> function from Java as follows:</p>
+
+<pre>
+// File SingleSource.java
+
+RenderScript RS = RenderScript.create(context);
+ScriptC_singlesource script = new ScriptC_singlesource(RS);
+Allocation inputAllocation = Allocation.createFromBitmapResource(
+    RS, getResources(), R.drawable.image);
+Allocation outputAllocation = Allocation.createTyped(
+    RS, inputAllocation.getType(),
+    Allocation.USAGE_SCRIPT | Allocation.USAGE_IO_OUTPUT);
+script.invoke_process(inputAllocation, outputAllocation);
+</pre>
+
+<p>This example shows how an algorithm that involves two kernel launches can be implemented completely
+in the RenderScript language itself. Without Single-Source
+RenderScript, you would have to launch both kernels from the Java code, separating kernel launches
+from kernel definitions and making it harder to understand the whole algorithm. Not only is the
+Single-Source RenderScript code easier to read, it also eliminates the transitioning
+between Java and the script across kernel launches. Some iterative algorithms may launch kernels
+hundreds of times, making the overhead of such transitioning considerable.</p>
+
 <h2 id="reduction-in-depth">Reduction Kernels in Depth</h2>
 
 <p><i>Reduction</i> is the process of combining a collection of data into a single
diff --git a/docs/html/sdk/api_diff/23/changes/alldiffs_index_additions.html b/docs/html/sdk/api_diff/23/changes/alldiffs_index_additions.html
index 2383e43..6a3f641 100644
--- a/docs/html/sdk/api_diff/23/changes/alldiffs_index_additions.html
+++ b/docs/html/sdk/api_diff/23/changes/alldiffs_index_additions.html
@@ -4182,8 +4182,7 @@
 <!-- Field YUV_444_888 -->
 <nobr><A HREF="android.graphics.ImageFormat.html#android.graphics.ImageFormat.YUV_444_888" class="hiddenlink" target="rightframe">YUV_444_888</A>
 </nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/alldiffs_index_all.html b/docs/html/sdk/api_diff/23/changes/alldiffs_index_all.html
index e87800d..1fd3725 100644
--- a/docs/html/sdk/api_diff/23/changes/alldiffs_index_all.html
+++ b/docs/html/sdk/api_diff/23/changes/alldiffs_index_all.html
@@ -6082,8 +6082,7 @@
 <!-- Field YUV_444_888 -->
 <nobr><A HREF="android.graphics.ImageFormat.html#android.graphics.ImageFormat.YUV_444_888" class="hiddenlink" target="rightframe">YUV_444_888</A>
 </nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/alldiffs_index_changes.html b/docs/html/sdk/api_diff/23/changes/alldiffs_index_changes.html
index 826aa62..33cc0bd 100644
--- a/docs/html/sdk/api_diff/23/changes/alldiffs_index_changes.html
+++ b/docs/html/sdk/api_diff/23/changes/alldiffs_index_changes.html
@@ -1983,8 +1983,7 @@
 <!-- Field yearListSelectorColor -->
 <nobr><A HREF="android.R.attr.html#android.R.attr.yearListSelectorColor" class="hiddenlink" target="rightframe">yearListSelectorColor</A>
 </nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/alldiffs_index_removals.html b/docs/html/sdk/api_diff/23/changes/alldiffs_index_removals.html
index 19b6bb0..15930d0 100644
--- a/docs/html/sdk/api_diff/23/changes/alldiffs_index_removals.html
+++ b/docs/html/sdk/api_diff/23/changes/alldiffs_index_removals.html
@@ -973,8 +973,7 @@
 <nobr>&nbsp;in&nbsp;
 <A HREF="android.Manifest.permission_group.html#android.Manifest.permission_group.WRITE_USER_DICTIONARY" class="hiddenlink" target="rightframe"><strike>android.Manifest.permission_group</strike></A>
 </nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.Manifest.permission.html b/docs/html/sdk/api_diff/23/changes/android.Manifest.permission.html
index be3ec69..501882a 100644
--- a/docs/html/sdk/api_diff/23/changes/android.Manifest.permission.html
+++ b/docs/html/sdk/api_diff/23/changes/android.Manifest.permission.html
@@ -399,8 +399,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.Manifest.permission_group.html b/docs/html/sdk/api_diff/23/changes/android.Manifest.permission_group.html
index 1781743..9645fcd 100644
--- a/docs/html/sdk/api_diff/23/changes/android.Manifest.permission_group.html
+++ b/docs/html/sdk/api_diff/23/changes/android.Manifest.permission_group.html
@@ -319,8 +319,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.R.attr.html b/docs/html/sdk/api_diff/23/changes/android.R.attr.html
index 52d4ec2..8e86e0f 100644
--- a/docs/html/sdk/api_diff/23/changes/android.R.attr.html
+++ b/docs/html/sdk/api_diff/23/changes/android.R.attr.html
@@ -503,8 +503,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.R.id.html b/docs/html/sdk/api_diff/23/changes/android.R.id.html
index 6e6537d..235afdf 100644
--- a/docs/html/sdk/api_diff/23/changes/android.R.id.html
+++ b/docs/html/sdk/api_diff/23/changes/android.R.id.html
@@ -185,8 +185,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.R.string.html b/docs/html/sdk/api_diff/23/changes/android.R.string.html
index d1f5a19..6f44837 100644
--- a/docs/html/sdk/api_diff/23/changes/android.R.string.html
+++ b/docs/html/sdk/api_diff/23/changes/android.R.string.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.R.style.html b/docs/html/sdk/api_diff/23/changes/android.R.style.html
index c076156..b265fe9 100644
--- a/docs/html/sdk/api_diff/23/changes/android.R.style.html
+++ b/docs/html/sdk/api_diff/23/changes/android.R.style.html
@@ -136,8 +136,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.accounts.AbstractAccountAuthenticator.html b/docs/html/sdk/api_diff/23/changes/android.accounts.AbstractAccountAuthenticator.html
index 7f3f24f..b3075446 100644
--- a/docs/html/sdk/api_diff/23/changes/android.accounts.AbstractAccountAuthenticator.html
+++ b/docs/html/sdk/api_diff/23/changes/android.accounts.AbstractAccountAuthenticator.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.accounts.AccountManager.html b/docs/html/sdk/api_diff/23/changes/android.accounts.AccountManager.html
index 9da3f90..b04bb6c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.accounts.AccountManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.accounts.AccountManager.html
@@ -148,8 +148,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.Activity.html b/docs/html/sdk/api_diff/23/changes/android.app.Activity.html
index b37bb90..f7cf218 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.Activity.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.Activity.html
@@ -206,8 +206,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.ActivityManager.RecentTaskInfo.html b/docs/html/sdk/api_diff/23/changes/android.app.ActivityManager.RecentTaskInfo.html
index a2420b55..086938b 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.ActivityManager.RecentTaskInfo.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.ActivityManager.RecentTaskInfo.html
@@ -122,8 +122,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.ActivityManager.RunningAppProcessInfo.html b/docs/html/sdk/api_diff/23/changes/android.app.ActivityManager.RunningAppProcessInfo.html
index 83fdcbc..a937792 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.ActivityManager.RunningAppProcessInfo.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.ActivityManager.RunningAppProcessInfo.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.ActivityManager.html b/docs/html/sdk/api_diff/23/changes/android.app.ActivityManager.html
index 0e0eab2..3d8a173 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.ActivityManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.ActivityManager.html
@@ -176,8 +176,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.ActivityOptions.html b/docs/html/sdk/api_diff/23/changes/android.app.ActivityOptions.html
index e014f34..8fd496b 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.ActivityOptions.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.ActivityOptions.html
@@ -144,8 +144,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.AlarmManager.html b/docs/html/sdk/api_diff/23/changes/android.app.AlarmManager.html
index c02ce3d..3e641cd 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.AlarmManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.AlarmManager.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.AlertDialog.Builder.html b/docs/html/sdk/api_diff/23/changes/android.app.AlertDialog.Builder.html
index dc11ed4..1f1b513 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.AlertDialog.Builder.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.AlertDialog.Builder.html
@@ -111,8 +111,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.AlertDialog.html b/docs/html/sdk/api_diff/23/changes/android.app.AlertDialog.html
index 98ac4ee..06f572b 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.AlertDialog.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.AlertDialog.html
@@ -146,8 +146,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.AppOpsManager.html b/docs/html/sdk/api_diff/23/changes/android.app.AppOpsManager.html
index 93ef93a..a641d72 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.AppOpsManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.AppOpsManager.html
@@ -305,8 +305,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.Dialog.html b/docs/html/sdk/api_diff/23/changes/android.app.Dialog.html
index eb2c903..15babc5 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.Dialog.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.Dialog.html
@@ -122,8 +122,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.Fragment.html b/docs/html/sdk/api_diff/23/changes/android.app.Fragment.html
index b7bf3af..0051c3e 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.Fragment.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.Fragment.html
@@ -190,8 +190,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.Instrumentation.html b/docs/html/sdk/api_diff/23/changes/android.app.Instrumentation.html
index b159575..0d98974 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.Instrumentation.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.Instrumentation.html
@@ -121,8 +121,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.KeyguardManager.html b/docs/html/sdk/api_diff/23/changes/android.app.KeyguardManager.html
index 14eecf4..93d0f63 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.KeyguardManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.KeyguardManager.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.Notification.Action.Builder.html b/docs/html/sdk/api_diff/23/changes/android.app.Notification.Action.Builder.html
index 53af4ae..763a0d6 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.Notification.Action.Builder.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.Notification.Action.Builder.html
@@ -126,8 +126,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.Notification.Action.html b/docs/html/sdk/api_diff/23/changes/android.app.Notification.Action.html
index b19098e..2f6f3b9 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.Notification.Action.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.Notification.Action.html
@@ -143,8 +143,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.Notification.BigPictureStyle.html b/docs/html/sdk/api_diff/23/changes/android.app.Notification.BigPictureStyle.html
index 70b14d9..1ba93ca 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.Notification.BigPictureStyle.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.Notification.BigPictureStyle.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.Notification.Builder.html b/docs/html/sdk/api_diff/23/changes/android.app.Notification.Builder.html
index 8dab8ea..1109b07 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.Notification.Builder.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.Notification.Builder.html
@@ -133,8 +133,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.Notification.html b/docs/html/sdk/api_diff/23/changes/android.app.Notification.html
index ce5ef7c..81fb1a7 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.Notification.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.Notification.html
@@ -171,8 +171,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.NotificationManager.html b/docs/html/sdk/api_diff/23/changes/android.app.NotificationManager.html
index 97655b4e..a035224 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.NotificationManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.NotificationManager.html
@@ -207,8 +207,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.PendingIntent.html b/docs/html/sdk/api_diff/23/changes/android.app.PendingIntent.html
index b88319d..722c1a9 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.PendingIntent.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.PendingIntent.html
@@ -123,8 +123,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.SharedElementCallback.html b/docs/html/sdk/api_diff/23/changes/android.app.SharedElementCallback.html
index 10129b1..934db81 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.SharedElementCallback.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.SharedElementCallback.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.WallpaperManager.html b/docs/html/sdk/api_diff/23/changes/android.app.WallpaperManager.html
index c7cfcab..292b27556 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.WallpaperManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.WallpaperManager.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.admin.DeviceAdminReceiver.html b/docs/html/sdk/api_diff/23/changes/android.app.admin.DeviceAdminReceiver.html
index 2cbe178..09b492e 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.admin.DeviceAdminReceiver.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.admin.DeviceAdminReceiver.html
@@ -122,8 +122,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.admin.DevicePolicyManager.html b/docs/html/sdk/api_diff/23/changes/android.app.admin.DevicePolicyManager.html
index 122b54c..4cc2ccd 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.admin.DevicePolicyManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.admin.DevicePolicyManager.html
@@ -371,8 +371,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.usage.UsageEvents.Event.html b/docs/html/sdk/api_diff/23/changes/android.app.usage.UsageEvents.Event.html
index 4f860ab..45ae543 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.usage.UsageEvents.Event.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.usage.UsageEvents.Event.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.app.usage.UsageStatsManager.html b/docs/html/sdk/api_diff/23/changes/android.app.usage.UsageStatsManager.html
index 8761ae6..769af2e 100644
--- a/docs/html/sdk/api_diff/23/changes/android.app.usage.UsageStatsManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.app.usage.UsageStatsManager.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.bluetooth.BluetoothDevice.html b/docs/html/sdk/api_diff/23/changes/android.bluetooth.BluetoothDevice.html
index d6b30ef..c9dbc8c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.bluetooth.BluetoothDevice.html
+++ b/docs/html/sdk/api_diff/23/changes/android.bluetooth.BluetoothDevice.html
@@ -137,8 +137,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.bluetooth.BluetoothProfile.html b/docs/html/sdk/api_diff/23/changes/android.bluetooth.BluetoothProfile.html
index 6649c72..bffb4d6 100644
--- a/docs/html/sdk/api_diff/23/changes/android.bluetooth.BluetoothProfile.html
+++ b/docs/html/sdk/api_diff/23/changes/android.bluetooth.BluetoothProfile.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.bluetooth.BluetoothSocket.html b/docs/html/sdk/api_diff/23/changes/android.bluetooth.BluetoothSocket.html
index dee2254..8479ea9 100644
--- a/docs/html/sdk/api_diff/23/changes/android.bluetooth.BluetoothSocket.html
+++ b/docs/html/sdk/api_diff/23/changes/android.bluetooth.BluetoothSocket.html
@@ -151,8 +151,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.bluetooth.le.ScanSettings.Builder.html b/docs/html/sdk/api_diff/23/changes/android.bluetooth.le.ScanSettings.Builder.html
index 94d20f3..397e981 100644
--- a/docs/html/sdk/api_diff/23/changes/android.bluetooth.le.ScanSettings.Builder.html
+++ b/docs/html/sdk/api_diff/23/changes/android.bluetooth.le.ScanSettings.Builder.html
@@ -122,8 +122,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.bluetooth.le.ScanSettings.html b/docs/html/sdk/api_diff/23/changes/android.bluetooth.le.ScanSettings.html
index 210a809..7fa4b7a 100644
--- a/docs/html/sdk/api_diff/23/changes/android.bluetooth.le.ScanSettings.html
+++ b/docs/html/sdk/api_diff/23/changes/android.bluetooth.le.ScanSettings.html
@@ -157,8 +157,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.content.AbstractThreadedSyncAdapter.html b/docs/html/sdk/api_diff/23/changes/android.content.AbstractThreadedSyncAdapter.html
index 38f5c6b..25ddd8d 100644
--- a/docs/html/sdk/api_diff/23/changes/android.content.AbstractThreadedSyncAdapter.html
+++ b/docs/html/sdk/api_diff/23/changes/android.content.AbstractThreadedSyncAdapter.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.content.ComponentName.html b/docs/html/sdk/api_diff/23/changes/android.content.ComponentName.html
index a78ce74..3a1cb88 100644
--- a/docs/html/sdk/api_diff/23/changes/android.content.ComponentName.html
+++ b/docs/html/sdk/api_diff/23/changes/android.content.ComponentName.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.content.ContentProviderOperation.html b/docs/html/sdk/api_diff/23/changes/android.content.ContentProviderOperation.html
index bd570f0..1b047aa 100644
--- a/docs/html/sdk/api_diff/23/changes/android.content.ContentProviderOperation.html
+++ b/docs/html/sdk/api_diff/23/changes/android.content.ContentProviderOperation.html
@@ -129,8 +129,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.content.Context.html b/docs/html/sdk/api_diff/23/changes/android.content.Context.html
index be00806..ad2f8e1 100644
--- a/docs/html/sdk/api_diff/23/changes/android.content.Context.html
+++ b/docs/html/sdk/api_diff/23/changes/android.content.Context.html
@@ -189,8 +189,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.content.ContextWrapper.html b/docs/html/sdk/api_diff/23/changes/android.content.ContextWrapper.html
index 6e48e64..17c3b93 100644
--- a/docs/html/sdk/api_diff/23/changes/android.content.ContextWrapper.html
+++ b/docs/html/sdk/api_diff/23/changes/android.content.ContextWrapper.html
@@ -253,8 +253,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.content.Intent.html b/docs/html/sdk/api_diff/23/changes/android.content.Intent.html
index d71904b..4a0e289 100644
--- a/docs/html/sdk/api_diff/23/changes/android.content.Intent.html
+++ b/docs/html/sdk/api_diff/23/changes/android.content.Intent.html
@@ -164,8 +164,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.content.RestrictionEntry.html b/docs/html/sdk/api_diff/23/changes/android.content.RestrictionEntry.html
index 4e78b31..e368453 100644
--- a/docs/html/sdk/api_diff/23/changes/android.content.RestrictionEntry.html
+++ b/docs/html/sdk/api_diff/23/changes/android.content.RestrictionEntry.html
@@ -151,8 +151,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.content.RestrictionsManager.html b/docs/html/sdk/api_diff/23/changes/android.content.RestrictionsManager.html
index 0b5c0b6..7ca3272 100644
--- a/docs/html/sdk/api_diff/23/changes/android.content.RestrictionsManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.content.RestrictionsManager.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.content.pm.ApplicationInfo.html b/docs/html/sdk/api_diff/23/changes/android.content.pm.ApplicationInfo.html
index 3262fe3..66c10ef 100644
--- a/docs/html/sdk/api_diff/23/changes/android.content.pm.ApplicationInfo.html
+++ b/docs/html/sdk/api_diff/23/changes/android.content.pm.ApplicationInfo.html
@@ -122,8 +122,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.content.pm.PackageInfo.html b/docs/html/sdk/api_diff/23/changes/android.content.pm.PackageInfo.html
index 28be185..924dca5 100644
--- a/docs/html/sdk/api_diff/23/changes/android.content.pm.PackageInfo.html
+++ b/docs/html/sdk/api_diff/23/changes/android.content.pm.PackageInfo.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.content.pm.PackageManager.html b/docs/html/sdk/api_diff/23/changes/android.content.pm.PackageManager.html
index d00bffa..e7ff620 100644
--- a/docs/html/sdk/api_diff/23/changes/android.content.pm.PackageManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.content.pm.PackageManager.html
@@ -158,8 +158,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.content.pm.PermissionInfo.html b/docs/html/sdk/api_diff/23/changes/android.content.pm.PermissionInfo.html
index c85a871..1148ad4 100644
--- a/docs/html/sdk/api_diff/23/changes/android.content.pm.PermissionInfo.html
+++ b/docs/html/sdk/api_diff/23/changes/android.content.pm.PermissionInfo.html
@@ -178,8 +178,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.content.res.ColorStateList.html b/docs/html/sdk/api_diff/23/changes/android.content.res.ColorStateList.html
index ce13686..358f993 100644
--- a/docs/html/sdk/api_diff/23/changes/android.content.res.ColorStateList.html
+++ b/docs/html/sdk/api_diff/23/changes/android.content.res.ColorStateList.html
@@ -137,8 +137,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.content.res.Configuration.html b/docs/html/sdk/api_diff/23/changes/android.content.res.Configuration.html
index 398bcd8..06b13a0 100644
--- a/docs/html/sdk/api_diff/23/changes/android.content.res.Configuration.html
+++ b/docs/html/sdk/api_diff/23/changes/android.content.res.Configuration.html
@@ -144,8 +144,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.content.res.Resources.Theme.html b/docs/html/sdk/api_diff/23/changes/android.content.res.Resources.Theme.html
index 7339619..bb3a197 100644
--- a/docs/html/sdk/api_diff/23/changes/android.content.res.Resources.Theme.html
+++ b/docs/html/sdk/api_diff/23/changes/android.content.res.Resources.Theme.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.content.res.Resources.html b/docs/html/sdk/api_diff/23/changes/android.content.res.Resources.html
index a2df740..799d2dd 100644
--- a/docs/html/sdk/api_diff/23/changes/android.content.res.Resources.html
+++ b/docs/html/sdk/api_diff/23/changes/android.content.res.Resources.html
@@ -151,8 +151,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.database.AbstractCursor.html b/docs/html/sdk/api_diff/23/changes/android.database.AbstractCursor.html
index 2a16c48..463080ac 100644
--- a/docs/html/sdk/api_diff/23/changes/android.database.AbstractCursor.html
+++ b/docs/html/sdk/api_diff/23/changes/android.database.AbstractCursor.html
@@ -172,8 +172,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.database.Cursor.html b/docs/html/sdk/api_diff/23/changes/android.database.Cursor.html
index 53dd3d5..383f11e 100644
--- a/docs/html/sdk/api_diff/23/changes/android.database.Cursor.html
+++ b/docs/html/sdk/api_diff/23/changes/android.database.Cursor.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.database.CursorWrapper.html b/docs/html/sdk/api_diff/23/changes/android.database.CursorWrapper.html
index 72326bb..cbaa49b 100644
--- a/docs/html/sdk/api_diff/23/changes/android.database.CursorWrapper.html
+++ b/docs/html/sdk/api_diff/23/changes/android.database.CursorWrapper.html
@@ -136,8 +136,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.graphics.Canvas.html b/docs/html/sdk/api_diff/23/changes/android.graphics.Canvas.html
index 2941907..1ba777a 100644
--- a/docs/html/sdk/api_diff/23/changes/android.graphics.Canvas.html
+++ b/docs/html/sdk/api_diff/23/changes/android.graphics.Canvas.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.graphics.ImageFormat.html b/docs/html/sdk/api_diff/23/changes/android.graphics.ImageFormat.html
index e79f471..2e560e3 100644
--- a/docs/html/sdk/api_diff/23/changes/android.graphics.ImageFormat.html
+++ b/docs/html/sdk/api_diff/23/changes/android.graphics.ImageFormat.html
@@ -157,8 +157,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.graphics.Paint.html b/docs/html/sdk/api_diff/23/changes/android.graphics.Paint.html
index a318b03..f5a9b6c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.graphics.Paint.html
+++ b/docs/html/sdk/api_diff/23/changes/android.graphics.Paint.html
@@ -136,8 +136,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.AnimatedVectorDrawable.html b/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.AnimatedVectorDrawable.html
index 5b69bf5..ca61893 100644
--- a/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.AnimatedVectorDrawable.html
+++ b/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.AnimatedVectorDrawable.html
@@ -130,8 +130,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.ClipDrawable.html b/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.ClipDrawable.html
index 837e800..2f0c6c4 100644
--- a/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.ClipDrawable.html
+++ b/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.ClipDrawable.html
@@ -177,8 +177,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.Drawable.html b/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.Drawable.html
index f47da86..30b0c36 100644
--- a/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.Drawable.html
+++ b/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.Drawable.html
@@ -154,8 +154,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.InsetDrawable.html b/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.InsetDrawable.html
index 133fbaa..5c2dfa2 100644
--- a/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.InsetDrawable.html
+++ b/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.InsetDrawable.html
@@ -187,8 +187,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.LayerDrawable.html b/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.LayerDrawable.html
index 4a74187..aa314ce 100644
--- a/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.LayerDrawable.html
+++ b/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.LayerDrawable.html
@@ -318,8 +318,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.RippleDrawable.html b/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.RippleDrawable.html
index 11b3cd5..9d27715 100644
--- a/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.RippleDrawable.html
+++ b/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.RippleDrawable.html
@@ -130,8 +130,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.RotateDrawable.html b/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.RotateDrawable.html
index 201aad5..4dad05f 100644
--- a/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.RotateDrawable.html
+++ b/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.RotateDrawable.html
@@ -197,8 +197,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.ScaleDrawable.html b/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.ScaleDrawable.html
index 9a8f973..033edec 100644
--- a/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.ScaleDrawable.html
+++ b/docs/html/sdk/api_diff/23/changes/android.graphics.drawable.ScaleDrawable.html
@@ -187,8 +187,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.hardware.Camera.html b/docs/html/sdk/api_diff/23/changes/android.hardware.Camera.html
index f6cd4b4..6313228 100644
--- a/docs/html/sdk/api_diff/23/changes/android.hardware.Camera.html
+++ b/docs/html/sdk/api_diff/23/changes/android.hardware.Camera.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraAccessException.html b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraAccessException.html
index c814d74..3e894ae 100644
--- a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraAccessException.html
+++ b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraAccessException.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraCaptureSession.StateCallback.html b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraCaptureSession.StateCallback.html
index f7dea8a..ccb7a52 100644
--- a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraCaptureSession.StateCallback.html
+++ b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraCaptureSession.StateCallback.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraCaptureSession.html b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraCaptureSession.html
index 4a90974..5dd352d 100644
--- a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraCaptureSession.html
+++ b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraCaptureSession.html
@@ -122,8 +122,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraCharacteristics.html b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraCharacteristics.html
index 5b0b7d1..ecab6df 100644
--- a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraCharacteristics.html
+++ b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraCharacteristics.html
@@ -199,8 +199,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraDevice.html b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraDevice.html
index 6d82a71..2f74d97 100644
--- a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraDevice.html
+++ b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraDevice.html
@@ -122,8 +122,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraManager.html b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraManager.html
index 673e92b..e927f0b 100644
--- a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraManager.html
@@ -122,8 +122,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraMetadata.html b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraMetadata.html
index 62d7ace..e4b9195 100644
--- a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraMetadata.html
+++ b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CameraMetadata.html
@@ -209,8 +209,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CaptureRequest.html b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CaptureRequest.html
index 72e5ce5..936c076 100644
--- a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CaptureRequest.html
+++ b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CaptureRequest.html
@@ -137,8 +137,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CaptureResult.html b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CaptureResult.html
index 0b1d532..0137f79 100644
--- a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CaptureResult.html
+++ b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.CaptureResult.html
@@ -150,8 +150,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.params.StreamConfigurationMap.html b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.params.StreamConfigurationMap.html
index b71163a..d95a6ac 100644
--- a/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.params.StreamConfigurationMap.html
+++ b/docs/html/sdk/api_diff/23/changes/android.hardware.camera2.params.StreamConfigurationMap.html
@@ -129,8 +129,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.hardware.usb.UsbDevice.html b/docs/html/sdk/api_diff/23/changes/android.hardware.usb.UsbDevice.html
index 7e76be3..0a7732f 100644
--- a/docs/html/sdk/api_diff/23/changes/android.hardware.usb.UsbDevice.html
+++ b/docs/html/sdk/api_diff/23/changes/android.hardware.usb.UsbDevice.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.AsyncPlayer.html b/docs/html/sdk/api_diff/23/changes/android.media.AsyncPlayer.html
index f68d1e8..f74a543 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.AsyncPlayer.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.AsyncPlayer.html
@@ -130,8 +130,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.AudioFormat.Builder.html b/docs/html/sdk/api_diff/23/changes/android.media.AudioFormat.Builder.html
index c56efd8..bdbeb51 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.AudioFormat.Builder.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.AudioFormat.Builder.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.AudioFormat.html b/docs/html/sdk/api_diff/23/changes/android.media.AudioFormat.html
index cf84a6f..412bcb3 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.AudioFormat.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.AudioFormat.html
@@ -161,8 +161,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.AudioManager.html b/docs/html/sdk/api_diff/23/changes/android.media.AudioManager.html
index f479b11..bd9df5d 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.AudioManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.AudioManager.html
@@ -221,8 +221,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.AudioRecord.html b/docs/html/sdk/api_diff/23/changes/android.media.AudioRecord.html
index ad8a1da..a1d5a9c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.AudioRecord.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.AudioRecord.html
@@ -200,8 +200,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.AudioTrack.html b/docs/html/sdk/api_diff/23/changes/android.media.AudioTrack.html
index 62022ed..ea3bd18 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.AudioTrack.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.AudioTrack.html
@@ -185,8 +185,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.ExifInterface.html b/docs/html/sdk/api_diff/23/changes/android.media.ExifInterface.html
index 5318461..2b79d99 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.ExifInterface.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.ExifInterface.html
@@ -129,8 +129,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.Image.html b/docs/html/sdk/api_diff/23/changes/android.media.Image.html
index d05aa87..63c18eb 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.Image.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.Image.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaCodec.CodecException.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaCodec.CodecException.html
index 2c30a5a..0e1c9b5 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaCodec.CodecException.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaCodec.CodecException.html
@@ -130,8 +130,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaCodec.CryptoException.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaCodec.CryptoException.html
index bc9f887..985125a 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaCodec.CryptoException.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaCodec.CryptoException.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaCodec.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaCodec.html
index dc5ccdb..293ec08 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaCodec.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaCodec.html
@@ -136,8 +136,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaCodecInfo.CodecCapabilities.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaCodecInfo.CodecCapabilities.html
index f3ac732..cbb34c3 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaCodecInfo.CodecCapabilities.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaCodecInfo.CodecCapabilities.html
@@ -501,8 +501,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaCodecInfo.CodecProfileLevel.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaCodecInfo.CodecProfileLevel.html
index 440e651..181a607 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaCodecInfo.CodecProfileLevel.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaCodecInfo.CodecProfileLevel.html
@@ -171,8 +171,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaCodecInfo.VideoCapabilities.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaCodecInfo.VideoCapabilities.html
index acceec8..7983a12 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaCodecInfo.VideoCapabilities.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaCodecInfo.VideoCapabilities.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaCrypto.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaCrypto.html
index 8751953..9206dfc 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaCrypto.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaCrypto.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaDescription.Builder.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaDescription.Builder.html
index de70f44..a4f1496 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaDescription.Builder.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaDescription.Builder.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaDescription.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaDescription.html
index 869ae0f..b92a242 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaDescription.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaDescription.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaDrm.KeyRequest.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaDrm.KeyRequest.html
index 2ecbc24..c807b8b 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaDrm.KeyRequest.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaDrm.KeyRequest.html
@@ -137,8 +137,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaDrm.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaDrm.html
index 2b2967a..4254172 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaDrm.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaDrm.html
@@ -147,8 +147,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaExtractor.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaExtractor.html
index 0f99c34..bce1b1c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaExtractor.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaExtractor.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaFormat.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaFormat.html
index f308bfb..09fd3c6 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaFormat.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaFormat.html
@@ -150,8 +150,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaMetadataRetriever.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaMetadataRetriever.html
index 1290ded..ca59780 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaMetadataRetriever.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaMetadataRetriever.html
@@ -123,8 +123,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaPlayer.TrackInfo.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaPlayer.TrackInfo.html
index d222c25..831c6fb 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaPlayer.TrackInfo.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaPlayer.TrackInfo.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaPlayer.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaPlayer.html
index 87b3eff..45d23e4 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaPlayer.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaPlayer.html
@@ -150,8 +150,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.MediaRecorder.html b/docs/html/sdk/api_diff/23/changes/android.media.MediaRecorder.html
index d3eb76f..fc17d9b 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.MediaRecorder.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.MediaRecorder.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.browse.MediaBrowser.html b/docs/html/sdk/api_diff/23/changes/android.media.browse.MediaBrowser.html
index 64bf6b6..7340a90 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.browse.MediaBrowser.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.browse.MediaBrowser.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.session.MediaController.TransportControls.html b/docs/html/sdk/api_diff/23/changes/android.media.session.MediaController.TransportControls.html
index 1bb85d3..30bd3e0 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.session.MediaController.TransportControls.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.session.MediaController.TransportControls.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.session.MediaSession.Callback.html b/docs/html/sdk/api_diff/23/changes/android.media.session.MediaSession.Callback.html
index 2137ecb..c62343e 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.session.MediaSession.Callback.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.session.MediaSession.Callback.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.session.PlaybackState.html b/docs/html/sdk/api_diff/23/changes/android.media.session.PlaybackState.html
index 64160b3..9b1913c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.session.PlaybackState.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.session.PlaybackState.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvContentRating.html b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvContentRating.html
index a6ef2e7..2eb9289 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvContentRating.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvContentRating.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvContract.Channels.html b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvContract.Channels.html
index 5171bf5..0504ca0 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvContract.Channels.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvContract.Channels.html
@@ -164,8 +164,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvContract.Programs.html b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvContract.Programs.html
index 49cee1d..e87dcb7 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvContract.Programs.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvContract.Programs.html
@@ -136,8 +136,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvInputManager.html b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvInputManager.html
index c1ea72f..b55a2d0 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvInputManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvInputManager.html
@@ -143,8 +143,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvInputService.Session.html b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvInputService.Session.html
index c66ace3..57f8357 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvInputService.Session.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvInputService.Session.html
@@ -164,8 +164,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvTrackInfo.Builder.html b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvTrackInfo.Builder.html
index 808a001..5660eb1 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvTrackInfo.Builder.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvTrackInfo.Builder.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvTrackInfo.html b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvTrackInfo.html
index 4d90aec..e5bc56b 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvTrackInfo.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvTrackInfo.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvView.TvInputCallback.html b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvView.TvInputCallback.html
index df8a7ce..b0b2837 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvView.TvInputCallback.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvView.TvInputCallback.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvView.html b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvView.html
index b2ed301..fd3436f 100644
--- a/docs/html/sdk/api_diff/23/changes/android.media.tv.TvView.html
+++ b/docs/html/sdk/api_diff/23/changes/android.media.tv.TvView.html
@@ -136,8 +136,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.net.ConnectivityManager.html b/docs/html/sdk/api_diff/23/changes/android.net.ConnectivityManager.html
index be3320d..2d502b9 100644
--- a/docs/html/sdk/api_diff/23/changes/android.net.ConnectivityManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.net.ConnectivityManager.html
@@ -282,8 +282,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.net.IpPrefix.html b/docs/html/sdk/api_diff/23/changes/android.net.IpPrefix.html
index 82570e1..75c7810 100644
--- a/docs/html/sdk/api_diff/23/changes/android.net.IpPrefix.html
+++ b/docs/html/sdk/api_diff/23/changes/android.net.IpPrefix.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.net.Network.html b/docs/html/sdk/api_diff/23/changes/android.net.Network.html
index eb7203d..c1ee6e0 100644
--- a/docs/html/sdk/api_diff/23/changes/android.net.Network.html
+++ b/docs/html/sdk/api_diff/23/changes/android.net.Network.html
@@ -122,8 +122,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.net.NetworkCapabilities.html b/docs/html/sdk/api_diff/23/changes/android.net.NetworkCapabilities.html
index 4739b02..5d27820 100644
--- a/docs/html/sdk/api_diff/23/changes/android.net.NetworkCapabilities.html
+++ b/docs/html/sdk/api_diff/23/changes/android.net.NetworkCapabilities.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.net.Proxy.html b/docs/html/sdk/api_diff/23/changes/android.net.Proxy.html
index 847205a..2ecff4f 100644
--- a/docs/html/sdk/api_diff/23/changes/android.net.Proxy.html
+++ b/docs/html/sdk/api_diff/23/changes/android.net.Proxy.html
@@ -110,8 +110,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.net.ProxyInfo.html b/docs/html/sdk/api_diff/23/changes/android.net.ProxyInfo.html
index 61e1552..3b1bb7c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.net.ProxyInfo.html
+++ b/docs/html/sdk/api_diff/23/changes/android.net.ProxyInfo.html
@@ -94,8 +94,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.net.SSLCertificateSocketFactory.html b/docs/html/sdk/api_diff/23/changes/android.net.SSLCertificateSocketFactory.html
index 9066e26..1c39138 100644
--- a/docs/html/sdk/api_diff/23/changes/android.net.SSLCertificateSocketFactory.html
+++ b/docs/html/sdk/api_diff/23/changes/android.net.SSLCertificateSocketFactory.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.net.wifi.ScanResult.html b/docs/html/sdk/api_diff/23/changes/android.net.wifi.ScanResult.html
index 640f0e2..acb7f4b6 100644
--- a/docs/html/sdk/api_diff/23/changes/android.net.wifi.ScanResult.html
+++ b/docs/html/sdk/api_diff/23/changes/android.net.wifi.ScanResult.html
@@ -193,8 +193,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.net.wifi.WifiConfiguration.html b/docs/html/sdk/api_diff/23/changes/android.net.wifi.WifiConfiguration.html
index c49efb6..8319235 100644
--- a/docs/html/sdk/api_diff/23/changes/android.net.wifi.WifiConfiguration.html
+++ b/docs/html/sdk/api_diff/23/changes/android.net.wifi.WifiConfiguration.html
@@ -130,8 +130,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.net.wifi.WifiEnterpriseConfig.Eap.html b/docs/html/sdk/api_diff/23/changes/android.net.wifi.WifiEnterpriseConfig.Eap.html
index 9a6cb9e..8ce143c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.net.wifi.WifiEnterpriseConfig.Eap.html
+++ b/docs/html/sdk/api_diff/23/changes/android.net.wifi.WifiEnterpriseConfig.Eap.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.net.wifi.WifiEnterpriseConfig.html b/docs/html/sdk/api_diff/23/changes/android.net.wifi.WifiEnterpriseConfig.html
index ac0d9c3..a7ce4e2 100644
--- a/docs/html/sdk/api_diff/23/changes/android.net.wifi.WifiEnterpriseConfig.html
+++ b/docs/html/sdk/api_diff/23/changes/android.net.wifi.WifiEnterpriseConfig.html
@@ -185,8 +185,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.net.wifi.WifiManager.html b/docs/html/sdk/api_diff/23/changes/android.net.wifi.WifiManager.html
index 21c1048..eb631ad 100644
--- a/docs/html/sdk/api_diff/23/changes/android.net.wifi.WifiManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.net.wifi.WifiManager.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.nfc.NfcEvent.html b/docs/html/sdk/api_diff/23/changes/android.nfc.NfcEvent.html
index 39adff8..7a7310a 100644
--- a/docs/html/sdk/api_diff/23/changes/android.nfc.NfcEvent.html
+++ b/docs/html/sdk/api_diff/23/changes/android.nfc.NfcEvent.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.BatteryManager.html b/docs/html/sdk/api_diff/23/changes/android.os.BatteryManager.html
index 1970c7b..12542d8 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.BatteryManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.BatteryManager.html
@@ -145,8 +145,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.Build.VERSION.html b/docs/html/sdk/api_diff/23/changes/android.os.Build.VERSION.html
index 9726626..ee3040c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.Build.VERSION.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.Build.VERSION.html
@@ -122,8 +122,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.Build.VERSION_CODES.html b/docs/html/sdk/api_diff/23/changes/android.os.Build.VERSION_CODES.html
index 1d42a0f..8cf9c73 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.Build.VERSION_CODES.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.Build.VERSION_CODES.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.DeadObjectException.html b/docs/html/sdk/api_diff/23/changes/android.os.DeadObjectException.html
index ccbf91b..908c9c7 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.DeadObjectException.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.DeadObjectException.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.Debug.InstructionCount.html b/docs/html/sdk/api_diff/23/changes/android.os.Debug.InstructionCount.html
index 801afaf..cbdf07f 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.Debug.InstructionCount.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.Debug.InstructionCount.html
@@ -94,8 +94,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.Debug.MemoryInfo.html b/docs/html/sdk/api_diff/23/changes/android.os.Debug.MemoryInfo.html
index 77ee3a0..f409353 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.Debug.MemoryInfo.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.Debug.MemoryInfo.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.Debug.html b/docs/html/sdk/api_diff/23/changes/android.os.Debug.html
index a97af60..583f481 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.Debug.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.Debug.html
@@ -350,8 +350,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.Environment.html b/docs/html/sdk/api_diff/23/changes/android.os.Environment.html
index e4d759a..56315a8 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.Environment.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.Environment.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.Looper.html b/docs/html/sdk/api_diff/23/changes/android.os.Looper.html
index e70904e..e200aed 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.Looper.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.Looper.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.MessageQueue.html b/docs/html/sdk/api_diff/23/changes/android.os.MessageQueue.html
index 31ac6891..1ac8eb3 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.MessageQueue.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.MessageQueue.html
@@ -122,8 +122,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.Parcel.html b/docs/html/sdk/api_diff/23/changes/android.os.Parcel.html
index 2d5daba..9d724db 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.Parcel.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.Parcel.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.PowerManager.html b/docs/html/sdk/api_diff/23/changes/android.os.PowerManager.html
index a0e4809..af683c7 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.PowerManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.PowerManager.html
@@ -130,8 +130,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.Process.html b/docs/html/sdk/api_diff/23/changes/android.os.Process.html
index 73fcb63..84b9fa8 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.Process.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.Process.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.RecoverySystem.html b/docs/html/sdk/api_diff/23/changes/android.os.RecoverySystem.html
index 19fc015..48dcc36 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.RecoverySystem.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.RecoverySystem.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.StrictMode.ThreadPolicy.Builder.html b/docs/html/sdk/api_diff/23/changes/android.os.StrictMode.ThreadPolicy.Builder.html
index 414a7ca..90b3dbe 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.StrictMode.ThreadPolicy.Builder.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.StrictMode.ThreadPolicy.Builder.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.StrictMode.VmPolicy.Builder.html b/docs/html/sdk/api_diff/23/changes/android.os.StrictMode.VmPolicy.Builder.html
index ed031a0..780f1bc 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.StrictMode.VmPolicy.Builder.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.StrictMode.VmPolicy.Builder.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.TransactionTooLargeException.html b/docs/html/sdk/api_diff/23/changes/android.os.TransactionTooLargeException.html
index b4c452f..fb9883d 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.TransactionTooLargeException.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.TransactionTooLargeException.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.os.UserManager.html b/docs/html/sdk/api_diff/23/changes/android.os.UserManager.html
index c8cb278..d77c6b9 100644
--- a/docs/html/sdk/api_diff/23/changes/android.os.UserManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.os.UserManager.html
@@ -169,8 +169,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.print.PrintAttributes.Builder.html b/docs/html/sdk/api_diff/23/changes/android.print.PrintAttributes.Builder.html
index 69d6fad..45b754c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.print.PrintAttributes.Builder.html
+++ b/docs/html/sdk/api_diff/23/changes/android.print.PrintAttributes.Builder.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.print.PrintAttributes.html b/docs/html/sdk/api_diff/23/changes/android.print.PrintAttributes.html
index a607bdb..34938b5 100644
--- a/docs/html/sdk/api_diff/23/changes/android.print.PrintAttributes.html
+++ b/docs/html/sdk/api_diff/23/changes/android.print.PrintAttributes.html
@@ -137,8 +137,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.print.PrinterCapabilitiesInfo.Builder.html b/docs/html/sdk/api_diff/23/changes/android.print.PrinterCapabilitiesInfo.Builder.html
index dc00459..a2ba700 100644
--- a/docs/html/sdk/api_diff/23/changes/android.print.PrinterCapabilitiesInfo.Builder.html
+++ b/docs/html/sdk/api_diff/23/changes/android.print.PrinterCapabilitiesInfo.Builder.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.print.PrinterCapabilitiesInfo.html b/docs/html/sdk/api_diff/23/changes/android.print.PrinterCapabilitiesInfo.html
index 1fc8ff6..94bd989 100644
--- a/docs/html/sdk/api_diff/23/changes/android.print.PrinterCapabilitiesInfo.html
+++ b/docs/html/sdk/api_diff/23/changes/android.print.PrinterCapabilitiesInfo.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.printservice.PrintService.html b/docs/html/sdk/api_diff/23/changes/android.printservice.PrintService.html
index 7ffa278..32fe84c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.printservice.PrintService.html
+++ b/docs/html/sdk/api_diff/23/changes/android.printservice.PrintService.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.AlarmClock.html b/docs/html/sdk/api_diff/23/changes/android.provider.AlarmClock.html
index 15b2c45..0d7a2ce 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.AlarmClock.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.AlarmClock.html
@@ -164,8 +164,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.Browser.html b/docs/html/sdk/api_diff/23/changes/android.provider.Browser.html
index 3a5ba25..27b667c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.Browser.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.Browser.html
@@ -305,8 +305,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.CallLog.Calls.html b/docs/html/sdk/api_diff/23/changes/android.provider.CallLog.Calls.html
index 812e33c..5f91a2a 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.CallLog.Calls.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.CallLog.Calls.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.CommonDataKinds.Email.html b/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.CommonDataKinds.Email.html
index 2b1f7434..eb560eb 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.CommonDataKinds.Email.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.CommonDataKinds.Email.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.Contacts.html b/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.Contacts.html
index a5b4618..13eb03a 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.Contacts.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.Contacts.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.DataColumns.html b/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.DataColumns.html
index d9dc7aa..95690b9 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.DataColumns.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.DataColumns.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.DisplayNameSources.html b/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.DisplayNameSources.html
index ebcf996..8e9ec5b 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.DisplayNameSources.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.DisplayNameSources.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.Intents.Insert.html b/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.Intents.Insert.html
index d399871..e9dbed6 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.Intents.Insert.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.Intents.Insert.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.QuickContact.html b/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.QuickContact.html
index f09d783..0f722e7 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.QuickContact.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.ContactsContract.QuickContact.html
@@ -137,8 +137,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.DocumentsContract.html b/docs/html/sdk/api_diff/23/changes/android.provider.DocumentsContract.html
index b65d7a4..530a1b9 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.DocumentsContract.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.DocumentsContract.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.MediaStore.html b/docs/html/sdk/api_diff/23/changes/android.provider.MediaStore.html
index 4aeb95c..37516f0 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.MediaStore.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.MediaStore.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.Settings.Global.html b/docs/html/sdk/api_diff/23/changes/android.provider.Settings.Global.html
index 37b53e6..da128db 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.Settings.Global.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.Settings.Global.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.Settings.Secure.html b/docs/html/sdk/api_diff/23/changes/android.provider.Settings.Secure.html
index 211e50b..518c7fe 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.Settings.Secure.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.Settings.Secure.html
@@ -128,8 +128,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.Settings.System.html b/docs/html/sdk/api_diff/23/changes/android.provider.Settings.System.html
index 9a18a09..22df972 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.Settings.System.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.Settings.System.html
@@ -201,8 +201,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.Settings.html b/docs/html/sdk/api_diff/23/changes/android.provider.Settings.html
index 6224aec..3d60046 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.Settings.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.Settings.html
@@ -214,8 +214,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.Telephony.Threads.html b/docs/html/sdk/api_diff/23/changes/android.provider.Telephony.Threads.html
index 7ea8016..bc1a029 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.Telephony.Threads.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.Telephony.Threads.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.VoicemailContract.Status.html b/docs/html/sdk/api_diff/23/changes/android.provider.VoicemailContract.Status.html
index 9afd431..fb885fb 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.VoicemailContract.Status.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.VoicemailContract.Status.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.provider.VoicemailContract.Voicemails.html b/docs/html/sdk/api_diff/23/changes/android.provider.VoicemailContract.Voicemails.html
index 237ded2..e577928 100644
--- a/docs/html/sdk/api_diff/23/changes/android.provider.VoicemailContract.Voicemails.html
+++ b/docs/html/sdk/api_diff/23/changes/android.provider.VoicemailContract.Voicemails.html
@@ -129,8 +129,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.renderscript.Allocation.html b/docs/html/sdk/api_diff/23/changes/android.renderscript.Allocation.html
index 04b9c76..f9e05cc 100644
--- a/docs/html/sdk/api_diff/23/changes/android.renderscript.Allocation.html
+++ b/docs/html/sdk/api_diff/23/changes/android.renderscript.Allocation.html
@@ -241,8 +241,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.renderscript.AllocationAdapter.html b/docs/html/sdk/api_diff/23/changes/android.renderscript.AllocationAdapter.html
index 2e4a7d8..beb15c5 100644
--- a/docs/html/sdk/api_diff/23/changes/android.renderscript.AllocationAdapter.html
+++ b/docs/html/sdk/api_diff/23/changes/android.renderscript.AllocationAdapter.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.renderscript.Element.html b/docs/html/sdk/api_diff/23/changes/android.renderscript.Element.html
index 78583e4..de45493 100644
--- a/docs/html/sdk/api_diff/23/changes/android.renderscript.Element.html
+++ b/docs/html/sdk/api_diff/23/changes/android.renderscript.Element.html
@@ -129,8 +129,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.renderscript.RenderScript.html b/docs/html/sdk/api_diff/23/changes/android.renderscript.RenderScript.html
index 24d4b9a..a9da0d8 100644
--- a/docs/html/sdk/api_diff/23/changes/android.renderscript.RenderScript.html
+++ b/docs/html/sdk/api_diff/23/changes/android.renderscript.RenderScript.html
@@ -122,8 +122,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.renderscript.Script.html b/docs/html/sdk/api_diff/23/changes/android.renderscript.Script.html
index b86c319..af71e31 100644
--- a/docs/html/sdk/api_diff/23/changes/android.renderscript.Script.html
+++ b/docs/html/sdk/api_diff/23/changes/android.renderscript.Script.html
@@ -122,8 +122,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.renderscript.ScriptGroup.Builder.html b/docs/html/sdk/api_diff/23/changes/android.renderscript.ScriptGroup.Builder.html
index aaf8ccd..8971916 100644
--- a/docs/html/sdk/api_diff/23/changes/android.renderscript.ScriptGroup.Builder.html
+++ b/docs/html/sdk/api_diff/23/changes/android.renderscript.ScriptGroup.Builder.html
@@ -94,8 +94,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.renderscript.ScriptGroup.html b/docs/html/sdk/api_diff/23/changes/android.renderscript.ScriptGroup.html
index c3aa6e7..c639619 100644
--- a/docs/html/sdk/api_diff/23/changes/android.renderscript.ScriptGroup.html
+++ b/docs/html/sdk/api_diff/23/changes/android.renderscript.ScriptGroup.html
@@ -158,8 +158,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.security.KeyChain.html b/docs/html/sdk/api_diff/23/changes/android.security.KeyChain.html
index 33dbc3a1..17845b4 100644
--- a/docs/html/sdk/api_diff/23/changes/android.security.KeyChain.html
+++ b/docs/html/sdk/api_diff/23/changes/android.security.KeyChain.html
@@ -126,8 +126,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.security.KeyPairGeneratorSpec.Builder.html b/docs/html/sdk/api_diff/23/changes/android.security.KeyPairGeneratorSpec.Builder.html
index a61cc22..ab27faf 100644
--- a/docs/html/sdk/api_diff/23/changes/android.security.KeyPairGeneratorSpec.Builder.html
+++ b/docs/html/sdk/api_diff/23/changes/android.security.KeyPairGeneratorSpec.Builder.html
@@ -94,8 +94,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.security.KeyPairGeneratorSpec.html b/docs/html/sdk/api_diff/23/changes/android.security.KeyPairGeneratorSpec.html
index e6e22a3..bd25c91 100644
--- a/docs/html/sdk/api_diff/23/changes/android.security.KeyPairGeneratorSpec.html
+++ b/docs/html/sdk/api_diff/23/changes/android.security.KeyPairGeneratorSpec.html
@@ -94,8 +94,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.security.KeyStoreParameter.Builder.html b/docs/html/sdk/api_diff/23/changes/android.security.KeyStoreParameter.Builder.html
index 8b0a592..8e3a063 100644
--- a/docs/html/sdk/api_diff/23/changes/android.security.KeyStoreParameter.Builder.html
+++ b/docs/html/sdk/api_diff/23/changes/android.security.KeyStoreParameter.Builder.html
@@ -94,8 +94,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.security.KeyStoreParameter.html b/docs/html/sdk/api_diff/23/changes/android.security.KeyStoreParameter.html
index 1200736..8aafe78 100644
--- a/docs/html/sdk/api_diff/23/changes/android.security.KeyStoreParameter.html
+++ b/docs/html/sdk/api_diff/23/changes/android.security.KeyStoreParameter.html
@@ -94,8 +94,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.service.carrier.CarrierMessagingService.html b/docs/html/sdk/api_diff/23/changes/android.service.carrier.CarrierMessagingService.html
index f82d8a3..46675f7 100644
--- a/docs/html/sdk/api_diff/23/changes/android.service.carrier.CarrierMessagingService.html
+++ b/docs/html/sdk/api_diff/23/changes/android.service.carrier.CarrierMessagingService.html
@@ -187,8 +187,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.service.dreams.DreamService.html b/docs/html/sdk/api_diff/23/changes/android.service.dreams.DreamService.html
index 7285d81..f58cdc3 100644
--- a/docs/html/sdk/api_diff/23/changes/android.service.dreams.DreamService.html
+++ b/docs/html/sdk/api_diff/23/changes/android.service.dreams.DreamService.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.service.media.MediaBrowserService.html b/docs/html/sdk/api_diff/23/changes/android.service.media.MediaBrowserService.html
index 92e64f6..0128032 100644
--- a/docs/html/sdk/api_diff/23/changes/android.service.media.MediaBrowserService.html
+++ b/docs/html/sdk/api_diff/23/changes/android.service.media.MediaBrowserService.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.service.notification.NotificationListenerService.html b/docs/html/sdk/api_diff/23/changes/android.service.notification.NotificationListenerService.html
index 635f562..b563ed6 100644
--- a/docs/html/sdk/api_diff/23/changes/android.service.notification.NotificationListenerService.html
+++ b/docs/html/sdk/api_diff/23/changes/android.service.notification.NotificationListenerService.html
@@ -130,8 +130,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.service.voice.VoiceInteractionService.html b/docs/html/sdk/api_diff/23/changes/android.service.voice.VoiceInteractionService.html
index 0a936f0..cedb8f1 100644
--- a/docs/html/sdk/api_diff/23/changes/android.service.voice.VoiceInteractionService.html
+++ b/docs/html/sdk/api_diff/23/changes/android.service.voice.VoiceInteractionService.html
@@ -144,8 +144,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.service.voice.VoiceInteractionSession.html b/docs/html/sdk/api_diff/23/changes/android.service.voice.VoiceInteractionSession.html
index 5c2ebb6..64fe582 100644
--- a/docs/html/sdk/api_diff/23/changes/android.service.voice.VoiceInteractionSession.html
+++ b/docs/html/sdk/api_diff/23/changes/android.service.voice.VoiceInteractionSession.html
@@ -395,8 +395,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.speech.RecognitionService.Callback.html b/docs/html/sdk/api_diff/23/changes/android.speech.RecognitionService.Callback.html
index 4907e35..4a20d3a 100644
--- a/docs/html/sdk/api_diff/23/changes/android.speech.RecognitionService.Callback.html
+++ b/docs/html/sdk/api_diff/23/changes/android.speech.RecognitionService.Callback.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.speech.RecognizerIntent.html b/docs/html/sdk/api_diff/23/changes/android.speech.RecognizerIntent.html
index e347574..a27d165 100644
--- a/docs/html/sdk/api_diff/23/changes/android.speech.RecognizerIntent.html
+++ b/docs/html/sdk/api_diff/23/changes/android.speech.RecognizerIntent.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.speech.tts.UtteranceProgressListener.html b/docs/html/sdk/api_diff/23/changes/android.speech.tts.UtteranceProgressListener.html
index 0384ecb..2de54e9 100644
--- a/docs/html/sdk/api_diff/23/changes/android.speech.tts.UtteranceProgressListener.html
+++ b/docs/html/sdk/api_diff/23/changes/android.speech.tts.UtteranceProgressListener.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.system.OsConstants.html b/docs/html/sdk/api_diff/23/changes/android.system.OsConstants.html
index 4037e49..5c08aa4 100644
--- a/docs/html/sdk/api_diff/23/changes/android.system.OsConstants.html
+++ b/docs/html/sdk/api_diff/23/changes/android.system.OsConstants.html
@@ -164,8 +164,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.telecom.TelecomManager.html b/docs/html/sdk/api_diff/23/changes/android.telecom.TelecomManager.html
index 118d9f0..64ac489 100644
--- a/docs/html/sdk/api_diff/23/changes/android.telecom.TelecomManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.telecom.TelecomManager.html
@@ -326,8 +326,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.telephony.CellSignalStrength.html b/docs/html/sdk/api_diff/23/changes/android.telephony.CellSignalStrength.html
index 1ddc8b4..d57b76e 100644
--- a/docs/html/sdk/api_diff/23/changes/android.telephony.CellSignalStrength.html
+++ b/docs/html/sdk/api_diff/23/changes/android.telephony.CellSignalStrength.html
@@ -136,8 +136,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.telephony.PhoneNumberUtils.html b/docs/html/sdk/api_diff/23/changes/android.telephony.PhoneNumberUtils.html
index 1146436..9d2b92f 100644
--- a/docs/html/sdk/api_diff/23/changes/android.telephony.PhoneNumberUtils.html
+++ b/docs/html/sdk/api_diff/23/changes/android.telephony.PhoneNumberUtils.html
@@ -129,8 +129,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.telephony.SignalStrength.html b/docs/html/sdk/api_diff/23/changes/android.telephony.SignalStrength.html
index de6e283..79db91e 100644
--- a/docs/html/sdk/api_diff/23/changes/android.telephony.SignalStrength.html
+++ b/docs/html/sdk/api_diff/23/changes/android.telephony.SignalStrength.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.telephony.SmsManager.html b/docs/html/sdk/api_diff/23/changes/android.telephony.SmsManager.html
index 1a4344c..792d85a 100644
--- a/docs/html/sdk/api_diff/23/changes/android.telephony.SmsManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.telephony.SmsManager.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.telephony.SmsMessage.html b/docs/html/sdk/api_diff/23/changes/android.telephony.SmsMessage.html
index 7954e44..36b74dc 100644
--- a/docs/html/sdk/api_diff/23/changes/android.telephony.SmsMessage.html
+++ b/docs/html/sdk/api_diff/23/changes/android.telephony.SmsMessage.html
@@ -130,8 +130,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.telephony.TelephonyManager.html b/docs/html/sdk/api_diff/23/changes/android.telephony.TelephonyManager.html
index 8a2dadc..7b6b39c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.telephony.TelephonyManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.telephony.TelephonyManager.html
@@ -190,8 +190,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.test.mock.MockContext.html b/docs/html/sdk/api_diff/23/changes/android.test.mock.MockContext.html
index ae21729..9607b95 100644
--- a/docs/html/sdk/api_diff/23/changes/android.test.mock.MockContext.html
+++ b/docs/html/sdk/api_diff/23/changes/android.test.mock.MockContext.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.test.mock.MockCursor.html b/docs/html/sdk/api_diff/23/changes/android.test.mock.MockCursor.html
index e8abcf7..d61754c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.test.mock.MockCursor.html
+++ b/docs/html/sdk/api_diff/23/changes/android.test.mock.MockCursor.html
@@ -136,8 +136,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.test.mock.MockPackageManager.html b/docs/html/sdk/api_diff/23/changes/android.test.mock.MockPackageManager.html
index add80e0..3cca46a 100644
--- a/docs/html/sdk/api_diff/23/changes/android.test.mock.MockPackageManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.test.mock.MockPackageManager.html
@@ -129,8 +129,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.text.Layout.html b/docs/html/sdk/api_diff/23/changes/android.text.Layout.html
index 891e507..1764a94 100644
--- a/docs/html/sdk/api_diff/23/changes/android.text.Layout.html
+++ b/docs/html/sdk/api_diff/23/changes/android.text.Layout.html
@@ -143,8 +143,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.text.SpannableStringBuilder.html b/docs/html/sdk/api_diff/23/changes/android.text.SpannableStringBuilder.html
index 54dd172..fa301b4 100644
--- a/docs/html/sdk/api_diff/23/changes/android.text.SpannableStringBuilder.html
+++ b/docs/html/sdk/api_diff/23/changes/android.text.SpannableStringBuilder.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.transition.Transition.html b/docs/html/sdk/api_diff/23/changes/android.transition.Transition.html
index 0e3c3a2..c3dc5d2 100644
--- a/docs/html/sdk/api_diff/23/changes/android.transition.Transition.html
+++ b/docs/html/sdk/api_diff/23/changes/android.transition.Transition.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.transition.TransitionManager.html b/docs/html/sdk/api_diff/23/changes/android.transition.TransitionManager.html
index ff5355d..9f42e74 100644
--- a/docs/html/sdk/api_diff/23/changes/android.transition.TransitionManager.html
+++ b/docs/html/sdk/api_diff/23/changes/android.transition.TransitionManager.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.util.ArrayMap.html b/docs/html/sdk/api_diff/23/changes/android.util.ArrayMap.html
index 15df685..1c14a56 100644
--- a/docs/html/sdk/api_diff/23/changes/android.util.ArrayMap.html
+++ b/docs/html/sdk/api_diff/23/changes/android.util.ArrayMap.html
@@ -123,8 +123,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.util.DisplayMetrics.html b/docs/html/sdk/api_diff/23/changes/android.util.DisplayMetrics.html
index 4973462..a58b13d 100644
--- a/docs/html/sdk/api_diff/23/changes/android.util.DisplayMetrics.html
+++ b/docs/html/sdk/api_diff/23/changes/android.util.DisplayMetrics.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.util.EventLog.html b/docs/html/sdk/api_diff/23/changes/android.util.EventLog.html
index bed26da..5258217 100644
--- a/docs/html/sdk/api_diff/23/changes/android.util.EventLog.html
+++ b/docs/html/sdk/api_diff/23/changes/android.util.EventLog.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.util.FloatMath.html b/docs/html/sdk/api_diff/23/changes/android.util.FloatMath.html
index 894398b..d55276c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.util.FloatMath.html
+++ b/docs/html/sdk/api_diff/23/changes/android.util.FloatMath.html
@@ -157,8 +157,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.ActionMode.html b/docs/html/sdk/api_diff/23/changes/android.view.ActionMode.html
index d8112b3..d9ca5cc 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.ActionMode.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.ActionMode.html
@@ -165,8 +165,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.ContextThemeWrapper.html b/docs/html/sdk/api_diff/23/changes/android.view.ContextThemeWrapper.html
index d7481cc..33f2874 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.ContextThemeWrapper.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.ContextThemeWrapper.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.Display.html b/docs/html/sdk/api_diff/23/changes/android.view.Display.html
index b3917b5..b665292 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.Display.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.Display.html
@@ -155,8 +155,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.GestureDetector.SimpleOnGestureListener.html b/docs/html/sdk/api_diff/23/changes/android.view.GestureDetector.SimpleOnGestureListener.html
index 8810d92..4241464 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.GestureDetector.SimpleOnGestureListener.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.GestureDetector.SimpleOnGestureListener.html
@@ -109,8 +109,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.GestureDetector.html b/docs/html/sdk/api_diff/23/changes/android.view.GestureDetector.html
index f778072..ad933b0 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.GestureDetector.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.GestureDetector.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.HapticFeedbackConstants.html b/docs/html/sdk/api_diff/23/changes/android.view.HapticFeedbackConstants.html
index f9e878c..97e572c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.HapticFeedbackConstants.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.HapticFeedbackConstants.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.InputDevice.html b/docs/html/sdk/api_diff/23/changes/android.view.InputDevice.html
index ec45ec9..638b588 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.InputDevice.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.InputDevice.html
@@ -123,8 +123,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.KeyEvent.html b/docs/html/sdk/api_diff/23/changes/android.view.KeyEvent.html
index ce5e897..80a7567 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.KeyEvent.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.KeyEvent.html
@@ -157,8 +157,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.MotionEvent.html b/docs/html/sdk/api_diff/23/changes/android.view.MotionEvent.html
index 59b9393..494bd99 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.MotionEvent.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.MotionEvent.html
@@ -144,8 +144,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.ScaleGestureDetector.html b/docs/html/sdk/api_diff/23/changes/android.view.ScaleGestureDetector.html
index b5ecc30..898cf1b 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.ScaleGestureDetector.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.ScaleGestureDetector.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.Surface.html b/docs/html/sdk/api_diff/23/changes/android.view.Surface.html
index 1b77929..0483d2b 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.Surface.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.Surface.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.View.html b/docs/html/sdk/api_diff/23/changes/android.view.View.html
index 2a15daf..8edfdd4 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.View.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.View.html
@@ -340,8 +340,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.ViewConfiguration.html b/docs/html/sdk/api_diff/23/changes/android.view.ViewConfiguration.html
index 069b569..3aa4ac3 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.ViewConfiguration.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.ViewConfiguration.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.ViewGroup.html b/docs/html/sdk/api_diff/23/changes/android.view.ViewGroup.html
index 38a4519..5ddc109 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.ViewGroup.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.ViewGroup.html
@@ -190,8 +190,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.ViewParent.html b/docs/html/sdk/api_diff/23/changes/android.view.ViewParent.html
index 986b357..5f55d02b 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.ViewParent.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.ViewParent.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.Window.Callback.html b/docs/html/sdk/api_diff/23/changes/android.view.Window.Callback.html
index 397ca61..b120060 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.Window.Callback.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.Window.Callback.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.WindowManager.LayoutParams.html b/docs/html/sdk/api_diff/23/changes/android.view.WindowManager.LayoutParams.html
index 936b438..b54ae82 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.WindowManager.LayoutParams.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.WindowManager.LayoutParams.html
@@ -125,8 +125,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.accessibility.AccessibilityEvent.html b/docs/html/sdk/api_diff/23/changes/android.view.accessibility.AccessibilityEvent.html
index c107c65..f0f5381 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.accessibility.AccessibilityEvent.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.accessibility.AccessibilityEvent.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction.html b/docs/html/sdk/api_diff/23/changes/android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction.html
index f0876f3..13a4a42 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction.html
@@ -150,8 +150,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.view.accessibility.AccessibilityNodeInfo.html b/docs/html/sdk/api_diff/23/changes/android.view.accessibility.AccessibilityNodeInfo.html
index 56997e2..670b4fc 100644
--- a/docs/html/sdk/api_diff/23/changes/android.view.accessibility.AccessibilityNodeInfo.html
+++ b/docs/html/sdk/api_diff/23/changes/android.view.accessibility.AccessibilityNodeInfo.html
@@ -137,8 +137,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.webkit.PermissionRequest.html b/docs/html/sdk/api_diff/23/changes/android.webkit.PermissionRequest.html
index 4e50f62e..ea81394 100644
--- a/docs/html/sdk/api_diff/23/changes/android.webkit.PermissionRequest.html
+++ b/docs/html/sdk/api_diff/23/changes/android.webkit.PermissionRequest.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.webkit.WebSettings.html b/docs/html/sdk/api_diff/23/changes/android.webkit.WebSettings.html
index 7f8d15e..cb7b0fc 100644
--- a/docs/html/sdk/api_diff/23/changes/android.webkit.WebSettings.html
+++ b/docs/html/sdk/api_diff/23/changes/android.webkit.WebSettings.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.webkit.WebView.html b/docs/html/sdk/api_diff/23/changes/android.webkit.WebView.html
index e8da78a..7c2e7a0 100644
--- a/docs/html/sdk/api_diff/23/changes/android.webkit.WebView.html
+++ b/docs/html/sdk/api_diff/23/changes/android.webkit.WebView.html
@@ -170,8 +170,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.webkit.WebViewClient.html b/docs/html/sdk/api_diff/23/changes/android.webkit.WebViewClient.html
index 9fcd572..2029886 100644
--- a/docs/html/sdk/api_diff/23/changes/android.webkit.WebViewClient.html
+++ b/docs/html/sdk/api_diff/23/changes/android.webkit.WebViewClient.html
@@ -144,8 +144,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.ActionMenuView.html b/docs/html/sdk/api_diff/23/changes/android.widget.ActionMenuView.html
index 2cf6bbd..b74eb0b 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.ActionMenuView.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.ActionMenuView.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.AnalogClock.html b/docs/html/sdk/api_diff/23/changes/android.widget.AnalogClock.html
index 27f89f9..ce830a8 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.AnalogClock.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.AnalogClock.html
@@ -94,8 +94,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.ArrayAdapter.html b/docs/html/sdk/api_diff/23/changes/android.widget.ArrayAdapter.html
index d6ec494..d50b405 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.ArrayAdapter.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.ArrayAdapter.html
@@ -116,8 +116,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.CalendarView.html b/docs/html/sdk/api_diff/23/changes/android.widget.CalendarView.html
index a758674..03dbcb0 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.CalendarView.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.CalendarView.html
@@ -251,8 +251,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.CompoundButton.html b/docs/html/sdk/api_diff/23/changes/android.widget.CompoundButton.html
index 72b241e..7daa319 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.CompoundButton.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.CompoundButton.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.CursorAdapter.html b/docs/html/sdk/api_diff/23/changes/android.widget.CursorAdapter.html
index b89641f..99187d4 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.CursorAdapter.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.CursorAdapter.html
@@ -116,8 +116,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.FrameLayout.html b/docs/html/sdk/api_diff/23/changes/android.widget.FrameLayout.html
index b784075..87adf30 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.FrameLayout.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.FrameLayout.html
@@ -181,8 +181,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.ImageView.html b/docs/html/sdk/api_diff/23/changes/android.widget.ImageView.html
index 3337cb6..bc03aa9 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.ImageView.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.ImageView.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.ListPopupWindow.html b/docs/html/sdk/api_diff/23/changes/android.widget.ListPopupWindow.html
index 8f9b81e..def2ab5 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.ListPopupWindow.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.ListPopupWindow.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.PopupMenu.html b/docs/html/sdk/api_diff/23/changes/android.widget.PopupMenu.html
index 9f50f47..7c70493 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.PopupMenu.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.PopupMenu.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.PopupWindow.html b/docs/html/sdk/api_diff/23/changes/android.widget.PopupWindow.html
index 0a9003c..9336793 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.PopupWindow.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.PopupWindow.html
@@ -161,8 +161,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.QuickContactBadge.html b/docs/html/sdk/api_diff/23/changes/android.widget.QuickContactBadge.html
index e2d0228..0a22ffb 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.QuickContactBadge.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.QuickContactBadge.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.RelativeLayout.LayoutParams.html b/docs/html/sdk/api_diff/23/changes/android.widget.RelativeLayout.LayoutParams.html
index a3f9f45..fd0e043 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.RelativeLayout.LayoutParams.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.RelativeLayout.LayoutParams.html
@@ -108,8 +108,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.RemoteViews.html b/docs/html/sdk/api_diff/23/changes/android.widget.RemoteViews.html
index ec6c99d..510c9a8 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.RemoteViews.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.RemoteViews.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.SimpleAdapter.html b/docs/html/sdk/api_diff/23/changes/android.widget.SimpleAdapter.html
index 393dc93..8a7f9e9 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.SimpleAdapter.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.SimpleAdapter.html
@@ -116,8 +116,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.Spinner.html b/docs/html/sdk/api_diff/23/changes/android.widget.Spinner.html
index 00a97ee..cb1ca3e 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.Spinner.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.Spinner.html
@@ -123,8 +123,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.Switch.html b/docs/html/sdk/api_diff/23/changes/android.widget.Switch.html
index f034770..bdbed7c 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.Switch.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.Switch.html
@@ -157,8 +157,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.TextView.html b/docs/html/sdk/api_diff/23/changes/android.widget.TextView.html
index 015f191..67a9611 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.TextView.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.TextView.html
@@ -196,8 +196,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.TimePicker.html b/docs/html/sdk/api_diff/23/changes/android.widget.TimePicker.html
index bad99a3..82541e9 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.TimePicker.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.TimePicker.html
@@ -177,8 +177,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/android.widget.Toolbar.html b/docs/html/sdk/api_diff/23/changes/android.widget.Toolbar.html
index 22cc2e5..3cbeea6 100644
--- a/docs/html/sdk/api_diff/23/changes/android.widget.Toolbar.html
+++ b/docs/html/sdk/api_diff/23/changes/android.widget.Toolbar.html
@@ -115,8 +115,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/changes-summary.html b/docs/html/sdk/api_diff/23/changes/changes-summary.html
index 39be588..604e4d2 100644
--- a/docs/html/sdk/api_diff/23/changes/changes-summary.html
+++ b/docs/html/sdk/api_diff/23/changes/changes-summary.html
@@ -697,8 +697,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/classes_index_additions.html b/docs/html/sdk/api_diff/23/changes/classes_index_additions.html
index bdea58d..a36f690 100644
--- a/docs/html/sdk/api_diff/23/changes/classes_index_additions.html
+++ b/docs/html/sdk/api_diff/23/changes/classes_index_additions.html
@@ -404,8 +404,7 @@
 <A HREF="pkg_android.webkit.html#WebMessagePort.WebMessageCallback" class="hiddenlink" target="rightframe"><b>WebMessagePort.WebMessageCallback</b></A><br>
 <A HREF="pkg_android.webkit.html#WebResourceError" class="hiddenlink" target="rightframe"><b>WebResourceError</b></A><br>
 <A HREF="pkg_android.webkit.html#WebView.VisualStateCallback" class="hiddenlink" target="rightframe"><b>WebView.VisualStateCallback</b></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/classes_index_all.html b/docs/html/sdk/api_diff/23/changes/classes_index_all.html
index d1d50f1..f8b9958 100644
--- a/docs/html/sdk/api_diff/23/changes/classes_index_all.html
+++ b/docs/html/sdk/api_diff/23/changes/classes_index_all.html
@@ -1009,8 +1009,7 @@
 <A HREF="android.net.wifi.WifiManager.html" class="hiddenlink" target="rightframe">WifiManager</A><br>
 <A HREF="android.view.Window.Callback.html" class="hiddenlink" target="rightframe"><i>Window.Callback</i></A><br>
 <A HREF="android.view.WindowManager.LayoutParams.html" class="hiddenlink" target="rightframe">WindowManager.LayoutParams</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/classes_index_changes.html b/docs/html/sdk/api_diff/23/changes/classes_index_changes.html
index a52e320..a2cef35 100644
--- a/docs/html/sdk/api_diff/23/changes/classes_index_changes.html
+++ b/docs/html/sdk/api_diff/23/changes/classes_index_changes.html
@@ -854,8 +854,7 @@
 <A HREF="android.net.wifi.WifiManager.html" class="hiddenlink" target="rightframe">WifiManager</A><br>
 <A HREF="android.view.Window.Callback.html" class="hiddenlink" target="rightframe"><i>Window.Callback</i></A><br>
 <A HREF="android.view.WindowManager.LayoutParams.html" class="hiddenlink" target="rightframe">WindowManager.LayoutParams</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/classes_index_removals.html b/docs/html/sdk/api_diff/23/changes/classes_index_removals.html
index 7b780a6..5a939b2 100644
--- a/docs/html/sdk/api_diff/23/changes/classes_index_removals.html
+++ b/docs/html/sdk/api_diff/23/changes/classes_index_removals.html
@@ -213,8 +213,7 @@
 <p><div style="line-height:1.5em;color:black">
 <A HREF="pkg_org.apache.http.conn.scheme.html#Scheme" class="hiddenlink" target="rightframe"><strike>Scheme</strike></A><br>
 <A HREF="pkg_org.apache.http.conn.scheme.html#SchemeRegistry" class="hiddenlink" target="rightframe"><strike>SchemeRegistry</strike></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/constructors_index_additions.html b/docs/html/sdk/api_diff/23/changes/constructors_index_additions.html
index 53e7ab5..dec3a51 100644
--- a/docs/html/sdk/api_diff/23/changes/constructors_index_additions.html
+++ b/docs/html/sdk/api_diff/23/changes/constructors_index_additions.html
@@ -113,8 +113,7 @@
 <p><div style="line-height:1.5em;color:black">
 <nobr><A HREF="android.os.TransactionTooLargeException.html#android.os.TransactionTooLargeException.ctor_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>TransactionTooLargeException</b>
 (<code>String</code>)</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/constructors_index_all.html b/docs/html/sdk/api_diff/23/changes/constructors_index_all.html
index 6c7df45..de56e33 100644
--- a/docs/html/sdk/api_diff/23/changes/constructors_index_all.html
+++ b/docs/html/sdk/api_diff/23/changes/constructors_index_all.html
@@ -159,8 +159,7 @@
 <p><div style="line-height:1.5em;color:black">
 <nobr><A HREF="android.os.TransactionTooLargeException.html#android.os.TransactionTooLargeException.ctor_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>TransactionTooLargeException</b>
 (<code>String</code>)</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/constructors_index_changes.html b/docs/html/sdk/api_diff/23/changes/constructors_index_changes.html
index 409c83f..ac9eca1 100644
--- a/docs/html/sdk/api_diff/23/changes/constructors_index_changes.html
+++ b/docs/html/sdk/api_diff/23/changes/constructors_index_changes.html
@@ -55,8 +55,7 @@
 (<code>int, CharSequence, PendingIntent</code>)</A></nobr>&nbsp;constructor<br>
 <nobr><A HREF="android.app.Notification.Action.Builder.html#android.app.Notification.Action.Builder.ctor_changed(int, java.lang.CharSequence, android.app.PendingIntent)" class="hiddenlink" target="rightframe">Notification.Action.Builder
 (<code>int, CharSequence, PendingIntent</code>)</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/constructors_index_removals.html b/docs/html/sdk/api_diff/23/changes/constructors_index_removals.html
index 002ee1c..bff4a22 100644
--- a/docs/html/sdk/api_diff/23/changes/constructors_index_removals.html
+++ b/docs/html/sdk/api_diff/23/changes/constructors_index_removals.html
@@ -71,8 +71,7 @@
 <p><div style="line-height:1.5em;color:black">
 <nobr><A HREF="android.os.RecoverySystem.html#android.os.RecoverySystem.ctor_removed()" class="hiddenlink" target="rightframe"><strike>RecoverySystem</strike>
 ()</A></nobr>&nbsp;constructor<br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/fields_index_additions.html b/docs/html/sdk/api_diff/23/changes/fields_index_additions.html
index 59b8967..8ca1d60 100644
--- a/docs/html/sdk/api_diff/23/changes/fields_index_additions.html
+++ b/docs/html/sdk/api_diff/23/changes/fields_index_additions.html
@@ -1622,8 +1622,7 @@
 </nobr><br>
 <nobr><A HREF="android.graphics.ImageFormat.html#android.graphics.ImageFormat.YUV_444_888" class="hiddenlink" target="rightframe">YUV_444_888</A>
 </nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/fields_index_all.html b/docs/html/sdk/api_diff/23/changes/fields_index_all.html
index 8d2742f..6ca8cd9 100644
--- a/docs/html/sdk/api_diff/23/changes/fields_index_all.html
+++ b/docs/html/sdk/api_diff/23/changes/fields_index_all.html
@@ -1972,8 +1972,7 @@
 </nobr><br>
 <nobr><A HREF="android.graphics.ImageFormat.html#android.graphics.ImageFormat.YUV_444_888" class="hiddenlink" target="rightframe">YUV_444_888</A>
 </nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/fields_index_changes.html b/docs/html/sdk/api_diff/23/changes/fields_index_changes.html
index d1c45ba..d622434 100644
--- a/docs/html/sdk/api_diff/23/changes/fields_index_changes.html
+++ b/docs/html/sdk/api_diff/23/changes/fields_index_changes.html
@@ -532,8 +532,7 @@
 </nobr><br>
 <nobr><A HREF="android.R.attr.html#android.R.attr.yearListSelectorColor" class="hiddenlink" target="rightframe">yearListSelectorColor</A>
 </nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/fields_index_removals.html b/docs/html/sdk/api_diff/23/changes/fields_index_removals.html
index 0725278..0882d50 100644
--- a/docs/html/sdk/api_diff/23/changes/fields_index_removals.html
+++ b/docs/html/sdk/api_diff/23/changes/fields_index_removals.html
@@ -556,8 +556,7 @@
 <nobr>&nbsp;in&nbsp;
 <A HREF="android.Manifest.permission_group.html#android.Manifest.permission_group.WRITE_USER_DICTIONARY" class="hiddenlink" target="rightframe"><strike>android.Manifest.permission_group</strike></A>
 </nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/jdiff_help.html b/docs/html/sdk/api_diff/23/changes/jdiff_help.html
index acb8508..f909615 100644
--- a/docs/html/sdk/api_diff/23/changes/jdiff_help.html
+++ b/docs/html/sdk/api_diff/23/changes/jdiff_help.html
@@ -120,8 +120,7 @@
 There are some complex changes which can occur between versions, for example, when two or more methods with the same name change simultaneously, or when a method or field is moved into or from a superclass. 
 In these cases, the change will be seen as a removal and an addition, rather than as a change. Unexpected removals or additions are often part of one of these type of changes. 
 </BLOCKQUOTE>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/jdiff_statistics.html b/docs/html/sdk/api_diff/23/changes/jdiff_statistics.html
index 26531a41..28a9e71 100644
--- a/docs/html/sdk/api_diff/23/changes/jdiff_statistics.html
+++ b/docs/html/sdk/api_diff/23/changes/jdiff_statistics.html
@@ -1673,8 +1673,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/jdiff_topleftframe.html b/docs/html/sdk/api_diff/23/changes/jdiff_topleftframe.html
index 36f9836..fc5c9d4 100644
--- a/docs/html/sdk/api_diff/23/changes/jdiff_topleftframe.html
+++ b/docs/html/sdk/api_diff/23/changes/jdiff_topleftframe.html
@@ -49,8 +49,7 @@
   <TD NOWRAP><FONT CLASS="indexText" size="-2"><A HREF="fields_index_all.html" TARGET="bottomleftframe">By Field</A></FONT><br></TD>
 </TR>
 </TABLE>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/methods_index_additions.html b/docs/html/sdk/api_diff/23/changes/methods_index_additions.html
index 4cb030a..5788a46 100644
--- a/docs/html/sdk/api_diff/23/changes/methods_index_additions.html
+++ b/docs/html/sdk/api_diff/23/changes/methods_index_additions.html
@@ -1752,8 +1752,7 @@
 (<code>int, float</code>)</A></nobr><br>
 <nobr><A HREF="android.os.Parcel.html#android.os.Parcel.writeTypedObject_added(T, int)" class="hiddenlink" target="rightframe"><b>writeTypedObject</b>
 (<code>T, int</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/methods_index_all.html b/docs/html/sdk/api_diff/23/changes/methods_index_all.html
index a5e688d..4fac9c7 100644
--- a/docs/html/sdk/api_diff/23/changes/methods_index_all.html
+++ b/docs/html/sdk/api_diff/23/changes/methods_index_all.html
@@ -2190,8 +2190,7 @@
 (<code>int, float</code>)</A></nobr><br>
 <nobr><A HREF="android.os.Parcel.html#android.os.Parcel.writeTypedObject_added(T, int)" class="hiddenlink" target="rightframe"><b>writeTypedObject</b>
 (<code>T, int</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/methods_index_changes.html b/docs/html/sdk/api_diff/23/changes/methods_index_changes.html
index 6923ce2..ff0f73e 100644
--- a/docs/html/sdk/api_diff/23/changes/methods_index_changes.html
+++ b/docs/html/sdk/api_diff/23/changes/methods_index_changes.html
@@ -511,8 +511,7 @@
 &nbsp;&nbsp;<nobr><A HREF="android.graphics.drawable.ScaleDrawable.html#android.graphics.drawable.ScaleDrawable.unscheduleDrawable_changed(android.graphics.drawable.Drawable, java.lang.Runnable)" class="hiddenlink" target="rightframe">type&nbsp;
 (<code>Drawable, Runnable</code>)&nbsp;in&nbsp;android.graphics.drawable.ScaleDrawable
 </A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/methods_index_removals.html b/docs/html/sdk/api_diff/23/changes/methods_index_removals.html
index 4f81ae9..c99af38 100644
--- a/docs/html/sdk/api_diff/23/changes/methods_index_removals.html
+++ b/docs/html/sdk/api_diff/23/changes/methods_index_removals.html
@@ -336,8 +336,7 @@
 <p><div style="line-height:1.5em;color:black">
 <nobr><A HREF="android.provider.Browser.html#android.provider.Browser.updateVisitedHistory_removed(android.content.ContentResolver, java.lang.String, boolean)" class="hiddenlink" target="rightframe"><strike>updateVisitedHistory</strike>
 (<code>ContentResolver, String, boolean</code>)</A></nobr><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/packages_index_additions.html b/docs/html/sdk/api_diff/23/changes/packages_index_additions.html
index cefe356..7fc99fa 100644
--- a/docs/html/sdk/api_diff/23/changes/packages_index_additions.html
+++ b/docs/html/sdk/api_diff/23/changes/packages_index_additions.html
@@ -55,8 +55,7 @@
 <A HREF="changes-summary.html#android.media.midi" class="hiddenlink" target="rightframe"><b>android.media.midi</b></A><br>
 <A HREF="changes-summary.html#android.security.keystore" class="hiddenlink" target="rightframe"><b>android.security.keystore</b></A><br>
 <A HREF="changes-summary.html#android.service.chooser" class="hiddenlink" target="rightframe"><b>android.service.chooser</b></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/packages_index_all.html b/docs/html/sdk/api_diff/23/changes/packages_index_all.html
index 1245d79..dd2cf5d 100644
--- a/docs/html/sdk/api_diff/23/changes/packages_index_all.html
+++ b/docs/html/sdk/api_diff/23/changes/packages_index_all.html
@@ -136,8 +136,7 @@
 <A HREF="pkg_org.apache.http.params.html" class="hiddenlink" target="rightframe">org.apache.http.params</A><br>
 <A HREF="changes-summary.html#org.apache.http.protocol" class="hiddenlink" target="rightframe"><strike>org.apache.http.protocol</strike></A><br>
 <A HREF="changes-summary.html#org.apache.http.util" class="hiddenlink" target="rightframe"><strike>org.apache.http.util</strike></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/packages_index_changes.html b/docs/html/sdk/api_diff/23/changes/packages_index_changes.html
index a06866b..ec301a6 100644
--- a/docs/html/sdk/api_diff/23/changes/packages_index_changes.html
+++ b/docs/html/sdk/api_diff/23/changes/packages_index_changes.html
@@ -103,8 +103,7 @@
 <A HREF="pkg_org.apache.http.conn.html" class="hiddenlink" target="rightframe">org.apache.http.conn</A><br>
 <A HREF="pkg_org.apache.http.conn.scheme.html" class="hiddenlink" target="rightframe">org.apache.http.conn.scheme</A><br>
 <A HREF="pkg_org.apache.http.params.html" class="hiddenlink" target="rightframe">org.apache.http.params</A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/packages_index_removals.html b/docs/html/sdk/api_diff/23/changes/packages_index_removals.html
index 06f8ca7..fd7e1bd 100644
--- a/docs/html/sdk/api_diff/23/changes/packages_index_removals.html
+++ b/docs/html/sdk/api_diff/23/changes/packages_index_removals.html
@@ -78,8 +78,7 @@
 <A HREF="changes-summary.html#org.apache.http.message" class="hiddenlink" target="rightframe"><strike>org.apache.http.message</strike></A><br>
 <A HREF="changes-summary.html#org.apache.http.protocol" class="hiddenlink" target="rightframe"><strike>org.apache.http.protocol</strike></A><br>
 <A HREF="changes-summary.html#org.apache.http.util" class="hiddenlink" target="rightframe"><strike>org.apache.http.util</strike></A><br>
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.accounts.html b/docs/html/sdk/api_diff/23/changes/pkg_android.accounts.html
index f959c44..4e34f17 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.accounts.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.accounts.html
@@ -112,8 +112,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.app.admin.html b/docs/html/sdk/api_diff/23/changes/pkg_android.app.admin.html
index 5e7a3fa..62d0b1d 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.app.admin.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.app.admin.html
@@ -127,8 +127,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.app.html b/docs/html/sdk/api_diff/23/changes/pkg_android.app.html
index d6294d2..fcb19b1 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.app.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.app.html
@@ -379,8 +379,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.app.usage.html b/docs/html/sdk/api_diff/23/changes/pkg_android.app.usage.html
index d206bb0..075cc0a 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.app.usage.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.app.usage.html
@@ -141,8 +141,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.bluetooth.html b/docs/html/sdk/api_diff/23/changes/pkg_android.bluetooth.html
index 183589d..2a44372 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.bluetooth.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.bluetooth.html
@@ -119,8 +119,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.bluetooth.le.html b/docs/html/sdk/api_diff/23/changes/pkg_android.bluetooth.le.html
index 2301b5a..f606cad 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.bluetooth.le.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.bluetooth.le.html
@@ -112,8 +112,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.content.html b/docs/html/sdk/api_diff/23/changes/pkg_android.content.html
index b7104d5..d883af0 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.content.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.content.html
@@ -154,8 +154,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.content.pm.html b/docs/html/sdk/api_diff/23/changes/pkg_android.content.pm.html
index 790ca7a..612eb4e 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.content.pm.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.content.pm.html
@@ -126,8 +126,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.content.res.html b/docs/html/sdk/api_diff/23/changes/pkg_android.content.res.html
index 1caebb8..f9dea56 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.content.res.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.content.res.html
@@ -126,8 +126,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.database.html b/docs/html/sdk/api_diff/23/changes/pkg_android.database.html
index 6267710..356534f 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.database.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.database.html
@@ -119,8 +119,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.graphics.drawable.html b/docs/html/sdk/api_diff/23/changes/pkg_android.graphics.drawable.html
index dab2acb..4ba1c23 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.graphics.drawable.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.graphics.drawable.html
@@ -197,8 +197,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.graphics.html b/docs/html/sdk/api_diff/23/changes/pkg_android.graphics.html
index 165d9eb..81037e3 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.graphics.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.graphics.html
@@ -119,8 +119,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.hardware.camera2.html b/docs/html/sdk/api_diff/23/changes/pkg_android.hardware.camera2.html
index e5f179d..bc66e2e 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.hardware.camera2.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.hardware.camera2.html
@@ -183,8 +183,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.hardware.camera2.params.html b/docs/html/sdk/api_diff/23/changes/pkg_android.hardware.camera2.params.html
index 8a78e5e..fb7a8e3 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.hardware.camera2.params.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.hardware.camera2.params.html
@@ -120,8 +120,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.hardware.html b/docs/html/sdk/api_diff/23/changes/pkg_android.hardware.html
index 52fd539..8be6ae2 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.hardware.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.hardware.html
@@ -105,8 +105,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.hardware.usb.html b/docs/html/sdk/api_diff/23/changes/pkg_android.hardware.usb.html
index 2862880..2f0318f 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.hardware.usb.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.hardware.usb.html
@@ -105,8 +105,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.html b/docs/html/sdk/api_diff/23/changes/pkg_android.html
index 3ccac32..096a6f4 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.html
@@ -140,8 +140,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.media.browse.html b/docs/html/sdk/api_diff/23/changes/pkg_android.media.browse.html
index 54ab1a2..016384b 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.media.browse.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.media.browse.html
@@ -120,8 +120,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.media.html b/docs/html/sdk/api_diff/23/changes/pkg_android.media.html
index 4dfad89..5014aa3 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.media.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.media.html
@@ -435,8 +435,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.media.session.html b/docs/html/sdk/api_diff/23/changes/pkg_android.media.session.html
index cad4d34..6788832 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.media.session.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.media.session.html
@@ -119,8 +119,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.media.tv.html b/docs/html/sdk/api_diff/23/changes/pkg_android.media.tv.html
index f11fb38..f9e5705 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.media.tv.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.media.tv.html
@@ -176,8 +176,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.net.html b/docs/html/sdk/api_diff/23/changes/pkg_android.net.html
index 9ccdbe5..8f803e5 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.net.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.net.html
@@ -162,8 +162,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.net.http.html b/docs/html/sdk/api_diff/23/changes/pkg_android.net.http.html
index 0377a16..2ffbe52 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.net.http.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.net.http.html
@@ -105,8 +105,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.net.wifi.html b/docs/html/sdk/api_diff/23/changes/pkg_android.net.wifi.html
index 894e26d..97cc79a 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.net.wifi.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.net.wifi.html
@@ -133,8 +133,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.nfc.html b/docs/html/sdk/api_diff/23/changes/pkg_android.nfc.html
index cd49ac9..9914d0f 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.nfc.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.nfc.html
@@ -105,8 +105,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.os.html b/docs/html/sdk/api_diff/23/changes/pkg_android.os.html
index 8dce606..68cda00 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.os.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.os.html
@@ -239,8 +239,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.print.html b/docs/html/sdk/api_diff/23/changes/pkg_android.print.html
index cdc3ad1..0543c691 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.print.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.print.html
@@ -126,8 +126,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.printservice.html b/docs/html/sdk/api_diff/23/changes/pkg_android.printservice.html
index 4129503..bb0617f 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.printservice.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.printservice.html
@@ -105,8 +105,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.provider.html b/docs/html/sdk/api_diff/23/changes/pkg_android.provider.html
index d129a28..e1b48cc 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.provider.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.provider.html
@@ -317,8 +317,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.renderscript.html b/docs/html/sdk/api_diff/23/changes/pkg_android.renderscript.html
index 82cf241..30ab1b7 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.renderscript.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.renderscript.html
@@ -204,8 +204,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.security.html b/docs/html/sdk/api_diff/23/changes/pkg_android.security.html
index 222b20a..af4daf0 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.security.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.security.html
@@ -148,8 +148,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.service.carrier.html b/docs/html/sdk/api_diff/23/changes/pkg_android.service.carrier.html
index a2d5e6d..fb256f8 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.service.carrier.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.service.carrier.html
@@ -127,8 +127,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.service.dreams.html b/docs/html/sdk/api_diff/23/changes/pkg_android.service.dreams.html
index 32d27bd..aa6ded8 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.service.dreams.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.service.dreams.html
@@ -105,8 +105,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.service.media.html b/docs/html/sdk/api_diff/23/changes/pkg_android.service.media.html
index 8596421..aa586e1 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.service.media.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.service.media.html
@@ -120,8 +120,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.service.notification.html b/docs/html/sdk/api_diff/23/changes/pkg_android.service.notification.html
index 3fb4785..d599f80 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.service.notification.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.service.notification.html
@@ -105,8 +105,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.service.voice.html b/docs/html/sdk/api_diff/23/changes/pkg_android.service.voice.html
index 1f27d84..32fa5b4 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.service.voice.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.service.voice.html
@@ -169,8 +169,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.speech.html b/docs/html/sdk/api_diff/23/changes/pkg_android.speech.html
index a88f1ba..6b18133 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.speech.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.speech.html
@@ -112,8 +112,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.speech.tts.html b/docs/html/sdk/api_diff/23/changes/pkg_android.speech.tts.html
index 59de522..ebe7ab4 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.speech.tts.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.speech.tts.html
@@ -105,8 +105,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.system.html b/docs/html/sdk/api_diff/23/changes/pkg_android.system.html
index ef568e0..fd9765f 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.system.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.system.html
@@ -105,8 +105,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.telecom.html b/docs/html/sdk/api_diff/23/changes/pkg_android.telecom.html
index 39f0245..10f3af7 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.telecom.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.telecom.html
@@ -302,8 +302,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.telephony.html b/docs/html/sdk/api_diff/23/changes/pkg_android.telephony.html
index b4abb53..4bdcf13 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.telephony.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.telephony.html
@@ -155,8 +155,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.test.mock.html b/docs/html/sdk/api_diff/23/changes/pkg_android.test.mock.html
index b1f13ee..fae868d 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.test.mock.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.test.mock.html
@@ -119,8 +119,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.text.html b/docs/html/sdk/api_diff/23/changes/pkg_android.text.html
index c8e15ac..37443f1 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.text.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.text.html
@@ -127,8 +127,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.transition.html b/docs/html/sdk/api_diff/23/changes/pkg_android.transition.html
index 03173a1..d15a1bb 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.transition.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.transition.html
@@ -127,8 +127,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.util.html b/docs/html/sdk/api_diff/23/changes/pkg_android.util.html
index 8156cfb..23e26da 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.util.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.util.html
@@ -141,8 +141,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.view.accessibility.html b/docs/html/sdk/api_diff/23/changes/pkg_android.view.accessibility.html
index ae13a87..9f919e3 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.view.accessibility.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.view.accessibility.html
@@ -119,8 +119,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.view.html b/docs/html/sdk/api_diff/23/changes/pkg_android.view.html
index ec3257a..07378a2 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.view.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.view.html
@@ -274,8 +274,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.webkit.html b/docs/html/sdk/api_diff/23/changes/pkg_android.webkit.html
index 80b4df0..331bd20 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.webkit.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.webkit.html
@@ -169,8 +169,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_android.widget.html b/docs/html/sdk/api_diff/23/changes/pkg_android.widget.html
index fb7ef96..0864272 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_android.widget.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_android.widget.html
@@ -253,8 +253,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_org.apache.http.conn.html b/docs/html/sdk/api_diff/23/changes/pkg_org.apache.http.conn.html
index 249df56..268c66f 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_org.apache.http.conn.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_org.apache.http.conn.html
@@ -203,8 +203,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_org.apache.http.conn.scheme.html b/docs/html/sdk/api_diff/23/changes/pkg_org.apache.http.conn.scheme.html
index fe7b3c7..870afbe 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_org.apache.http.conn.scheme.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_org.apache.http.conn.scheme.html
@@ -119,8 +119,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/sdk/api_diff/23/changes/pkg_org.apache.http.params.html b/docs/html/sdk/api_diff/23/changes/pkg_org.apache.http.params.html
index 28f3469..792596c 100644
--- a/docs/html/sdk/api_diff/23/changes/pkg_org.apache.http.params.html
+++ b/docs/html/sdk/api_diff/23/changes/pkg_org.apache.http.params.html
@@ -154,8 +154,7 @@
     </div> <!-- end footer -->
     </div><!-- end doc-content -->
     </div> <!-- end body-content --> 
-<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
-</script>
+<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script>
 <script type="text/javascript">
   try {
     var pageTracker = _gat._getTracker("UA-5831155-1");
diff --git a/docs/html/training/basics/data-storage/databases.jd b/docs/html/training/basics/data-storage/databases.jd
index f42bf65..0cd0ce1 100644
--- a/docs/html/training/basics/data-storage/databases.jd
+++ b/docs/html/training/basics/data-storage/databases.jd
@@ -75,16 +75,14 @@
 <pre>
 public final class FeedReaderContract {
     // To prevent someone from accidentally instantiating the contract class,
-    // give it an empty constructor.
-    public FeedReaderContract() {}
+    // make the constructor private.
+    private FeedReaderContract() {}
 
     /* Inner class that defines the table contents */
-    public static abstract class FeedEntry implements BaseColumns {
+    public static class FeedEntry implements BaseColumns {
         public static final String TABLE_NAME = &quot;entry&quot;;
-        public static final String COLUMN_NAME_ENTRY_ID = &quot;entryid&quot;;
         public static final String COLUMN_NAME_TITLE = &quot;title&quot;;
         public static final String COLUMN_NAME_SUBTITLE = &quot;subtitle&quot;;
-        ...
     }
 }
 </pre>
@@ -103,10 +101,8 @@
 private static final String SQL_CREATE_ENTRIES =
     &quot;CREATE TABLE &quot; + FeedEntry.TABLE_NAME + &quot; (&quot; +
     FeedEntry._ID + &quot; INTEGER PRIMARY KEY,&quot; +
-    FeedEntry.COLUMN_NAME_ENTRY_ID + TEXT_TYPE + COMMA_SEP +
     FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +
-    ... // Any other options for the CREATE command
-    &quot; )&quot;;
+    FeedEntry.COLUMN_NAME_SUBTITLE + TEXT_TYPE + &quot; )&quot;;
 
 private static final String SQL_DELETE_ENTRIES =
     &quot;DROP TABLE IF EXISTS &quot; + FeedEntry.TABLE_NAME;
@@ -189,23 +185,22 @@
 
 // Create a new map of values, where column names are the keys
 ContentValues values = new ContentValues();
-values.put(FeedEntry.COLUMN_NAME_ENTRY_ID, id);
 values.put(FeedEntry.COLUMN_NAME_TITLE, title);
-values.put(FeedEntry.COLUMN_NAME_CONTENT, content);
+values.put(FeedEntry.COLUMN_NAME_SUBTITLE, subtitle);
 
 // Insert the new row, returning the primary key value of the new row
-long newRowId;
-newRowId = db.insert(
-         FeedEntry.TABLE_NAME,
-         FeedEntry.COLUMN_NAME_NULLABLE,
-         values);
+long newRowId = db.insert(FeedEntry.TABLE_NAME, null, values);
 </pre>
 
 <p>The first argument for {@link android.database.sqlite.SQLiteDatabase#insert insert()}
-is simply the table name. The second argument provides
-the name of a column in which the framework can insert NULL in the event that the
-{@link android.content.ContentValues} is empty (if you instead set this to {@code "null"},
-then the framework will not insert a row when there are no values).</p>
+is simply the table name. </p>
+
+<p>The second argument tells the framework what to do in the event that the
+{@link android.content.ContentValues} is empty (i.e., you did not
+{@link android.content.ContentValues#put put} any values).
+If you specify the name of a column, the framework inserts a row and sets
+the value of that column to null. If you specify <code>null</code>, like in this
+code sample, the framework does not insert a row when there are no values.</p>
 
 
 
@@ -227,16 +222,19 @@
 String[] projection = {
     FeedEntry._ID,
     FeedEntry.COLUMN_NAME_TITLE,
-    FeedEntry.COLUMN_NAME_UPDATED,
-    ...
+    FeedEntry.COLUMN_NAME_SUBTITLE
     };
 
+// Filter results WHERE "title" = 'My Title'
+String selection = FeedEntry.COLUMN_NAME_TITLE + &quot; = ?&quot;;
+String[] selectionArgs = { &quot;My Title&quot; };
+
 // How you want the results sorted in the resulting Cursor
 String sortOrder =
-    FeedEntry.COLUMN_NAME_UPDATED + " DESC";
+    FeedEntry.COLUMN_NAME_SUBTITLE + " DESC";
 
 Cursor c = db.query(
-    FeedEntry.TABLE_NAME,  // The table to query
+    FeedEntry.TABLE_NAME,                     // The table to query
     projection,                               // The columns to return
     selection,                                // The columns for the WHERE clause
     selectionArgs,                            // The values for the WHERE clause
@@ -280,11 +278,11 @@
 
 <pre>
 // Define 'where' part of query.
-String selection = FeedEntry.COLUMN_NAME_ENTRY_ID + &quot; LIKE ?&quot;;
+String selection = FeedEntry.COLUMN_NAME_TITLE + &quot; LIKE ?&quot;;
 // Specify arguments in placeholder order.
-String[] selectionArgs = { String.valueOf(rowId) };
+String[] selectionArgs = { &quot;MyTitle&quot; };
 // Issue SQL statement.
-db.delete(table_name, selection, selectionArgs);
+db.delete(FeedEntry.TABLE_NAME, selection, selectionArgs);
 </pre>
 
 
@@ -305,9 +303,9 @@
 ContentValues values = new ContentValues();
 values.put(FeedEntry.COLUMN_NAME_TITLE, title);
 
-// Which row to update, based on the ID
-String selection = FeedEntry.COLUMN_NAME_ENTRY_ID + &quot; LIKE ?&quot;;
-String[] selectionArgs = { String.valueOf(rowId) };
+// Which row to update, based on the title
+String selection = FeedEntry.COLUMN_NAME_TITLE + &quot; LIKE ?&quot;;
+String[] selectionArgs = { &quot;MyTitle&quot; };
 
 int count = db.update(
     FeedReaderDbHelper.FeedEntry.TABLE_NAME,
diff --git a/docs/html/training/testing/unit-testing/instrumented-unit-tests.jd b/docs/html/training/testing/unit-testing/instrumented-unit-tests.jd
index 00622ee..8fc4dca 100644
--- a/docs/html/training/testing/unit-testing/instrumented-unit-tests.jd
+++ b/docs/html/training/testing/unit-testing/instrumented-unit-tests.jd
@@ -95,6 +95,19 @@
 }
 </pre>
 
+<div class="caution">
+<p><strong>Caution:</strong> If your build configuration includes a
+<code>compile</code> dependency for the <code>support-annotations</code>
+library <b>and</b> an <code>androidTestCompile</code> dependency for the
+<code>espresso-core</code> library, your build might fail due to a dependency
+conflict. To resolve, update your dependency for <code>espresso-core</code>
+as follows:</p>
+<pre>
+androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
+    exclude group: 'com.android.support', module: 'support-annotations'
+})
+</pre>
+</div>
 
 <p>
   To use JUnit 4 test classes, make sure to specify <a href=
diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java
index 5c54324..c386108 100644
--- a/graphics/java/android/graphics/SurfaceTexture.java
+++ b/graphics/java/android/graphics/SurfaceTexture.java
@@ -77,6 +77,8 @@
     private long mProducer;
     private long mFrameAvailableListener;
 
+    private boolean mIsSingleBuffered;
+
     /**
      * Callback interface for being notified that a new stream frame is available.
      */
@@ -130,6 +132,7 @@
      */
     public SurfaceTexture(int texName, boolean singleBufferMode) {
         mCreatorLooper = Looper.myLooper();
+        mIsSingleBuffered = singleBufferMode;
         nativeInit(false, texName, singleBufferMode, new WeakReference<SurfaceTexture>(this));
     }
 
@@ -157,6 +160,7 @@
      */
     public SurfaceTexture(boolean singleBufferMode) {
         mCreatorLooper = Looper.myLooper();
+        mIsSingleBuffered = singleBufferMode;
         nativeInit(true, 0, singleBufferMode, new WeakReference<SurfaceTexture>(this));
     }
 
@@ -378,6 +382,14 @@
         }
     }
 
+    /**
+     * Returns true if the SurfaceTexture is single-buffered
+     * @hide
+     */
+    public boolean isSingleBuffered() {
+        return mIsSingleBuffered;
+    }
+
     private native void nativeInit(boolean isDetached, int texName,
             boolean singleBufferMode, WeakReference<SurfaceTexture> weakSelf)
             throws Surface.OutOfResourcesException;
diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
index c836204..0f305f3 100644
--- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
@@ -144,6 +144,55 @@
  *         android:valueType=&quot;pathType&quot;/&gt;
  * &lt;/set&gt;
  * </pre></li>
+ * <p>
+ * Since AAPT tool is now supporting a new format which can bundle several related XML files into
+ * one, we can merge the previous example into one XML file, like this:
+ * </p>
+ * <pre>
+ * &lt;animated-vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; &gt;
+ *     &lt;aapt:attr name="android:drawable"&gt;
+ *         &lt;vector
+ *             android:height=&quot;64dp&quot;
+ *             android:width=&quot;64dp&quot;
+ *             android:viewportHeight=&quot;600&quot;
+ *             android:viewportWidth=&quot;600&quot; &gt;
+ *             &lt;group
+ *                 android:name=&quot;rotationGroup&quot;
+ *                 android:pivotX=&quot;300.0&quot;
+ *                 android:pivotY=&quot;300.0&quot;
+ *                 android:rotation=&quot;45.0&quot; &gt;
+ *                 &lt;path
+ *                     android:name=&quot;v&quot;
+ *                     android:fillColor=&quot;#000000&quot;
+ *                     android:pathData=&quot;M300,70 l 0,-70 70,70 0,0 -70,70z&quot; /&gt;
+ *             &lt;/group&gt;
+ *         &lt;/vector&gt;
+ *     &lt;/aapt:attr&gt;
+ *
+ *     &lt;target android:name=&quot;rotationGroup&quot;&gt; *
+ *         &lt;aapt:attr name="android:animation"&gt;
+ *             &lt;objectAnimator
+ *             android:duration=&quot;6000&quot;
+ *             android:propertyName=&quot;rotation&quot;
+ *             android:valueFrom=&quot;0&quot;
+ *             android:valueTo=&quot;360&quot; /&gt;
+ *         &lt;/aapt:attr&gt;
+ *     &lt;/target&gt;
+ *
+ *     &lt;target android:name=&quot;v&quot; &gt;
+ *         &lt;aapt:attr name="android:animation"&gt;
+ *             &lt;set&gt;
+ *                 &lt;objectAnimator
+ *                     android:duration=&quot;3000&quot;
+ *                     android:propertyName=&quot;pathData&quot;
+ *                     android:valueFrom=&quot;M300,70 l 0,-70 70,70 0,0   -70,70z&quot;
+ *                     android:valueTo=&quot;M300,70 l 0,-70 70,0  0,140 -70,0 z&quot;
+ *                     android:valueType=&quot;pathType&quot;/&gt;
+ *             &lt;/set&gt;
+ *         &lt;/aapt:attr&gt;
+ *      &lt;/target&gt;
+ * &lt;/animated-vector&gt;
+ * </pre>
  *
  * @attr ref android.R.styleable#AnimatedVectorDrawable_drawable
  * @attr ref android.R.styleable#AnimatedVectorDrawableTarget_name
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index 7f3a437..3aca867 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -1422,9 +1422,10 @@
     /**
      * Obtains styled attributes from the theme, if available, or unstyled
      * resources if the theme is null.
+     * @hide
      */
-    static @NonNull TypedArray obtainAttributes(@NonNull Resources res, @Nullable Theme theme,
-            @NonNull AttributeSet set, @NonNull int[] attrs) {
+    protected static @NonNull TypedArray obtainAttributes(@NonNull Resources res,
+            @Nullable Theme theme, @NonNull AttributeSet set, @NonNull int[] attrs) {
         if (theme == null) {
             return res.obtainAttributes(set, attrs);
         }
diff --git a/graphics/java/android/graphics/drawable/DrawableContainer.java b/graphics/java/android/graphics/drawable/DrawableContainer.java
index cc7f5c7..c7a3c75 100644
--- a/graphics/java/android/graphics/drawable/DrawableContainer.java
+++ b/graphics/java/android/graphics/drawable/DrawableContainer.java
@@ -27,8 +27,8 @@
 import android.graphics.Insets;
 import android.graphics.Outline;
 import android.graphics.PixelFormat;
-import android.graphics.Rect;
 import android.graphics.PorterDuff.Mode;
+import android.graphics.Rect;
 import android.os.SystemClock;
 import android.util.DisplayMetrics;
 import android.util.LayoutDirection;
@@ -601,8 +601,9 @@
      * during inflation.
      *
      * @param res the resources used to inflate density-dependent values
+     * @hide
      */
-    final void updateDensity(Resources res) {
+    protected final void updateDensity(Resources res) {
         mDrawableContainerState.updateDensity(res);
     }
 
@@ -711,7 +712,10 @@
         boolean mHasTintList;
         boolean mHasTintMode;
 
-        DrawableContainerState(DrawableContainerState orig, DrawableContainer owner,
+        /**
+         * @hide
+         */
+        protected DrawableContainerState(DrawableContainerState orig, DrawableContainer owner,
                 Resources res) {
             mOwner = owner;
             mSourceRes = res != null ? res : (orig != null ? orig.mSourceRes : null);
diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java
index 3dbd2a9..8c633b0 100644
--- a/graphics/java/android/graphics/drawable/GradientDrawable.java
+++ b/graphics/java/android/graphics/drawable/GradientDrawable.java
@@ -475,16 +475,17 @@
     }
 
     /**
-     * Sets the center location in pixels of the gradient. The radius is
-     * honored only when the gradient type is set to {@link #RADIAL_GRADIENT}
-     * or {@link #SWEEP_GRADIENT}.
+     * Sets the position of the center of the gradient as a fraction of the
+     * width and height.
+     * <p>
+     * The default value is (0.5, 0.5).
      * <p>
      * <strong>Note</strong>: changing this property will affect all instances
      * of a drawable loaded from a resource. It is recommended to invoke
      * {@link #mutate()} before changing this property.
      *
-     * @param x the x coordinate of the gradient's center in pixels
-     * @param y the y coordinate of the gradient's center in pixels
+     * @param x the X-position of the center of the gradient
+     * @param y the Y-position of the center of the gradient
      *
      * @see #mutate()
      * @see #setGradientType(int)
@@ -498,9 +499,10 @@
     }
 
     /**
-     * Returns the center X location of this gradient in pixels.
+     * Returns the X-position of the center of the gradient as a fraction of
+     * the width.
      *
-     * @return the center X location of this gradient in pixels
+     * @return the X-position of the center of the gradient
      * @see #setGradientCenter(float, float)
      */
     public float getGradientCenterX() {
@@ -508,9 +510,10 @@
     }
 
     /**
-     * Returns the center Y location of this gradient in pixels.
+     * Returns the Y-position of the center of this gradient as a fraction of
+     * the height.
      *
-     * @return the center Y location of this gradient in pixels
+     * @return the Y-position of the center of the gradient
      * @see #setGradientCenter(float, float)
      */
     public float getGradientCenterY() {
@@ -554,19 +557,43 @@
     }
 
     /**
-     * Sets whether or not this drawable will honor its {@code level} property.
+     * Sets whether this drawable's {@code level} property will be used to
+     * scale the gradient. If a gradient is not used, this property has no
+     * effect.
      * <p>
-     * <strong>Note</strong>: changing this property will affect all instances
+     * Scaling behavior varies based on gradient type:
+     * <ul>
+     *     <li>{@link #LINEAR_GRADIENT} adjusts the ending position along the
+     *         gradient's axis of orientation (see {@link #getOrientation()})
+     *     <li>{@link #RADIAL_GRADIENT} adjusts the outer radius
+     *     <li>{@link #SWEEP_GRADIENT} adjusts the ending angle
+     * <ul>
+     * <p>
+     * The default value for this property is {@code false}.
+     * <p>
+     * <strong>Note</strong>: This property corresponds to the
+     * {@code android:useLevel} attribute on the inner {@code &lt;gradient&gt;}
+     * tag, NOT the {@code android:useLevel} attribute on the outer
+     * {@code &lt;shape&gt;} tag. For example,
+     * <pre>{@code
+     * <shape ...>
+     *     <gradient
+     *         ...
+     *         android:useLevel="true" />
+     * </shape>
+     * }</pre><p>
+     * <strong>Note</strong>: Changing this property will affect all instances
      * of a drawable loaded from a resource. It is recommended to invoke
      * {@link #mutate()} before changing this property.
      *
-     * @param useLevel {@code true} if this drawable should honor its level,
-     *                 {@code false} otherwise
+     * @param useLevel {@code true} if the gradient should be scaled based on
+     *                 level, {@code false} otherwise
      *
      * @see #mutate()
      * @see #setLevel(int)
      * @see #getLevel()
      * @see #getUseLevel()
+     * @attr ref android.R.styleable#GradientDrawableGradient_useLevel
      */
     public void setUseLevel(boolean useLevel) {
         mGradientState.mUseLevel = useLevel;
@@ -575,12 +602,13 @@
     }
 
     /**
-     * Returns whether or not this drawable will honor its {@code level}
-     * property.
+     * Returns whether this drawable's {@code level} property will be used to
+     * scale the gradient.
      *
-     * @return {@code true} if this drawable should honor its level,
+     * @return {@code true} if the gradient should be scaled based on level,
      *         {@code false} otherwise
      * @see #setUseLevel(boolean)
+     * @attr ref android.R.styleable#GradientDrawableGradient_useLevel
      */
     public boolean getUseLevel() {
         return mGradientState.mUseLevel;
diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java
index 1864206..c30c4c2 100644
--- a/graphics/java/android/graphics/drawable/LayerDrawable.java
+++ b/graphics/java/android/graphics/drawable/LayerDrawable.java
@@ -269,7 +269,8 @@
 
             // If the layer doesn't have a drawable or unresolved theme
             // attribute for a drawable, attempt to parse one from the child
-            // element.
+            // element. If multiple child elements exist, we'll only use the
+            // first one.
             if (layer.mDrawable == null && (layer.mThemeAttrs == null ||
                     layer.mThemeAttrs[R.styleable.LayerDrawableItem_drawable] == 0)) {
                 while ((type = parser.next()) == XmlPullParser.TEXT) {
@@ -279,13 +280,12 @@
                             + ": <item> tag requires a 'drawable' attribute or "
                             + "child tag defining a drawable");
                 }
-                layer.mDrawable = Drawable.createFromXmlInner(r, parser, attrs, theme);
-            }
 
-            if (layer.mDrawable != null) {
+                // We found a child drawable. Take ownership.
+                layer.mDrawable = Drawable.createFromXmlInner(r, parser, attrs, theme);
+                layer.mDrawable.setCallback(this);
                 state.mChildrenChangingConfigurations |=
                         layer.mDrawable.getChangingConfigurations();
-                layer.mDrawable.setCallback(this);
             }
 
             addLayer(layer);
@@ -387,7 +387,19 @@
 
         final Drawable dr = a.getDrawable(R.styleable.LayerDrawableItem_drawable);
         if (dr != null) {
+            if (layer.mDrawable != null) {
+                // It's possible that a drawable was already set, in which case
+                // we should clear the callback. We may have also integrated the
+                // drawable's changing configurations, but we don't have enough
+                // information to revert that change.
+                layer.mDrawable.setCallback(null);
+            }
+
+            // Take ownership of the new drawable.
             layer.mDrawable = dr;
+            layer.mDrawable.setCallback(this);
+            state.mChildrenChangingConfigurations |=
+                    layer.mDrawable.getChangingConfigurations();
         }
     }
 
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index dc1d18f..9ff6965 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -27,9 +27,9 @@
 import android.graphics.ColorFilter;
 import android.graphics.Insets;
 import android.graphics.PixelFormat;
+import android.graphics.PorterDuff.Mode;
 import android.graphics.PorterDuffColorFilter;
 import android.graphics.Rect;
-import android.graphics.PorterDuff.Mode;
 import android.graphics.Shader;
 import android.util.ArrayMap;
 import android.util.AttributeSet;
@@ -140,12 +140,16 @@
  * in the SVG's path data. This is defined in the viewport space.</dd>
  * <dt><code>android:fillColor</code></dt>
  * <dd>Specifies the color used to fill the path. May be a color or, for SDK 24+, a color state list
- * or a gradient color. If this property is animated, any value set by the animation will
- * override the original value. No path fill is drawn if this property is not specified.</dd>
+ * or a gradient color (See {@link android.R.styleable#GradientColor}
+ * and {@link android.R.styleable#GradientColorItem}).
+ * If this property is animated, any value set by the animation will override the original value.
+ * No path fill is drawn if this property is not specified.</dd>
  * <dt><code>android:strokeColor</code></dt>
  * <dd>Specifies the color used to draw the path outline. May be a color or, for SDK 24+, a color
- * state list or a gradient color. If this property is animated, any value set by the animation will
- * override the original value. No path outline is drawn if this property is not specified.</dd>
+ * state list or a gradient color (See {@link android.R.styleable#GradientColor}
+ * and {@link android.R.styleable#GradientColorItem}).
+ * If this property is animated, any value set by the animation will override the original value.
+ * No path outline is drawn if this property is not specified.</dd>
  * <dt><code>android:strokeWidth</code></dt>
  * <dd>The width a path stroke.</dd>
  * <dt><code>android:strokeAlpha</code></dt>
@@ -166,8 +170,9 @@
  * <dt><code>android:strokeMiterLimit</code></dt>
  * <dd>Sets the Miter limit for a stroked path.</dd>
  * <dt><code>android:fillType</code></dt>
- * <dd>Sets the fillType for a path. It is the same as SVG's "fill-rule" properties.
- * For more details, see https://www.w3.org/TR/SVG/painting.html#FillRuleProperty</dd>
+ * <dd>Sets the fillType for a path. The types can be either "evenOdd" or "nonZero". They behave the
+ * same as SVG's "fill-rule" properties. For more details, see
+ * <a href="https://www.w3.org/TR/SVG/painting.html#FillRuleProperty">FillRuleProperty</a></dd>
  * </dl></dd>
  * </dl>
  *
@@ -201,7 +206,26 @@
  *             android:pathData=&quot;M300,70 l 0,-70 70,70 0,0 -70,70z&quot; /&gt;
  *     &lt;/group&gt;
  * &lt;/vector&gt;
- * </pre></li>
+ * </pre>
+ * </li>
+ * <li>And here is an example of linear gradient color, which is supported in SDK 24+.
+ * See more details in {@link android.R.styleable#GradientColor} and
+ * {@link android.R.styleable#GradientColorItem}.
+ * <pre>
+ * &lt;gradient xmlns:android="http://schemas.android.com/apk/res/android"
+ *     android:angle="90"
+ *     android:startColor="?android:attr/colorPrimary"
+ *     android:endColor="?android:attr/colorControlActivated"
+ *     android:centerColor="#f00"
+ *     android:startX="0"
+ *     android:startY="0"
+ *     android:endX="100"
+ *     android:endY="100"
+ *     android:type="linear"&gt;
+ * &lt;/gradient&gt;
+ * </pre>
+ * </li>
+ *
  */
 
 public class VectorDrawable extends Drawable {
diff --git a/graphics/java/android/graphics/pdf/PdfEditor.java b/graphics/java/android/graphics/pdf/PdfEditor.java
index 2b70b6a..cd1f8de 100644
--- a/graphics/java/android/graphics/pdf/PdfEditor.java
+++ b/graphics/java/android/graphics/pdf/PdfEditor.java
@@ -79,8 +79,12 @@
         }
 
         mInput = input;
-        mNativeDocument = nativeOpen(mInput.getFd(), size);
-        mPageCount = nativeGetPageCount(mNativeDocument);
+
+        synchronized (PdfRenderer.sPdfiumLock) {
+            mNativeDocument = nativeOpen(mInput.getFd(), size);
+            mPageCount = nativeGetPageCount(mNativeDocument);
+        }
+
         mCloseGuard.open("close");
     }
 
@@ -102,7 +106,10 @@
     public void removePage(int pageIndex) {
         throwIfClosed();
         throwIfPageNotInDocument(pageIndex);
-        mPageCount = nativeRemovePage(mNativeDocument, pageIndex);
+
+        synchronized (PdfRenderer.sPdfiumLock) {
+            mPageCount = nativeRemovePage(mNativeDocument, pageIndex);
+        }
     }
 
     /**
@@ -125,11 +132,16 @@
         if (clip == null) {
             Point size = new Point();
             getPageSize(pageIndex, size);
-            nativeSetTransformAndClip(mNativeDocument, pageIndex, transform.native_instance,
-                    0, 0, size.x, size.y);
+
+            synchronized (PdfRenderer.sPdfiumLock) {
+                nativeSetTransformAndClip(mNativeDocument, pageIndex, transform.native_instance,
+                        0, 0, size.x, size.y);
+            }
         } else {
-            nativeSetTransformAndClip(mNativeDocument, pageIndex, transform.native_instance,
-                    clip.left, clip.top, clip.right, clip.bottom);
+            synchronized (PdfRenderer.sPdfiumLock) {
+                nativeSetTransformAndClip(mNativeDocument, pageIndex, transform.native_instance,
+                        clip.left, clip.top, clip.right, clip.bottom);
+            }
         }
     }
 
@@ -143,7 +155,10 @@
         throwIfClosed();
         throwIfOutSizeNull(outSize);
         throwIfPageNotInDocument(pageIndex);
-        nativeGetPageSize(mNativeDocument, pageIndex, outSize);
+
+        synchronized (PdfRenderer.sPdfiumLock) {
+            nativeGetPageSize(mNativeDocument, pageIndex, outSize);
+        }
     }
 
     /**
@@ -156,7 +171,10 @@
         throwIfClosed();
         throwIfOutMediaBoxNull(outMediaBox);
         throwIfPageNotInDocument(pageIndex);
-        return nativeGetPageMediaBox(mNativeDocument, pageIndex, outMediaBox);
+
+        synchronized (PdfRenderer.sPdfiumLock) {
+            return nativeGetPageMediaBox(mNativeDocument, pageIndex, outMediaBox);
+        }
     }
 
     /**
@@ -169,7 +187,10 @@
         throwIfClosed();
         throwIfMediaBoxNull(mediaBox);
         throwIfPageNotInDocument(pageIndex);
-        nativeSetPageMediaBox(mNativeDocument, pageIndex, mediaBox);
+
+        synchronized (PdfRenderer.sPdfiumLock) {
+            nativeSetPageMediaBox(mNativeDocument, pageIndex, mediaBox);
+        }
     }
 
     /**
@@ -182,7 +203,10 @@
         throwIfClosed();
         throwIfOutCropBoxNull(outCropBox);
         throwIfPageNotInDocument(pageIndex);
-        return nativeGetPageCropBox(mNativeDocument, pageIndex, outCropBox);
+
+        synchronized (PdfRenderer.sPdfiumLock) {
+            return nativeGetPageCropBox(mNativeDocument, pageIndex, outCropBox);
+        }
     }
 
     /**
@@ -195,7 +219,10 @@
         throwIfClosed();
         throwIfCropBoxNull(cropBox);
         throwIfPageNotInDocument(pageIndex);
-        nativeSetPageCropBox(mNativeDocument, pageIndex, cropBox);
+
+        synchronized (PdfRenderer.sPdfiumLock) {
+            nativeSetPageCropBox(mNativeDocument, pageIndex, cropBox);
+        }
     }
 
     /**
@@ -205,7 +232,10 @@
      */
     public boolean shouldScaleForPrinting() {
         throwIfClosed();
-        return nativeScaleForPrinting(mNativeDocument);
+
+        synchronized (PdfRenderer.sPdfiumLock) {
+            return nativeScaleForPrinting(mNativeDocument);
+        }
     }
 
     /**
@@ -219,7 +249,10 @@
     public void write(ParcelFileDescriptor output) throws IOException {
         try {
             throwIfClosed();
-            nativeWrite(mNativeDocument, output.getFd());
+
+            synchronized (PdfRenderer.sPdfiumLock) {
+                nativeWrite(mNativeDocument, output.getFd());
+            }
         } finally {
             IoUtils.closeQuietly(output);
         }
@@ -247,7 +280,9 @@
     }
 
     private void doClose() {
-        nativeClose(mNativeDocument);
+        synchronized (PdfRenderer.sPdfiumLock) {
+            nativeClose(mNativeDocument);
+        }
         IoUtils.closeQuietly(mInput);
         mInput = null;
         mCloseGuard.close();
diff --git a/graphics/java/android/graphics/pdf/PdfRenderer.java b/graphics/java/android/graphics/pdf/PdfRenderer.java
index 520ebe5..cfc1309 100644
--- a/graphics/java/android/graphics/pdf/PdfRenderer.java
+++ b/graphics/java/android/graphics/pdf/PdfRenderer.java
@@ -99,6 +99,12 @@
  * @see #close()
  */
 public final class PdfRenderer implements AutoCloseable {
+    /**
+     * Any call the native pdfium code has to be single threaded as the library does not support
+     * parallel use.
+     */
+    final static Object sPdfiumLock = new Object();
+
     private final CloseGuard mCloseGuard = CloseGuard.get();
 
     private final Point mTempPoint = new Point();
@@ -154,8 +160,12 @@
         }
 
         mInput = input;
-        mNativeDocument = nativeCreate(mInput.getFd(), size);
-        mPageCount = nativeGetPageCount(mNativeDocument);
+
+        synchronized (sPdfiumLock) {
+            mNativeDocument = nativeCreate(mInput.getFd(), size);
+            mPageCount = nativeGetPageCount(mNativeDocument);
+        }
+
         mCloseGuard.open("close");
     }
 
@@ -189,7 +199,10 @@
      */
     public boolean shouldScaleForPrinting() {
         throwIfClosed();
-        return nativeScaleForPrinting(mNativeDocument);
+
+        synchronized (sPdfiumLock) {
+            return nativeScaleForPrinting(mNativeDocument);
+        }
     }
 
     /**
@@ -224,7 +237,9 @@
         if (mCurrentPage != null) {
             mCurrentPage.close();
         }
-        nativeClose(mNativeDocument);
+        synchronized (sPdfiumLock) {
+            nativeClose(mNativeDocument);
+        }
         try {
             mInput.close();
         } catch (IOException ioe) {
@@ -277,7 +292,9 @@
 
         private Page(int index) {
             Point size = mTempPoint;
-            mNativePage = nativeOpenPageAndGetSize(mNativeDocument, index, size);
+            synchronized (sPdfiumLock) {
+                mNativePage = nativeOpenPageAndGetSize(mNativeDocument, index, size);
+            }
             mIndex = index;
             mWidth = size.x;
             mHeight = size.y;
@@ -384,8 +401,10 @@
 
             final long transformPtr = (transform != null) ? transform.native_instance : 0;
 
-            nativeRenderPage(mNativeDocument, mNativePage, destination, contentLeft,
-                    contentTop, contentRight, contentBottom, transformPtr, renderMode);
+            synchronized (sPdfiumLock) {
+                nativeRenderPage(mNativeDocument, mNativePage, destination, contentLeft,
+                        contentTop, contentRight, contentBottom, transformPtr, renderMode);
+            }
         }
 
         /**
@@ -412,7 +431,9 @@
         }
 
         private void doClose() {
-            nativeClosePage(mNativePage);
+            synchronized (sPdfiumLock) {
+                nativeClosePage(mNativePage);
+            }
             mNativePage = 0;
             mCloseGuard.close();
             mCurrentPage = null;
diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java
index cce58c2..a96ca39 100644
--- a/keystore/java/android/security/KeyChain.java
+++ b/keystore/java/android/security/KeyChain.java
@@ -20,6 +20,7 @@
 import android.annotation.WorkerThread;
 import android.app.Activity;
 import android.app.PendingIntent;
+import android.app.Service;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -356,6 +357,9 @@
      *
      * <p> This method may block while waiting for a connection to another process, and must never
      * be called from the main thread.
+     * <p> As {@link Activity} and {@link Service} contexts are short-lived and can be destroyed
+     * at any time from the main thread, it is safer to rely on a long-lived context such as one
+     * returned from {@link Context#getApplicationContext()}.
      *
      * @param alias The alias of the desired private key, typically returned via
      *              {@link KeyChainAliasCallback#alias}.
@@ -368,7 +372,7 @@
         if (alias == null) {
             throw new NullPointerException("alias == null");
         }
-        KeyChainConnection keyChainConnection = bind(context);
+        KeyChainConnection keyChainConnection = bind(context.getApplicationContext());
         try {
             final IKeyChainService keyChainService = keyChainConnection.getService();
             final String keyId = keyChainService.requestPrivateKey(alias);
@@ -400,6 +404,9 @@
      *
      * <p> This method may block while waiting for a connection to another process, and must never
      * be called from the main thread.
+     * <p> As {@link Activity} and {@link Service} contexts are short-lived and can be destroyed
+     * at any time from the main thread, it is safer to rely on a long-lived context such as one
+     * returned from {@link Context#getApplicationContext()}.
      *
      * @param alias The alias of the desired certificate chain, typically
      * returned via {@link KeyChainAliasCallback#alias}.
@@ -412,7 +419,7 @@
         if (alias == null) {
             throw new NullPointerException("alias == null");
         }
-        KeyChainConnection keyChainConnection = bind(context);
+        KeyChainConnection keyChainConnection = bind(context.getApplicationContext());
         try {
             IKeyChainService keyChainService = keyChainConnection.getService();
 
diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java
index 4848630b..56af57a 100644
--- a/media/java/android/media/ExifInterface.java
+++ b/media/java/android/media/ExifInterface.java
@@ -679,14 +679,14 @@
             if (value instanceof long[]) {
                 long[] array = (long[]) value;
                 if (array.length == 1) {
-                    return (double) array[0];
+                    return array[0];
                 }
                 throw new NumberFormatException("There are more than one component");
             }
             if (value instanceof int[]) {
                 int[] array = (int[]) value;
                 if (array.length == 1) {
-                    return (double) array[0];
+                    return array[0];
                 }
                 throw new NumberFormatException("There are more than one component");
             }
@@ -1083,6 +1083,7 @@
     private int mThumbnailOffset;
     private int mThumbnailLength;
     private byte[] mThumbnailBytes;
+    private boolean mIsSupportedFile;
 
     // Pattern to check non zero timestamp
     private static final Pattern sNonZeroTimePattern = Pattern.compile(".*[1-9].*");
@@ -1472,9 +1473,11 @@
 
             // Process JPEG input stream
             getJpegAttributes(in);
+            mIsSupportedFile = true;
         } catch (IOException e) {
             // Ignore exceptions in order to keep the compatibility with the old versions of
             // ExifInterface.
+            mIsSupportedFile = false;
             Log.w(TAG, "Invalid image: ExifInterface got an unsupported image format file"
                     + "(ExifInterface supports JPEG and some RAW image formats only) "
                     + "or a corrupted JPEG file to ExifInterface.", e);
@@ -1553,9 +1556,9 @@
      * and make a single call rather than multiple calls for each attribute.
      */
     public void saveAttributes() throws IOException {
-        if (mIsRaw) {
+        if (!mIsSupportedFile || mIsRaw) {
             throw new UnsupportedOperationException(
-                    "ExifInterface does not support saving attributes on RAW formats.");
+                    "ExifInterface only supports saving attributes on JPEG formats.");
         }
         if (mIsInputStream || (mSeekableFileDescriptor == null && mFilename == null)) {
             throw new UnsupportedOperationException(
@@ -2352,7 +2355,7 @@
         for (int i = 0; i < EXIF_TAGS.length; ++i) {
             int sum = 0;
             for (Map.Entry entry : (Set<Map.Entry>) mAttributes[i].entrySet()) {
-                final ExifAttribute exifAttribute = (ExifAttribute) ((Map.Entry) entry).getValue();
+                final ExifAttribute exifAttribute = (ExifAttribute) entry.getValue();
                 final int size = exifAttribute.size();
                 if (size > 4) {
                     sum += size;
diff --git a/media/java/android/media/audiofx/AudioEffect.java b/media/java/android/media/audiofx/AudioEffect.java
index b94a7e6..7dbca3b 100644
--- a/media/java/android/media/audiofx/AudioEffect.java
+++ b/media/java/android/media/audiofx/AudioEffect.java
@@ -53,7 +53,7 @@
  * than the priority used by the current effect engine owner, the control will be transfered to the
  * new object. Otherwise control will remain with the previous object. In this case, the new
  * application will be notified of changes in effect engine state or control ownership by the
- * appropiate listener.
+ * appropriate listener.
  */
 
 public class AudioEffect {
diff --git a/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml b/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml
index 20173b0..24cbfbd 100644
--- a/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml
@@ -4,7 +4,7 @@
     <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
     <string name="action_use_network" msgid="6076184727448466030">"যেভাবে আছে সেভাবেই এই নেটওয়ার্ক ব্যবহার করুন"</string>
     <string name="action_do_not_use_network" msgid="4577366536956516683">"এই নেটওয়ার্ক ব্যবহার করবেন না"</string>
-    <string name="action_bar_label" msgid="917235635415966620">"নেটওয়ার্কে প্রবেশ করুন করুন"</string>
+    <string name="action_bar_label" msgid="917235635415966620">"নেটওয়ার্কে প্রবেশ করুন"</string>
     <string name="ssl_error_warning" msgid="6653188881418638872">"আপনি যে নেটওয়ার্কে যোগ দেওয়ার চেষ্টা করছেন তাতে নিরাপত্তার সমস্যা আছে।"</string>
     <string name="ssl_error_example" msgid="647898534624078900">"উদাহরণস্বরূপ, লগইন পৃষ্ঠাটি প্রদর্শিত প্রতিষ্ঠানের অন্তর্গত নাও হতে পারে৷"</string>
     <string name="ssl_error_continue" msgid="6492718244923937110">"যাই হোক না কেন ব্রাউজারের মাধ্যমে অবিরত রাখুন"</string>
diff --git a/packages/DocumentsUI/src/com/android/documentsui/Events.java b/packages/DocumentsUI/src/com/android/documentsui/Events.java
index 14d4e2d..02a9127 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/Events.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/Events.java
@@ -53,7 +53,8 @@
      */
     public static boolean isTouchType(int toolType) {
         return toolType == MotionEvent.TOOL_TYPE_FINGER
-                || toolType == MotionEvent.TOOL_TYPE_STYLUS;
+                || toolType == MotionEvent.TOOL_TYPE_STYLUS
+                || toolType == MotionEvent.TOOL_TYPE_UNKNOWN;
     }
 
     /**
diff --git a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java
index b82f8dd..ae8938d 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java
@@ -401,8 +401,13 @@
                 return true;
             }
 
-            // Open the Close drawer if it is closed and we're at the top of a root.
-            if (size <= 1) {
+            final Intent intent = getIntent();
+            final boolean launchedExternally = intent != null && intent.getData() != null
+                    && mState.action == State.ACTION_BROWSE;
+
+            // Open the Close drawer if it is closed and we're at the top of a root, but only when
+            // not launched by another app.
+            if (size <= 1 && !launchedExternally) {
                 mDrawer.setOpen(true);
                 // Remember so we don't just close it again if back is pressed again.
                 mDrawerLastFiddled = System.currentTimeMillis();
diff --git a/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java b/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java
index d2e9885..b3db037 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java
@@ -22,6 +22,7 @@
 import android.annotation.Nullable;
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
 import android.os.UserHandle;
 import android.preference.PreferenceManager;
 
@@ -85,6 +86,15 @@
     public @interface PermissionStatus {}
 
     /**
+     * Clears all preferences associated with a given package.
+     *
+     * <p>Typically called when a package is removed or when user asked to clear its data.
+     */
+    static void clearPackagePreferences(Context context, String packageName) {
+        clearScopedAccessPreferences(context, packageName);
+    }
+
+    /**
      * Methods below are used to keep track of denied user requests on scoped directory access so
      * the dialog is not offered when user checked the 'Do not ask again' box
      *
@@ -108,6 +118,23 @@
       getPrefs(context).edit().putInt(key, status).apply();
     }
 
+    private static void clearScopedAccessPreferences(Context context, String packageName) {
+        final String keySubstring = "|" + packageName + "|";
+        final SharedPreferences prefs = getPrefs(context);
+        Editor editor = null;
+        for (final String key : prefs.getAll().keySet()) {
+            if (key.contains(keySubstring)) {
+                if (editor == null) {
+                    editor = prefs.edit();
+                }
+                editor.remove(key);
+            }
+        }
+        if (editor != null) {
+            editor.apply();
+        }
+    }
+
     private static String getScopedAccessDenialsKey(String packageName, String uuid,
             String directory) {
         final int userId = UserHandle.myUserId();
diff --git a/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java b/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java
index aef63af..fd1183f 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java
@@ -23,7 +23,7 @@
 import android.net.Uri;
 
 /**
- * Clean up {@link RecentsProvider} when packages are removed.
+ * Cleans up {@link RecentsProvider} and {@link LocalPreferences} when packages are removed.
  */
 public class PackageReceiver extends BroadcastReceiver {
     @Override
@@ -31,15 +31,19 @@
         final ContentResolver resolver = context.getContentResolver();
 
         final String action = intent.getAction();
+        final Uri data = intent.getData();
+        final String packageName = data == null ? null : data.getSchemeSpecificPart();
+
         if (Intent.ACTION_PACKAGE_FULLY_REMOVED.equals(action)) {
             resolver.call(RecentsProvider.buildRecent(), RecentsProvider.METHOD_PURGE, null, null);
-
+            if (packageName != null) {
+                LocalPreferences.clearPackagePreferences(context, packageName);
+            }
         } else if (Intent.ACTION_PACKAGE_DATA_CLEARED.equals(action)) {
-            final Uri data = intent.getData();
-            if (data != null) {
-                final String packageName = data.getSchemeSpecificPart();
+            if (packageName != null) {
                 resolver.call(RecentsProvider.buildRecent(), RecentsProvider.METHOD_PURGE_PACKAGE,
                         packageName, null);
+                LocalPreferences.clearPackagePreferences(context, packageName);
             }
         }
     }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java
index b7c0a9c..8a6723f 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java
@@ -53,10 +53,13 @@
 import android.support.annotation.Nullable;
 import android.support.design.widget.Snackbar;
 import android.support.v13.view.DragStartHelper;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat;
 import android.support.v7.widget.GridLayoutManager;
 import android.support.v7.widget.GridLayoutManager.SpanSizeLookup;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.RecyclerView.OnItemTouchListener;
+import android.support.v7.widget.RecyclerView.Recycler;
 import android.support.v7.widget.RecyclerView.RecyclerListener;
 import android.support.v7.widget.RecyclerView.ViewHolder;
 import android.text.BidiFormatter;
@@ -243,7 +246,40 @@
 
         mRecView.setAdapter(mAdapter);
 
-        mLayout = new GridLayoutManager(getContext(), mColumnCount);
+        // Switch Access Accessibility API needs an {@link AccessibilityDelegate} to know the proper
+        // route when user selects an UI element. It usually guesses this if the element has an
+        // {@link OnClickListener}, but since we do not have one for itemView, we will need to
+        // manually route it to the right behavior. RecyclerView has its own AccessibilityDelegate,
+        // and routes it to its LayoutManager; so we must override the LayoutManager's accessibility
+        // methods to route clicks correctly.
+        mLayout = new GridLayoutManager(getContext(), mColumnCount) {
+            @Override
+            public void onInitializeAccessibilityNodeInfoForItem(
+                    RecyclerView.Recycler recycler, RecyclerView.State state,
+                    View host, AccessibilityNodeInfoCompat info) {
+                super.onInitializeAccessibilityNodeInfoForItem(recycler, state, host, info);
+                info.addAction(AccessibilityActionCompat.ACTION_CLICK);
+            }
+
+            @Override
+            public boolean performAccessibilityActionForItem(
+                    RecyclerView.Recycler recycler, RecyclerView.State state, View view,
+                    int action, Bundle args) {
+                // We are only handling click events; route all other to default implementation
+                if (action == AccessibilityNodeInfoCompat.ACTION_CLICK) {
+                    RecyclerView.ViewHolder vh = mRecView.getChildViewHolder(view);
+                    if (vh instanceof DocumentHolder) {
+                        DocumentHolder dh = (DocumentHolder) vh;
+                        if (dh.mEventListener != null) {
+                            dh.mEventListener.onActivate(dh);
+                            return true;
+                        }
+                    }
+                }
+                return super.performAccessibilityActionForItem(recycler, state, view, action,
+                        args);
+            }
+        };
         SpanSizeLookup lookup = mAdapter.createSpanSizeLookup();
         if (lookup != null) {
             mLayout.setSpanSizeLookup(lookup);
@@ -717,63 +753,57 @@
     private void openDocuments(final Selection selected) {
         Metrics.logUserAction(getContext(), Metrics.USER_ACTION_OPEN);
 
-        new GetDocumentsTask() {
-            @Override
-            void onDocumentsReady(List<DocumentInfo> docs) {
-                // TODO: Implement support in Files activity for opening multiple docs.
-                BaseActivity.get(DirectoryFragment.this).onDocumentsPicked(docs);
-            }
-        }.execute(selected);
+        // Model must be accessed in UI thread, since underlying cursor is not threadsafe.
+        List<DocumentInfo> docs = mModel.getDocuments(selected);
+        // TODO: Implement support in Files activity for opening multiple docs.
+        BaseActivity.get(DirectoryFragment.this).onDocumentsPicked(docs);
     }
 
     private void shareDocuments(final Selection selected) {
         Metrics.logUserAction(getContext(), Metrics.USER_ACTION_SHARE);
 
-        new GetDocumentsTask() {
-            @Override
-            void onDocumentsReady(List<DocumentInfo> docs) {
-                Intent intent;
+        // Model must be accessed in UI thread, since underlying cursor is not threadsafe.
+        List<DocumentInfo> docs = mModel.getDocuments(selected);
+        Intent intent;
 
-                // Filter out directories and virtual files - those can't be shared.
-                List<DocumentInfo> docsForSend = new ArrayList<>();
-                for (DocumentInfo doc: docs) {
-                    if (!doc.isDirectory() && !doc.isVirtualDocument()) {
-                        docsForSend.add(doc);
-                    }
-                }
-
-                if (docsForSend.size() == 1) {
-                    final DocumentInfo doc = docsForSend.get(0);
-
-                    intent = new Intent(Intent.ACTION_SEND);
-                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
-                    intent.addCategory(Intent.CATEGORY_DEFAULT);
-                    intent.setType(doc.mimeType);
-                    intent.putExtra(Intent.EXTRA_STREAM, doc.derivedUri);
-
-                } else if (docsForSend.size() > 1) {
-                    intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
-                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
-                    intent.addCategory(Intent.CATEGORY_DEFAULT);
-
-                    final ArrayList<String> mimeTypes = new ArrayList<>();
-                    final ArrayList<Uri> uris = new ArrayList<>();
-                    for (DocumentInfo doc : docsForSend) {
-                        mimeTypes.add(doc.mimeType);
-                        uris.add(doc.derivedUri);
-                    }
-
-                    intent.setType(findCommonMimeType(mimeTypes));
-                    intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
-
-                } else {
-                    return;
-                }
-
-                intent = Intent.createChooser(intent, getActivity().getText(R.string.share_via));
-                startActivity(intent);
+        // Filter out directories and virtual files - those can't be shared.
+        List<DocumentInfo> docsForSend = new ArrayList<>();
+        for (DocumentInfo doc: docs) {
+            if (!doc.isDirectory() && !doc.isVirtualDocument()) {
+                docsForSend.add(doc);
             }
-        }.execute(selected);
+        }
+
+        if (docsForSend.size() == 1) {
+            final DocumentInfo doc = docsForSend.get(0);
+
+            intent = new Intent(Intent.ACTION_SEND);
+            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            intent.addCategory(Intent.CATEGORY_DEFAULT);
+            intent.setType(doc.mimeType);
+            intent.putExtra(Intent.EXTRA_STREAM, doc.derivedUri);
+
+        } else if (docsForSend.size() > 1) {
+            intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
+            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            intent.addCategory(Intent.CATEGORY_DEFAULT);
+
+            final ArrayList<String> mimeTypes = new ArrayList<>();
+            final ArrayList<Uri> uris = new ArrayList<>();
+            for (DocumentInfo doc : docsForSend) {
+                mimeTypes.add(doc.mimeType);
+                uris.add(doc.derivedUri);
+            }
+
+            intent.setType(findCommonMimeType(mimeTypes));
+            intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
+
+        } else {
+            return;
+        }
+
+        intent = Intent.createChooser(intent, getActivity().getText(R.string.share_via));
+        startActivity(intent);
     }
 
     private String generateDeleteMessage(final List<DocumentInfo> docs) {
@@ -819,52 +849,51 @@
         assert(!selected.isEmpty());
 
         final DocumentInfo srcParent = getDisplayState().stack.peek();
-        new GetDocumentsTask() {
-            @Override
-            void onDocumentsReady(final List<DocumentInfo> docs) {
 
-                TextView message =
-                        (TextView) mInflater.inflate(R.layout.dialog_delete_confirmation, null);
-                message.setText(generateDeleteMessage(docs));
+        // Model must be accessed in UI thread, since underlying cursor is not threadsafe.
+        List<DocumentInfo> docs = mModel.getDocuments(selected);
 
-                // This "insta-hides" files that are being deleted, because
-                // the delete operation may be not execute immediately (it
-                // may be queued up on the FileOperationService.)
-                // To hide the files locally, we call the hide method on the adapter
-                // ...which a live object...cannot be parceled.
-                // For that reason, for now, we implement this dialog NOT
-                // as a fragment (which can survive rotation and have its own state),
-                // but as a simple runtime dialog. So rotating a device with an
-                // active delete dialog...results in that dialog disappearing.
-                // We can do better, but don't have cycles for it now.
-                new AlertDialog.Builder(getActivity())
-                    .setView(message)
-                    .setPositiveButton(
-                         android.R.string.yes,
-                         new DialogInterface.OnClickListener() {
-                            public void onClick(DialogInterface dialog, int id) {
-                                // Finish selection mode first which clears selection so we
-                                // don't end up trying to deselect deleted documents.
-                                // This is done here, rather in the onActionItemClicked
-                                // so we can avoid de-selecting items in the case where
-                                // the user cancels the delete.
-                                if (mActionMode != null) {
-                                    mActionMode.finish();
-                                } else {
-                                    Log.w(TAG, "Action mode is null before deleting documents.");
-                                }
-                                // Hide the files in the UI...since the operation
-                                // might be queued up on FileOperationService.
-                                // We're walking a line here.
-                                mAdapter.hide(selected.getAll());
-                                FileOperations.delete(
-                                        getActivity(), docs, srcParent, getDisplayState().stack);
-                            }
-                        })
-                    .setNegativeButton(android.R.string.no, null)
-                    .show();
-            }
-        }.execute(selected);
+        TextView message =
+                (TextView) mInflater.inflate(R.layout.dialog_delete_confirmation, null);
+        message.setText(generateDeleteMessage(docs));
+
+        // This "insta-hides" files that are being deleted, because
+        // the delete operation may be not execute immediately (it
+        // may be queued up on the FileOperationService.)
+        // To hide the files locally, we call the hide method on the adapter
+        // ...which a live object...cannot be parceled.
+        // For that reason, for now, we implement this dialog NOT
+        // as a fragment (which can survive rotation and have its own state),
+        // but as a simple runtime dialog. So rotating a device with an
+        // active delete dialog...results in that dialog disappearing.
+        // We can do better, but don't have cycles for it now.
+        new AlertDialog.Builder(getActivity())
+            .setView(message)
+            .setPositiveButton(
+                 android.R.string.yes,
+                 new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int id) {
+                        // Finish selection mode first which clears selection so we
+                        // don't end up trying to deselect deleted documents.
+                        // This is done here, rather in the onActionItemClicked
+                        // so we can avoid de-selecting items in the case where
+                        // the user cancels the delete.
+                        if (mActionMode != null) {
+                            mActionMode.finish();
+                        } else {
+                            Log.w(TAG, "Action mode is null before deleting documents.");
+                        }
+                        // Hide the files in the UI...since the operation
+                        // might be queued up on FileOperationService.
+                        // We're walking a line here.
+                        mAdapter.hide(selected.getAll());
+                        FileOperations.delete(
+                                getActivity(), docs, srcParent, getDisplayState().stack);
+                    }
+                })
+            .setNegativeButton(android.R.string.no, null)
+            .show();
     }
 
     private void transferDocuments(final Selection selected, final @OpType int mode) {
@@ -898,25 +927,21 @@
                 ? R.string.menu_move : R.string.menu_copy;
         intent.putExtra(DocumentsContract.EXTRA_PROMPT, getResources().getString(drawerTitleId));
 
-        new GetDocumentsTask() {
-            @Override
-            void onDocumentsReady(List<DocumentInfo> docs) {
-                // TODO: Can this move to Fragment bundle state?
-                getDisplayState().selectedDocumentsForCopy = docs;
+        // Model must be accessed in UI thread, since underlying cursor is not threadsafe.
+        List<DocumentInfo> docs = mModel.getDocuments(selected);
+        // TODO: Can this move to Fragment bundle state?
+        getDisplayState().selectedDocumentsForCopy = docs;
 
-                // Determine if there is a directory in the set of documents
-                // to be copied? Why? Directory creation isn't supported by some roots
-                // (like Downloads). This informs DocumentsActivity (the "picker")
-                // to restrict available roots to just those with support.
-                intent.putExtra(Shared.EXTRA_DIRECTORY_COPY, hasDirectory(docs));
-                intent.putExtra(FileOperationService.EXTRA_OPERATION, mode);
+        // Determine if there is a directory in the set of documents
+        // to be copied? Why? Directory creation isn't supported by some roots
+        // (like Downloads). This informs DocumentsActivity (the "picker")
+        // to restrict available roots to just those with support.
+        intent.putExtra(Shared.EXTRA_DIRECTORY_COPY, hasDirectory(docs));
+        intent.putExtra(FileOperationService.EXTRA_OPERATION, mode);
 
-                // This just identifies the type of request...we'll check it
-                // when we reveive a response.
-                startActivityForResult(intent, REQUEST_COPY_DESTINATION);
-            }
-
-        }.execute(selected);
+        // This just identifies the type of request...we'll check it
+        // when we reveive a response.
+        startActivityForResult(intent, REQUEST_COPY_DESTINATION);
     }
 
     private static boolean hasDirectory(List<DocumentInfo> docs) {
@@ -935,12 +960,9 @@
         // Rename option is only available in menu when 1 document selected
         assert(selected.size() == 1);
 
-        new GetDocumentsTask() {
-            @Override
-            void onDocumentsReady(List<DocumentInfo> docs) {
-                RenameDocumentFragment.show(getFragmentManager(), docs.get(0));
-            }
-        }.execute(selected);
+        // Model must be accessed in UI thread, since underlying cursor is not threadsafe.
+        List<DocumentInfo> docs = mModel.getDocuments(selected);
+        RenameDocumentFragment.show(getFragmentManager(), docs.get(0));
     }
 
     @Override
@@ -1099,19 +1121,17 @@
         }
     }
 
-    void copySelectionToClipboard(Selection selection) {
-        assert(!selection.isEmpty());
-        new GetDocumentsTask() {
-            @Override
-            void onDocumentsReady(List<DocumentInfo> docs) {
-                mClipper.clipDocuments(docs);
-                Activity activity = getActivity();
-                Snackbars.makeSnackbar(activity,
-                        activity.getResources().getQuantityString(
-                                R.plurals.clipboard_files_clipped, docs.size(), docs.size()),
-                        Snackbar.LENGTH_SHORT).show();
-            }
-        }.execute(selection);
+    void copySelectionToClipboard(Selection selected) {
+        assert(!selected.isEmpty());
+
+        // Model must be accessed in UI thread, since underlying cursor is not threadsafe.
+        List<DocumentInfo> docs = mModel.getDocuments(selected);
+        mClipper.clipDocuments(docs);
+        Activity activity = getActivity();
+        Snackbars.makeSnackbar(activity,
+                activity.getResources().getQuantityString(
+                        R.plurals.clipboard_files_clipped, docs.size(), docs.size()),
+                Snackbar.LENGTH_SHORT).show();
     }
 
     public void pasteFromClipboard() {
@@ -1420,25 +1440,6 @@
             mShadowView.draw(canvas);
         }
     }
-    /**
-     * Abstract task providing support for loading documents *off*
-     * the main thread. And if it isn't obvious, creating a list
-     * of documents (especially large lists) can be pretty expensive.
-     */
-    private abstract class GetDocumentsTask
-            extends AsyncTask<Selection, Void, List<DocumentInfo>> {
-        @Override
-        protected final List<DocumentInfo> doInBackground(Selection... selected) {
-            return mModel.getDocuments(selected[0]);
-        }
-
-        @Override
-        protected final void onPostExecute(List<DocumentInfo> docs) {
-            onDocumentsReady(docs);
-        }
-
-        abstract void onDocumentsReady(List<DocumentInfo> docs);
-    }
 
     @Override
     public boolean isSelected(String modelId) {
diff --git a/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java b/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java
index 1118171..1de3bbc 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java
@@ -117,7 +117,9 @@
         byteCopyDocument(src, dest);
 
         // Remove the source document.
-        deleteDocument(src, srcParent);
+        if(!isCanceled()) {
+            deleteDocument(src, srcParent);
+        }
     }
 
     @Override
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
index 78b9927..7fe0d2f 100644
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
@@ -566,6 +566,7 @@
             throws FileNotFoundException {
         final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection));
 
+        query = query.toLowerCase();
         final File parent;
         synchronized (mRootsLock) {
             parent = mRoots.get(rootId).path;
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java
index cce619e..4950af3 100644
--- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java
+++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java
@@ -873,7 +873,7 @@
     }
 
     private static int getRootFlags(int[] operationsSupported) {
-        int rootFlag = Root.FLAG_SUPPORTS_IS_CHILD;
+        int rootFlag = Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_LOCAL_ONLY;
         if (MtpDeviceRecord.isWritingSupported(operationsSupported)) {
             rootFlag |= Root.FLAG_SUPPORTS_CREATE;
         }
diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java
index 404047b..8c13c81 100644
--- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java
+++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java
@@ -128,7 +128,7 @@
             cursor.moveToNext();
             assertEquals(1, getInt(cursor, Root.COLUMN_ROOT_ID));
             assertEquals(
-                    Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE,
+                    Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY,
                     getInt(cursor, Root.COLUMN_FLAGS));
             assertEquals(R.drawable.ic_root_mtp, getInt(cursor, Root.COLUMN_ICON));
             assertEquals("Device Storage", getString(cursor, Root.COLUMN_TITLE));
diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java
index 9ed15c8..d19b460 100644
--- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java
+++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java
@@ -210,7 +210,11 @@
             assertEquals(2, cursor.getCount());
             cursor.moveToNext();
             assertEquals("1", cursor.getString(0));
-            assertEquals(Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, cursor.getInt(1));
+            assertEquals(
+                    Root.FLAG_SUPPORTS_IS_CHILD |
+                    Root.FLAG_SUPPORTS_CREATE |
+                    Root.FLAG_LOCAL_ONLY,
+                    cursor.getInt(1));
             assertEquals(R.drawable.ic_root_mtp, cursor.getInt(2));
             assertEquals("Device A Storage A", cursor.getString(3));
             assertEquals("1", cursor.getString(4));
@@ -225,7 +229,8 @@
             cursor.moveToNext();
             cursor.moveToNext();
             assertEquals("2", cursor.getString(0));
-            assertEquals(Root.FLAG_SUPPORTS_IS_CHILD, cursor.getInt(1));
+            assertEquals(
+                    Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_LOCAL_ONLY, cursor.getInt(1));
             assertEquals(R.drawable.ic_root_mtp, cursor.getInt(2));
             assertEquals("Device B Storage B", cursor.getString(3));
             assertEquals("2", cursor.getString(4));
@@ -271,7 +276,9 @@
 
             cursor.moveToNext();
             assertEquals("1", cursor.getString(0));
-            assertEquals(Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, cursor.getInt(1));
+            assertEquals(
+                    Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY,
+                    cursor.getInt(1));
             assertEquals(R.drawable.ic_root_mtp, cursor.getInt(2));
             assertEquals("Device A", cursor.getString(3));
             assertEquals("1", cursor.getString(4));
@@ -279,7 +286,9 @@
 
             cursor.moveToNext();
             assertEquals("2", cursor.getString(0));
-            assertEquals(Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, cursor.getInt(1));
+            assertEquals(
+                    Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY,
+                    cursor.getInt(1));
             assertEquals(R.drawable.ic_root_mtp, cursor.getInt(2));
             assertEquals("Device B Storage B", cursor.getString(3));
             assertEquals("2", cursor.getString(4));
diff --git a/packages/PrintSpooler/res/values-zh-rCN/strings.xml b/packages/PrintSpooler/res/values-zh-rCN/strings.xml
index 3debf8e..d4e7963 100644
--- a/packages/PrintSpooler/res/values-zh-rCN/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rCN/strings.xml
@@ -60,7 +60,7 @@
       <item quantity="one">找到 <xliff:g id="COUNT_0">%1$s</xliff:g> 台打印机</item>
     </plurals>
     <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string>
-    <string name="printer_info_desc" msgid="7181988788991581654">"关于此打印机的更多信息"</string>
+    <string name="printer_info_desc" msgid="7181988788991581654">"此打印机的详细信息"</string>
     <string name="could_not_create_file" msgid="3425025039427448443">"无法创建文件"</string>
     <string name="print_services_disabled_toast" msgid="9089060734685174685">"部分打印服务已停用"</string>
     <string name="print_searching_for_printers" msgid="6550424555079932867">"正在搜索打印机"</string>
diff --git a/packages/SettingsLib/res/values/config.xml b/packages/SettingsLib/res/values/config.xml
index d9473fa..0cf4a41 100755
--- a/packages/SettingsLib/res/values/config.xml
+++ b/packages/SettingsLib/res/values/config.xml
@@ -22,4 +22,19 @@
 
     <!-- Default data warning level in mb -->
     <integer name="default_data_warning_level_mb">2048</integer>
+
+    <!-- Whether to send a custom package name with the PSD. translatable="false"-->
+    <bool name="config_sendPackageName">true</bool>
+
+    <!-- Name for the set of keys associating package names -->
+    <string name="config_helpPackageNameKey" translatable="false"></string>
+
+    <!-- Name for the set of values of package names -->
+    <string name="config_helpPackageNameValue" translatable="false"></string>
+
+    <!-- Intent key for the package name keys -->
+    <string name="config_helpIntentExtraKey" translatable="false"></string>
+
+    <!-- Intent key for package name values -->
+    <string name="config_helpIntentNameKey" translatable="false"></string>
 </resources>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 7d42211..682af8b 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -863,4 +863,7 @@
     <!-- Label for Help and feedback menu item -->
     <string name="help_feedback_label">Help &amp; feedback</string>
 
+    <!-- Content description for drawer menu button [CHAR_LIMIT=30]-->
+    <string name="content_description_menu_button">Menu</string>
+
 </resources>
diff --git a/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java b/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java
index 21116b8..381f903 100644
--- a/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java
@@ -23,6 +23,7 @@
 import android.content.Intent;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Resources;
 import android.content.res.Resources.Theme;
 import android.content.res.TypedArray;
 import android.net.Uri;
@@ -33,6 +34,8 @@
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MenuItem.OnMenuItemClickListener;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.MetricsProto.MetricsEvent;
 
 import java.net.URISyntaxException;
 import java.util.Locale;
@@ -111,6 +114,9 @@
                 helpMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
                     @Override
                     public boolean onMenuItemClick(MenuItem item) {
+                        MetricsLogger.action(activity,
+                            MetricsEvent.ACTION_SETTING_HELP_AND_FEEDBACK,
+                            intent.getStringExtra(EXTRA_CONTEXT));
                         try {
                             activity.startActivityForResult(intent, 0);
                         } catch (ActivityNotFoundException exc) {
@@ -140,7 +146,7 @@
         try {
             Intent intent = Intent.parseUri(helpUriString,
                     Intent.URI_ANDROID_APP_SCHEME | Intent.URI_INTENT_SCHEME);
-            addIntentParameters(context, intent, backupContext);
+            addIntentParameters(context, intent, backupContext, true /* sendPackageName */);
             ComponentName component = intent.resolveActivity(context.getPackageManager());
             if (component != null) {
                 return intent;
@@ -164,11 +170,28 @@
         return intent;
     }
 
-    public static void addIntentParameters(Context context, Intent intent, String backupContext) {
+    public static void addIntentParameters(Context context, Intent intent, String backupContext,
+            boolean sendPackageName) {
         if (!intent.hasExtra(EXTRA_CONTEXT)) {
             // Insert some context if none exists.
             intent.putExtra(EXTRA_CONTEXT, backupContext);
         }
+
+        Resources resources = context.getResources();
+        boolean includePackageName = resources.getBoolean(R.bool.config_sendPackageName);
+
+        if (sendPackageName && includePackageName) {
+            String[] packageNameKey =
+                    {resources.getString(R.string.config_helpPackageNameKey)};
+            String[] packageNameValue =
+                    {resources.getString(R.string.config_helpPackageNameValue)};
+            String intentExtraKey =
+                    resources.getString(R.string.config_helpIntentExtraKey);
+            String intentNameKey =
+                    resources.getString(R.string.config_helpIntentNameKey);
+            intent.putExtra(intentExtraKey, packageNameKey);
+            intent.putExtra(intentNameKey, packageNameValue);
+        }
         intent.putExtra(EXTRA_THEME, 1 /* Light, dark action bar */);
         TypedArray array = context.obtainStyledAttributes(new int[]{android.R.attr.colorPrimary});
         intent.putExtra(EXTRA_PRIMARY_COLOR, array.getColor(0, 0));
diff --git a/packages/SettingsLib/src/com/android/settingslib/SuggestionParser.java b/packages/SettingsLib/src/com/android/settingslib/SuggestionParser.java
index 741b0ea..21786c9 100644
--- a/packages/SettingsLib/src/com/android/settingslib/SuggestionParser.java
+++ b/packages/SettingsLib/src/com/android/settingslib/SuggestionParser.java
@@ -28,7 +28,6 @@
 import android.provider.Settings;
 import android.accounts.Account;
 import android.accounts.AccountManager;
-import android.content.ContentValues;
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
 import android.view.InflateException;
@@ -176,6 +175,9 @@
         } catch (PackageManager.NameNotFoundException e) {
             Log.w(TAG, "Cannot find resources for " + suggestion.intent.getComponent());
             return false;
+        } catch (Resources.NotFoundException e) {
+            Log.w(TAG, "Cannot find resources for " + suggestion.intent.getComponent(), e);
+            return false;
         }
     }
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
index 6658c14..a50b366 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
@@ -226,6 +226,7 @@
     public void showMenuIcon() {
         mShowingMenu = true;
         getActionBar().setHomeAsUpIndicator(R.drawable.ic_menu);
+        getActionBar().setHomeActionContentDescription(R.string.content_description_menu_button);
         getActionBar().setDisplayHomeAsUpEnabled(true);
     }
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
index 284827b..aae9cf6 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
@@ -29,7 +29,6 @@
 import android.util.AttributeSet;
 import android.util.SparseArray;
 import android.widget.TextView;
-
 import com.android.settingslib.R;
 
 public class AccessPointPreference extends Preference {
@@ -44,13 +43,14 @@
     private final StateListDrawable mWifiSld;
     private final int mBadgePadding;
     private final UserBadgeCache mBadgeCache;
-
     private TextView mTitleView;
+
     private boolean mForSavedNetworks = false;
     private AccessPoint mAccessPoint;
     private Drawable mBadge;
     private int mLevel;
     private CharSequence mContentDescription;
+    private int mDefaultIconResId;
 
     static final int[] WIFI_CONNECTION_STRENGTH = {
             R.string.accessibility_wifi_one_bar,
@@ -85,6 +85,24 @@
         refresh();
     }
 
+    public AccessPointPreference(AccessPoint accessPoint, Context context, UserBadgeCache cache,
+            int iconResId, boolean forSavedNetworks) {
+        super(context);
+        mBadgeCache = cache;
+        mAccessPoint = accessPoint;
+        mForSavedNetworks = forSavedNetworks;
+        mAccessPoint.setTag(this);
+        mLevel = -1;
+        mDefaultIconResId = iconResId;
+
+        mWifiSld = (StateListDrawable) context.getTheme()
+                .obtainStyledAttributes(wifi_signal_attributes).getDrawable(0);
+
+        // Distance from the end of the title at which this AP's user badge should sit.
+        mBadgePadding = context.getResources()
+                .getDimensionPixelSize(R.dimen.wifi_preference_badge_padding);
+    }
+
     public AccessPoint getAccessPoint() {
         return mAccessPoint;
     }
@@ -112,7 +130,7 @@
 
     protected void updateIcon(int level, Context context) {
         if (level == -1) {
-            setIcon(null);
+            safeSetDefaultIcon();
         } else {
             if (getIcon() == null) {
                 // To avoid a drawing race condition, we first set the state (SECURE/NONE) and then
@@ -124,16 +142,24 @@
                             ? STATE_SECURED
                             : STATE_NONE);
                     Drawable drawable = mWifiSld.getCurrent();
-                    if (!mForSavedNetworks) {
+                    if (!mForSavedNetworks && drawable != null) {
                         setIcon(drawable);
-                    } else {
-                        setIcon(null);
+                        return;
                     }
                 }
+                safeSetDefaultIcon();
             }
         }
     }
 
+    private void safeSetDefaultIcon() {
+        if (mDefaultIconResId != 0) {
+            setIcon(mDefaultIconResId);
+        } else {
+            setIcon(null);
+        }
+    }
+
     protected void updateBadge(Context context) {
         WifiConfiguration config = mAccessPoint.getConfig();
         if (config != null) {
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 0f7fe6f..a43c398 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -114,7 +114,7 @@
 public class SettingsProvider extends ContentProvider {
     private static final boolean DEBUG = false;
 
-    private static final boolean DROP_DATABASE_ON_MIGRATION = !Build.IS_DEBUGGABLE;
+    private static final boolean DROP_DATABASE_ON_MIGRATION = true;
 
     private static final String LOG_TAG = "SettingsProvider";
 
@@ -2142,6 +2142,12 @@
 
                     // Now upgrade should work fine.
                     onUpgradeLocked(mUserId, oldVersion, newVersion);
+
+                    // Make a note what happened, so we don't wonder why data was lost
+                    String reason = "Settings rebuilt! Current version: "
+                            + curVersion + " while expected: " + newVersion;
+                    getGlobalSettingsLocked().insertSettingLocked(
+                            Settings.Global.DATABASE_DOWNGRADE_REASON, reason, "android");
                 }
 
                 // Set the global settings version if owner.
@@ -2411,7 +2417,7 @@
                 }
 
                 if (currentVersion != newVersion) {
-                    Slog.w("SettingsProvider", "warning: upgrading settings database to version "
+                    Slog.wtf("SettingsProvider", "warning: upgrading settings database to version "
                             + newVersion + " left it at "
                             + currentVersion + " instead; this is probably a bug", new Throwable());
                     if (DEBUG) {
diff --git a/packages/Shell/Android.mk b/packages/Shell/Android.mk
index 73a0449..81ab2ff 100644
--- a/packages/Shell/Android.mk
+++ b/packages/Shell/Android.mk
@@ -12,6 +12,8 @@
 LOCAL_CERTIFICATE := platform
 LOCAL_PRIVILEGED_MODULE := true
 
+LOCAL_JACK_COVERAGE_INCLUDE_FILTER := com.android.shell.*
+
 include $(BUILD_PACKAGE)
 
 include $(LOCAL_PATH)/tests/Android.mk
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index bdb103a..de25115 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -150,9 +150,6 @@
     <!-- DevicePolicyManager get user restrictions -->
     <uses-permission android:name="android.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS" />
 
-    <!-- Needed for passing extras with intent ACTION_SHOW_ADMIN_SUPPORT_DETAILS -->
-    <uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" />
-
     <!-- TV picture-in-picture -->
     <uses-permission android:name="android.permission.RECEIVE_MEDIA_RESOURCE_USAGE" />
 
diff --git a/packages/SystemUI/res/values-bs-rBA-land/strings.xml b/packages/SystemUI/res/values-bs-rBA-land/strings.xml
index bdc652a..56a4ad2 100644
--- a/packages/SystemUI/res/values-bs-rBA-land/strings.xml
+++ b/packages/SystemUI/res/values-bs-rBA-land/strings.xml
@@ -19,5 +19,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="toast_rotation_locked" msgid="7609673011431556092">"Ekran je sada zaključan u pejzažnom prikazu."</string>
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"Ekran je sada zaključan u vodoravnom prikazu."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml
index d0d6c50..2aad63c 100644
--- a/packages/SystemUI/res/values-hy-rAM/strings.xml
+++ b/packages/SystemUI/res/values-hy-rAM/strings.xml
@@ -32,7 +32,7 @@
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ծանուցումներ չկան"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ընթացիկ"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ծանուցումներ"</string>
-    <string name="battery_low_title" msgid="6456385927409742437">"Մարտկոցը լիցքաթափվում է"</string>
+    <string name="battery_low_title" msgid="6456385927409742437">"Մարտկոցի լիցքը սպառվում է"</string>
     <string name="battery_low_percent_format" msgid="2900940511201380775">"Մնաց <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
     <string name="battery_low_percent_format_saver_started" msgid="6859235584035338833">"Մնաց <xliff:g id="PERCENTAGE">%s</xliff:g>: Մարտկոցի տնտեսումը միացված է:"</string>
     <string name="invalid_charger" msgid="4549105996740522523">"USB լիցքավորումը չի աջակցվում:\nՕգտվեք միայն գործող լիցքավորիչից:"</string>
diff --git a/packages/SystemUI/res/values-it/strings_car.xml b/packages/SystemUI/res/values-it/strings_car.xml
index ae26c9e..19c4e2b 100644
--- a/packages/SystemUI/res/values-it/strings_car.xml
+++ b/packages/SystemUI/res/values-it/strings_car.xml
@@ -20,5 +20,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="car_lockscreen_disclaimer_title" msgid="7997539137376896441">"Guida in modo sicuro"</string>
-    <string name="car_lockscreen_disclaimer_text" msgid="3061224684092952864">"È necessario essere sempre pienamente coscienti delle condizioni di guida e rispettare le leggi vigenti. Le indicazioni stradali potrebbero essere imprecise, incomplete, pericolose, non adatte, vietate o implicare l\'attraversamento di confini. Anche le informazioni sulle attività commerciali potrebbero essere imprecise o incomplete. I dati non vengono forniti in tempo reale e non è possibile garantire la precisione della geolocalizzazione. Non maneggiare il dispositivo mobile e non utilizzare app non progettate per Android Auto durante la guida."</string>
+    <string name="car_lockscreen_disclaimer_text" msgid="3061224684092952864">"È necessario essere sempre pienamente informati sulle condizioni della strada e rispettare la legislazione vigente. Le indicazioni stradali potrebbero essere imprecise, incomplete, pericolose, inadatte, vietate o richiedere l\'attraversamento di aree amministrative. Anche le informazioni sugli esercizi commerciali potrebbero essere imprecise o incomplete. I dati forniti non sono aggiornati in tempo reale e non è possibile garantire la precisione della geolocalizzazione. Non maneggiare dispositivi mobili e app non destinate ad Android Auto durante la guida."</string>
 </resources>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index c2897cd..8d44048 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -218,12 +218,6 @@
     <!-- Doze: should notifications be used as a pulse signal? -->
     <bool name="doze_pulse_on_notifications">true</bool>
 
-    <!-- Doze: when to pulse after a buzzworthy notification arrives -->
-    <string name="doze_pulse_schedule" translatable="false">10s,30s,60s</string>
-
-    <!-- Doze: maximum number of times the notification pulse schedule can be reset -->
-    <integer name="doze_pulse_schedule_resets">2</integer>
-
     <!-- Doze: duration to avoid false pickup gestures triggered by notification vibrations -->
     <integer name="doze_pickup_vibration_threshold">2000</integer>
 
@@ -253,7 +247,7 @@
     <integer name="doze_pulse_duration_in_pickup">130</integer>
 
     <!-- Doze: pulse parameter - once faded in, how long does it stay visible? -->
-    <integer name="doze_pulse_duration_visible">3000</integer>
+    <integer name="doze_pulse_duration_visible">6000</integer>
 
     <!-- Doze: pulse parameter - how long does it take to fade out? -->
     <integer name="doze_pulse_duration_out">600</integer>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 6c48b25..a670df5 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1243,11 +1243,6 @@
     <!-- Option to use new paging layout in quick settings [CHAR LIMIT=60] -->
     <string name="qs_paging" translatable="false">Use the new Quick Settings</string>
 
-    <!-- Toggle to enable the gesture to enter split-screen by swiping up from the Overview button. [CHAR LIMIT=60]-->
-    <string name="overview_nav_bar_gesture">Enable split-screen swipe-up gesture</string>
-    <!-- Description for the toggle to enable the gesture to enter split-screen by swiping up from the Overview button. [CHAR LIMIT=NONE]-->
-    <string name="overview_nav_bar_gesture_desc">Enable gesture to enter split-screen by swiping up from the Overview button</string>
-
     <!-- Category in the System UI Tuner settings, where new/experimental
          settings are -->
     <string name="experimental">Experimental</string>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 1ee13e9..1e3b841 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -42,7 +42,7 @@
     </style>
 
     <!-- Theme used for the activity that shows when the system forced an app to be resizable -->
-    <style name="ForcedResizableTheme" parent="@android:style/Theme.Translucent.NoTitleBar.Fullscreen">
+    <style name="ForcedResizableTheme" parent="@android:style/Theme.Translucent.NoTitleBar">
         <item name="android:windowBackground">@drawable/forced_resizable_background</item>
         <item name="android:statusBarColor">@color/transparent</item>
         <item name="android:windowAnimationStyle">@style/Animation.ForcedResizable</item>
diff --git a/packages/SystemUI/res/xml/other_settings.xml b/packages/SystemUI/res/xml/other_settings.xml
index 3c872fa..ce636cd 100644
--- a/packages/SystemUI/res/xml/other_settings.xml
+++ b/packages/SystemUI/res/xml/other_settings.xml
@@ -18,11 +18,6 @@
                   xmlns:sysui="http://schemas.android.com/apk/res-auto"
                   android:title="@string/other">
 
-    <com.android.systemui.tuner.TunerSwitch
-            android:key="overview_nav_bar_gesture"
-            android:title="@string/overview_nav_bar_gesture"
-            android:summary="@string/overview_nav_bar_gesture_desc" />
-
     <!-- importance -->
     <Preference
             android:key="power_notification_controls"
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/AccelerationClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/AccelerationClassifier.java
index bad739fd..4585fe9 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/AccelerationClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/AccelerationClassifier.java
@@ -62,36 +62,36 @@
     @Override
     public float getFalseTouchEvaluation(int type, Stroke stroke) {
         Data data = mStrokeMap.get(stroke);
-        return SpeedRatioEvaluator.evaluate(data.maxSpeedRatio)
-                + DistanceRatioEvaluator.evaluate(data.maxDistanceRatio);
+        return 2 * SpeedRatioEvaluator.evaluate(data.maxSpeedRatio);
     }
 
     private static class Data {
-        public Point previousPoint;
-        public float previousSpeed;
-        public float previousDistance;
-        public float maxSpeedRatio;
-        public float maxDistanceRatio;
+
+        static final float MILLIS_TO_NANOS = 1e6f;
+
+        Point previousPoint;
+        float previousSpeed = 0;
+        float maxSpeedRatio = 0;
 
         public Data(Point point) {
             previousPoint = point;
-            previousSpeed = previousDistance = 0.0f;
-            maxDistanceRatio = maxSpeedRatio = 0.0f;
         }
 
         public void addPoint(Point point) {
             float distance = previousPoint.dist(point);
             float duration = (float) (point.timeOffsetNano - previousPoint.timeOffsetNano + 1);
             float speed = distance / duration;
-            if (previousDistance != 0.0f) {
-                maxDistanceRatio = Math.max(maxDistanceRatio, distance / previousDistance);
-            }
 
+            if (duration > 20 * MILLIS_TO_NANOS || duration < 5 * MILLIS_TO_NANOS) {
+                // reject this segment and ensure we won't use data about it in the next round.
+                previousSpeed = 0;
+                previousPoint = point;
+                return;
+            }
             if (previousSpeed != 0.0f) {
                 maxSpeedRatio = Math.max(maxSpeedRatio, speed / previousSpeed);
             }
 
-            previousDistance = distance;
             previousSpeed = speed;
             previousPoint = point;
         }
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/DistanceRatioEvaluator.java b/packages/SystemUI/src/com/android/systemui/classifier/DistanceRatioEvaluator.java
deleted file mode 100644
index 8acb009..0000000
--- a/packages/SystemUI/src/com/android/systemui/classifier/DistanceRatioEvaluator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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 com.android.systemui.classifier;
-
-public class DistanceRatioEvaluator {
-    public static float evaluate(float value) {
-        float evaluation = 0.0f;
-        if (value <= 1.0) evaluation++;
-        if (value <= 0.5) evaluation++;
-        if (value > 4.0) evaluation++;
-        if (value > 7.0) evaluation++;
-        if (value > 14.0) evaluation++;
-        return evaluation;
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/SpeedRatioEvaluator.java b/packages/SystemUI/src/com/android/systemui/classifier/SpeedRatioEvaluator.java
index 4c6cea0..e34f222 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/SpeedRatioEvaluator.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/SpeedRatioEvaluator.java
@@ -19,6 +19,7 @@
 public class SpeedRatioEvaluator {
     public static float evaluate(float value) {
         float evaluation = 0.0f;
+        if (value == 0) return 0;
         if (value <= 1.0) evaluation++;
         if (value <= 0.5) evaluation++;
         if (value > 9.0) evaluation++;
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
index 7c8d0f6..874021a 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
@@ -33,7 +33,7 @@
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
     private static final boolean ENABLED = true;
     private static final int SIZE = Build.IS_DEBUGGABLE ? 400 : 50;
-    private static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
+    static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
 
     private static final int PULSE_REASONS = 4;
 
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
index fc0d8bb..ec4f447 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
@@ -16,8 +16,6 @@
 
 package com.android.systemui.doze;
 
-import android.app.AlarmManager;
-import android.app.PendingIntent;
 import android.app.UiModeManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -43,7 +41,6 @@
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.systemui.SystemUIApplication;
 import com.android.systemui.statusbar.phone.DozeParameters;
-import com.android.systemui.statusbar.phone.DozeParameters.PulseSchedule;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -55,19 +52,6 @@
 
     private static final String ACTION_BASE = "com.android.systemui.doze";
     private static final String PULSE_ACTION = ACTION_BASE + ".pulse";
-    private static final String NOTIFICATION_PULSE_ACTION = ACTION_BASE + ".notification_pulse";
-    private static final String EXTRA_INSTANCE = "instance";
-
-    /**
-     * Earliest time we pulse due to a notification light after the service started.
-     *
-     * <p>Incoming notification light events during the blackout period are
-     * delayed to the earliest time defined by this constant.</p>
-     *
-     * <p>This delay avoids a pulse immediately after screen off, at which
-     * point the notification light is re-enabled again by NoMan.</p>
-     */
-    private static final int EARLIEST_LIGHT_PULSE_AFTER_START_MS = 10 * 1000;
 
     private final String mTag = String.format(TAG + ".%08x", hashCode());
     private final Context mContext = this;
@@ -80,19 +64,14 @@
     private TriggerSensor mPickupSensor;
     private PowerManager mPowerManager;
     private PowerManager.WakeLock mWakeLock;
-    private AlarmManager mAlarmManager;
     private UiModeManager mUiModeManager;
     private boolean mDreaming;
     private boolean mPulsing;
     private boolean mBroadcastReceiverRegistered;
     private boolean mDisplayStateSupported;
-    private boolean mNotificationLightOn;
     private boolean mPowerSaveActive;
     private boolean mCarMode;
     private long mNotificationPulseTime;
-    private long mLastScheduleResetTime;
-    private long mEarliestPulseDueToLight;
-    private int mScheduleResetsRemaining;
 
     public DozeService() {
         if (DEBUG) Log.d(mTag, "new DozeService()");
@@ -110,11 +89,11 @@
         pw.print("  mSigMotionSensor: "); pw.println(mSigMotionSensor);
         pw.print("  mPickupSensor:"); pw.println(mPickupSensor);
         pw.print("  mDisplayStateSupported: "); pw.println(mDisplayStateSupported);
-        pw.print("  mNotificationLightOn: "); pw.println(mNotificationLightOn);
         pw.print("  mPowerSaveActive: "); pw.println(mPowerSaveActive);
         pw.print("  mCarMode: "); pw.println(mCarMode);
-        pw.print("  mNotificationPulseTime: "); pw.println(mNotificationPulseTime);
-        pw.print("  mScheduleResetsRemaining: "); pw.println(mScheduleResetsRemaining);
+        pw.print("  mNotificationPulseTime: "); pw.println(
+                DozeLog.FORMAT.format(new Date(mNotificationPulseTime
+                        - SystemClock.elapsedRealtime() + System.currentTimeMillis())));
         mDozeParameters.dump(pw);
     }
 
@@ -141,7 +120,6 @@
         mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
         mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
         mWakeLock.setReferenceCounted(true);
-        mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
         mDisplayStateSupported = mDozeParameters.getDisplayStateSupported();
         mUiModeManager = (UiModeManager) mContext.getSystemService(Context.UI_MODE_SERVICE);
         turnDisplayOff();
@@ -176,8 +154,6 @@
         }
 
         mDreaming = true;
-        rescheduleNotificationPulse(false /*predicate*/);  // cancel any pending pulse alarms
-        mEarliestPulseDueToLight = System.currentTimeMillis() + EARLIEST_LIGHT_PULSE_AFTER_START_MS;
         listenForPulseSignals(true);
 
         // Ask the host to get things ready to start dozing.
@@ -316,7 +292,6 @@
     private void listenForBroadcasts(boolean listen) {
         if (listen) {
             final IntentFilter filter = new IntentFilter(PULSE_ACTION);
-            filter.addAction(NOTIFICATION_PULSE_ACTION);
             filter.addAction(UiModeManager.ACTION_ENTER_CAR_MODE);
             mContext.registerReceiver(mBroadcastReceiver, filter);
             mBroadcastReceiverRegistered = true;
@@ -330,93 +305,17 @@
 
     private void listenForNotifications(boolean listen) {
         if (listen) {
-            resetNotificationResets();
             mHost.addCallback(mHostCallback);
-
-            // Continue to pulse for existing LEDs.
-            mNotificationLightOn = mHost.isNotificationLightOn();
-            if (mNotificationLightOn) {
-                updateNotificationPulseDueToLight();
-            }
         } else {
             mHost.removeCallback(mHostCallback);
         }
     }
 
-    private void resetNotificationResets() {
-        if (DEBUG) Log.d(mTag, "resetNotificationResets");
-        mScheduleResetsRemaining = mDozeParameters.getPulseScheduleResets();
-    }
-
-    private void updateNotificationPulseDueToLight() {
-        long timeMs = System.currentTimeMillis();
-        timeMs = Math.max(timeMs, mEarliestPulseDueToLight);
-        updateNotificationPulse(timeMs);
-    }
-
-    private void updateNotificationPulse(long notificationTimeMs) {
-        if (DEBUG) Log.d(mTag, "updateNotificationPulse notificationTimeMs=" + notificationTimeMs);
+    private void requestNotificationPulse() {
+        if (DEBUG) Log.d(mTag, "requestNotificationPulse");
         if (!mDozeParameters.getPulseOnNotifications()) return;
-        if (mScheduleResetsRemaining <= 0) {
-            if (DEBUG) Log.d(mTag, "No more schedule resets remaining");
-            return;
-        }
-        final long pulseDuration = mDozeParameters.getPulseDuration(false /*pickup*/);
-        boolean pulseImmediately = System.currentTimeMillis() >= notificationTimeMs;
-        if ((notificationTimeMs - mLastScheduleResetTime) >= pulseDuration) {
-            mScheduleResetsRemaining--;
-            mLastScheduleResetTime = notificationTimeMs;
-        } else if (!pulseImmediately){
-            if (DEBUG) Log.d(mTag, "Recently updated, not resetting schedule");
-            return;
-        }
-        if (DEBUG) Log.d(mTag, "mScheduleResetsRemaining = " + mScheduleResetsRemaining);
-        mNotificationPulseTime = notificationTimeMs;
-        if (pulseImmediately) {
-            DozeLog.traceNotificationPulse(mContext, 0);
-            requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
-        }
-        // schedule the rest of the pulses
-        rescheduleNotificationPulse(true /*predicate*/);
-    }
-
-    private PendingIntent notificationPulseIntent(long instance) {
-        return PendingIntent.getBroadcast(mContext, 0,
-                new Intent(NOTIFICATION_PULSE_ACTION)
-                        .setPackage(getPackageName())
-                        .putExtra(EXTRA_INSTANCE, instance)
-                        .setFlags(Intent.FLAG_RECEIVER_FOREGROUND),
-                PendingIntent.FLAG_UPDATE_CURRENT);
-    }
-
-    private void rescheduleNotificationPulse(boolean predicate) {
-        if (DEBUG) Log.d(mTag, "rescheduleNotificationPulse predicate=" + predicate);
-        final PendingIntent notificationPulseIntent = notificationPulseIntent(0);
-        mAlarmManager.cancel(notificationPulseIntent);
-        if (!predicate) {
-            if (DEBUG) Log.d(mTag, "  don't reschedule: predicate is false");
-            return;
-        }
-        final PulseSchedule schedule = mDozeParameters.getPulseSchedule();
-        if (schedule == null) {
-            if (DEBUG) Log.d(mTag, "  don't reschedule: schedule is null");
-            return;
-        }
-        final long now = System.currentTimeMillis();
-        final long time = schedule.getNextTime(now, mNotificationPulseTime);
-        if (time <= 0) {
-            if (DEBUG) Log.d(mTag, "  don't reschedule: time is " + time);
-            return;
-        }
-        final long delta = time - now;
-        if (delta <= 0) {
-            if (DEBUG) Log.d(mTag, "  don't reschedule: delta is " + delta);
-            return;
-        }
-        final long instance = time - mNotificationPulseTime;
-        if (DEBUG) Log.d(mTag, "Scheduling pulse " + instance + " in " + delta + "ms for "
-                + new Date(time));
-        mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, time, notificationPulseIntent(instance));
+        mNotificationPulseTime = SystemClock.elapsedRealtime();
+        requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
     }
 
     private static String triggerEventToString(TriggerEvent event) {
@@ -439,13 +338,6 @@
                 if (DEBUG) Log.d(mTag, "Received pulse intent");
                 requestPulse(DozeLog.PULSE_REASON_INTENT);
             }
-            if (NOTIFICATION_PULSE_ACTION.equals(intent.getAction())) {
-                final long instance = intent.getLongExtra(EXTRA_INSTANCE, -1);
-                if (DEBUG) Log.d(mTag, "Received notification pulse intent instance=" + instance);
-                DozeLog.traceNotificationPulse(mContext, instance);
-                requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
-                rescheduleNotificationPulse(mNotificationLightOn);
-            }
             if (UiModeManager.ACTION_ENTER_CAR_MODE.equals(intent.getAction())) {
                 mCarMode = true;
                 if (mCarMode && mDreaming) {
@@ -465,17 +357,13 @@
         @Override
         public void onBuzzBeepBlinked() {
             if (DEBUG) Log.d(mTag, "onBuzzBeepBlinked");
-            updateNotificationPulse(System.currentTimeMillis());
+            requestNotificationPulse();
         }
 
         @Override
         public void onNotificationLight(boolean on) {
-            if (DEBUG) Log.d(mTag, "onNotificationLight on=" + on);
-            if (mNotificationLightOn == on) return;
-            mNotificationLightOn = on;
-            if (mNotificationLightOn) {
-                updateNotificationPulseDueToLight();
-            }
+            if (DEBUG) Log.d(mTag, "onNotificationLight (noop) on=" + on);
+            // noop for now
         }
 
         @Override
@@ -564,17 +452,12 @@
                 requestPulse(mPulseReason, sensorPerformsProxCheck);
                 updateListener();  // reregister, this sensor only fires once
 
-                // reset the notification pulse schedule, but only if we think we were not triggered
-                // by a notification-related vibration
-                final long timeSinceNotification = System.currentTimeMillis()
+                // record pickup gesture, also keep track of whether we might have been triggered
+                // by recent vibration.
+                final long timeSinceNotification = SystemClock.elapsedRealtime()
                         - mNotificationPulseTime;
                 final boolean withinVibrationThreshold =
                         timeSinceNotification < mDozeParameters.getPickupVibrationThreshold();
-                if (withinVibrationThreshold) {
-                   if (DEBUG) Log.d(mTag, "Not resetting schedule, recent notification");
-                } else {
-                    resetNotificationResets();
-                }
                 if (mSensor.getType() == Sensor.TYPE_PICK_UP_GESTURE) {
                     DozeLog.tracePickupPulse(mContext, withinVibrationThreshold);
                 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
index 681005c..28da69c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
@@ -65,6 +65,9 @@
     private static final int MAX_BIND_RETRIES = 5;
     private static final int BIND_RETRY_DELAY = 1000;
 
+    // Shared prefs that hold tile lifecycle info.
+    private static final String TILES = "tiles_prefs";
+
     private final Context mContext;
     private final Handler mHandler;
     private final Intent mIntent;
@@ -406,4 +409,13 @@
     public interface TileChangeListener {
         void onTileChanged(ComponentName tile);
     }
+
+    public static boolean isTileAdded(Context context, ComponentName component) {
+        return context.getSharedPreferences(TILES, 0).getBoolean(component.flattenToString(), false);
+    }
+
+    public static void setTileAdded(Context context, ComponentName component, boolean added) {
+        context.getSharedPreferences(TILES, 0).edit().putBoolean(component.flattenToString(),
+                added).commit();
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
index f3e4d60..8493cc6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
@@ -88,8 +88,14 @@
         IntentFilter filter = new IntentFilter();
         filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
         filter.addDataScheme("package");
-        mServices.getContext().registerReceiverAsUser(mUninstallReceiver,
+        Context context = mServices.getContext();
+        context.registerReceiverAsUser(mUninstallReceiver,
                 new UserHandle(ActivityManager.getCurrentUser()), filter, null, mHandler);
+        ComponentName component = tileLifecycleManager.getComponent();
+        if (!TileLifecycleManager.isTileAdded(context, component)) {
+            TileLifecycleManager.setTileAdded(context, component, true);
+            mStateManager.onTileAdded();
+        }
     }
 
     public void setTileChangeListener(TileChangeListener changeListener) {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/IRecentsNonSystemUserCallbacks.aidl b/packages/SystemUI/src/com/android/systemui/recents/IRecentsNonSystemUserCallbacks.aidl
index 9403664..9214eef 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/IRecentsNonSystemUserCallbacks.aidl
+++ b/packages/SystemUI/src/com/android/systemui/recents/IRecentsNonSystemUserCallbacks.aidl
@@ -35,4 +35,5 @@
             in Rect initialBounds);
     void onDraggingInRecents(float distanceFromTop);
     void onDraggingInRecentsEnded(float velocity);
+    void showCurrentUserToast(int msgResId, int msgLength);
 }
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
index e117bfe..7207463 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
@@ -18,10 +18,12 @@
 
 import android.app.ActivityManager;
 import android.app.UiModeManager;
+import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.ServiceConnection;
 import android.content.pm.ActivityInfo;
 import android.content.res.Configuration;
@@ -53,6 +55,7 @@
 import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent;
 import com.android.systemui.recents.events.component.RecentsVisibilityChangedEvent;
 import com.android.systemui.recents.events.component.ScreenPinningRequestEvent;
+import com.android.systemui.recents.events.component.ShowUserToastEvent;
 import com.android.systemui.recents.events.ui.RecentsDrawnEvent;
 import com.android.systemui.recents.misc.SystemServicesProxy;
 import com.android.systemui.recents.model.RecentsTaskLoader;
@@ -96,7 +99,7 @@
     // and does not reside in the home stack.
     private String mOverrideRecentsPackageName;
 
-    private Handler mHandler;
+    private Handler mHandler = new Handler();
     private RecentsImpl mImpl;
     private int mDraggingInRecentsCurrentUser;
 
@@ -162,6 +165,20 @@
         }
     };
 
+
+    private BroadcastReceiver mSystemUserUnlockedReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (Intent.ACTION_USER_UNLOCKED.equals(intent.getAction())) {
+                int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);
+                if (userId != UserHandle.USER_NULL) {
+                    mImpl.onUserUnlocked(userId);
+                }
+            }
+        }
+    };
+
+
     /**
      * Returns the callbacks interface that non-system users can call.
      */
@@ -191,7 +208,7 @@
         sSystemServicesProxy = SystemServicesProxy.getInstance(mContext);
         sTaskLoader = new RecentsTaskLoader(mContext);
         sConfiguration = new RecentsConfiguration(mContext);
-        mHandler = new Handler();
+
         UiModeManager uiModeManager = (UiModeManager) mContext.
                 getSystemService(Context.UI_MODE_SERVICE);
         if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) {
@@ -221,6 +238,12 @@
             // For the system user, initialize an instance of the interface that we can pass to the
             // secondary user
             mSystemToUserCallbacks = new RecentsSystemUser(mContext, mImpl);
+
+            // Listen for user-unlocked to kick off preloading recents
+            IntentFilter filter = new IntentFilter();
+            filter.addAction(Intent.ACTION_USER_UNLOCKED);
+            mContext.registerReceiverAsUser(mSystemUserUnlockedReceiver, UserHandle.SYSTEM, filter,
+                    null /* permission */, null /* scheduler */);
         } else {
             // For the secondary user, bind to the primary user's service to get a persistent
             // interface to register its implementation and to later update its state
@@ -455,8 +478,8 @@
                 mDraggingInRecentsCurrentUser = currentUser;
                 return true;
             } else {
-                Toast.makeText(mContext, R.string.recents_incompatible_app_message,
-                        Toast.LENGTH_SHORT).show();
+                EventBus.getDefault().send(new ShowUserToastEvent(
+                        R.string.recents_incompatible_app_message, Toast.LENGTH_SHORT));
                 return false;
             }
         } else {
@@ -674,6 +697,27 @@
         mImpl.onConfigurationChanged();
     }
 
+    public final void onBusEvent(ShowUserToastEvent event) {
+        int currentUser = sSystemServicesProxy.getCurrentUser();
+        if (sSystemServicesProxy.isSystemUser(currentUser)) {
+            mImpl.onShowCurrentUserToast(event.msgResId, event.msgLength);
+        } else {
+            if (mSystemToUserCallbacks != null) {
+                IRecentsNonSystemUserCallbacks callbacks =
+                        mSystemToUserCallbacks.getNonSystemUserRecentsForUser(currentUser);
+                if (callbacks != null) {
+                    try {
+                        callbacks.showCurrentUserToast(event.msgResId, event.msgLength);
+                    } catch (RemoteException e) {
+                        Log.e(TAG, "Callback failed", e);
+                    }
+                } else {
+                    Log.e(TAG, "No SystemUI callbacks found for user: " + currentUser);
+                }
+            }
+        }
+    }
+
     /**
      * Attempts to register with the system user.
      */
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
index 2757fc4..a7f2716 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
@@ -40,6 +40,7 @@
 import android.view.ViewConfiguration;
 import android.view.WindowManager;
 
+import android.widget.Toast;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.policy.DockedDividerUtils;
 import com.android.systemui.R;
@@ -186,7 +187,7 @@
         reloadResources();
     }
 
-    public void onBootCompleted() {
+    public void onUserUnlocked(int userId) {
         // When we start, preload the data associated with the previous recent tasks.
         // We can use a new plan since the caches will be the same.
         RecentsTaskLoader loader = Recents.getTaskLoader();
@@ -199,6 +200,10 @@
         loader.loadTasks(mContext, plan, launchOpts);
     }
 
+    public void onBootCompleted() {
+        // Do nothing
+    }
+
     public void onConfigurationChanged() {
         reloadResources();
         mDummyStackView.reloadOnConfigurationChange();
@@ -392,6 +397,10 @@
         EventBus.getDefault().sendOntoMainThread(new DraggingInRecentsEndedEvent(velocity));
     }
 
+    public void onShowCurrentUserToast(int msgResId, int msgLength) {
+        Toast.makeText(mContext, msgResId, msgLength).show();
+    }
+
     /**
      * Transitions to the next recent task in the stack.
      */
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImplProxy.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImplProxy.java
index 60bf760..ff9e89e9 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImplProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImplProxy.java
@@ -38,6 +38,7 @@
     private static final int MSG_DOCK_TOP_TASK = 7;
     private static final int MSG_ON_DRAGGING_IN_RECENTS = 8;
     private static final int MSG_ON_DRAGGING_IN_RECENTS_ENDED = 9;
+    private static final int MSG_SHOW_USER_TOAST = 10;
 
     private RecentsImpl mImpl;
 
@@ -109,6 +110,11 @@
         mHandler.sendMessage(mHandler.obtainMessage(MSG_ON_DRAGGING_IN_RECENTS_ENDED, velocity));
     }
 
+    @Override
+    public void showCurrentUserToast(int msgResId, int msgLength) {
+        mHandler.sendMessage(mHandler.obtainMessage(MSG_SHOW_USER_TOAST, msgResId, msgLength));
+    }
+
     private final Handler mHandler = new Handler() {
 
         @Override
@@ -147,6 +153,9 @@
                 case MSG_ON_DRAGGING_IN_RECENTS_ENDED:
                     mImpl.onDraggingInRecentsEnded((Float) msg.obj);
                     break;
+                case MSG_SHOW_USER_TOAST:
+                    mImpl.onShowCurrentUserToast(msg.arg1, msg.arg2);
+                    break;
                 default:
                     super.handleMessage(msg);
             }
diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/component/ShowUserToastEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/component/ShowUserToastEvent.java
new file mode 100644
index 0000000..e2b39c3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recents/events/component/ShowUserToastEvent.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2016 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 com.android.systemui.recents.events.component;
+
+import com.android.systemui.recents.events.EventBus;
+
+/**
+ * This is sent when we want to show a toast for the current user.
+ */
+public class ShowUserToastEvent extends EventBus.Event {
+
+    public final int msgResId;
+    public final int msgLength;
+
+    public ShowUserToastEvent(int msgResId, int msgLength) {
+        this.msgResId = msgResId;
+        this.msgLength = msgLength;
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java
index 702b076..fce7f9d 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java
@@ -1258,7 +1258,7 @@
         String innerPrefix = prefix + "  ";
 
         writer.print(prefix); writer.print(TAG);
-        writer.write(" numStackTasks="); writer.write(mNumStackTasks);
+        writer.write(" numStackTasks="); writer.print(mNumStackTasks);
         writer.println();
 
         writer.print(innerPrefix);
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java b/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java
index 5f083d5..5920f46 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java
@@ -20,12 +20,14 @@
 import android.content.Context;
 import android.content.Intent;
 import android.os.Handler;
+import android.os.UserHandle;
 import android.util.ArraySet;
 import android.widget.Toast;
 
 import com.android.systemui.R;
 import com.android.systemui.recents.events.EventBus;
 import com.android.systemui.recents.events.activity.AppTransitionFinishedEvent;
+import com.android.systemui.recents.events.component.ShowUserToastEvent;
 import com.android.systemui.recents.misc.SystemServicesProxy;
 import com.android.systemui.recents.misc.SystemServicesProxy.TaskStackListener;
 import com.android.systemui.stackdivider.events.StartedDragingEvent;
@@ -100,9 +102,8 @@
     }
 
     private void activityDismissingDockedStack() {
-        Toast toast = Toast.makeText(mContext, R.string.dock_non_resizeble_failed_to_dock_text,
-                Toast.LENGTH_SHORT);
-        toast.show();
+        EventBus.getDefault().send(new ShowUserToastEvent(
+                R.string.dock_non_resizeble_failed_to_dock_text, Toast.LENGTH_SHORT));
     }
 
     private void showPending() {
@@ -112,7 +113,7 @@
             ActivityOptions options = ActivityOptions.makeBasic();
             options.setLaunchTaskId(mPendingTaskIds.valueAt(i));
             options.setTaskOverlay(true);
-            mContext.startActivity(intent, options.toBundle());
+            mContext.startActivityAsUser(intent, options.toBundle(), UserHandle.CURRENT);
         }
         mPendingTaskIds.clear();
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 02fdd3f..68de16b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -507,7 +507,7 @@
         int intrinsicHeight = getIntrinsicHeight();
         mIsPinned = pinned;
         if (intrinsicHeight != getIntrinsicHeight()) {
-            notifyHeightChanged(false);
+            notifyHeightChanged(false /* needsAnimation */);
         }
         if (pinned) {
             setIconAnimationRunning(true);
@@ -840,8 +840,6 @@
     }
 
     public void resetHeight() {
-        mMaxExpandHeight = 0;
-        mHeadsUpHeight = 0;
         onHeightReset();
         requestLayout();
     }
@@ -1290,7 +1288,7 @@
         }
         mHeadsUpHeight = headsUpChild.getHeight();
         if (intrinsicBefore != getIntrinsicHeight()) {
-            notifyHeightChanged(false  /* needsAnimation */);
+            notifyHeightChanged(true  /* needsAnimation */);
         }
     }
 
@@ -1398,7 +1396,7 @@
         if (isChildInGroup()) {
             mGroupManager.setGroupExpanded(mStatusBarNotification, true);
         }
-        notifyHeightChanged(false);
+        notifyHeightChanged(false /* needsAnimation */);
     }
 
     public void setChildrenExpanded(boolean expanded, boolean animate) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
index 9b3ed33..efceed1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
@@ -38,8 +38,6 @@
 
     private final Context mContext;
 
-    private static PulseSchedule sPulseSchedule;
-
     private static IntInOutMatcher sPickupSubtypePerformsProxMatcher;
 
     public DozeParameters(Context context) {
@@ -61,8 +59,6 @@
         pw.print("    getVibrateOnPickup(): "); pw.println(getVibrateOnPickup());
         pw.print("    getProxCheckBeforePulse(): "); pw.println(getProxCheckBeforePulse());
         pw.print("    getPulseOnNotifications(): "); pw.println(getPulseOnNotifications());
-        pw.print("    getPulseSchedule(): "); pw.println(getPulseSchedule());
-        pw.print("    getPulseScheduleResets(): "); pw.println(getPulseScheduleResets());
         pw.print("    getPickupVibrationThreshold(): "); pw.println(getPickupVibrationThreshold());
         pw.print("    getPickupSubtypePerformsProxCheck(): ");pw.println(
                 dumpPickupSubtypePerformsProxCheck());
@@ -126,18 +122,6 @@
         return getBoolean("doze.pulse.notifications", R.bool.doze_pulse_on_notifications);
     }
 
-    public PulseSchedule getPulseSchedule() {
-        final String spec = getString("doze.pulse.schedule", R.string.doze_pulse_schedule);
-        if (sPulseSchedule == null || !sPulseSchedule.mSpec.equals(spec)) {
-            sPulseSchedule = PulseSchedule.parse(spec);
-        }
-        return sPulseSchedule;
-    }
-
-    public int getPulseScheduleResets() {
-        return getInt("doze.pulse.schedule.resets", R.integer.doze_pulse_schedule_resets);
-    }
-
     public int getPickupVibrationThreshold() {
         return getInt("doze.pickup.vibration.threshold", R.integer.doze_pickup_vibration_threshold);
     }
@@ -249,44 +233,4 @@
             return (mIsIn.get(value, mDefaultIsIn));
         }
     }
-
-    public static class PulseSchedule {
-        private static final Pattern PATTERN = Pattern.compile("(\\d+?)s", 0);
-
-        private String mSpec;
-        private int[] mSchedule;
-
-        public static PulseSchedule parse(String spec) {
-            if (TextUtils.isEmpty(spec)) return null;
-            try {
-                final PulseSchedule rt = new PulseSchedule();
-                rt.mSpec = spec;
-                final String[] tokens = spec.split(",");
-                rt.mSchedule = new int[tokens.length];
-                for (int i = 0; i < tokens.length; i++) {
-                    final Matcher m = PATTERN.matcher(tokens[i]);
-                    if (!m.matches()) throw new IllegalArgumentException("Bad token: " + tokens[i]);
-                    rt.mSchedule[i] = Integer.parseInt(m.group(1));
-                }
-                if (DEBUG) Log.d(TAG, "Parsed spec [" + spec + "] as: " + rt);
-                return rt;
-            } catch (RuntimeException e) {
-                Log.w(TAG, "Error parsing spec: " + spec, e);
-                return null;
-            }
-        }
-
-        @Override
-        public String toString() {
-            return Arrays.toString(mSchedule);
-        }
-
-        public long getNextTime(long now, long notificationTime) {
-            for (int i = 0; i < mSchedule.length; i++) {
-                final long time = notificationTime + mSchedule[i] * 1000;
-                if (time > now) return time;
-            }
-            return 0;
-        }
-    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightStatusBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightStatusBarController.java
index f98b9e5..df4566b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightStatusBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightStatusBarController.java
@@ -27,7 +27,7 @@
 /**
  * Controls how light status bar flag applies to the icons.
  */
-public class LightStatusBarController {
+public class LightStatusBarController implements BatteryController.BatteryStateChangeCallback {
 
     private final StatusBarIconController mIconController;
     private final BatteryController mBatteryController;
@@ -37,6 +37,7 @@
     private int mDockedStackVisibility;
     private boolean mFullscreenLight;
     private boolean mDockedLight;
+    private int mLastStatusBarMode;
 
     private final Rect mLastFullscreenBounds = new Rect();
     private final Rect mLastDockedBounds = new Rect();
@@ -45,6 +46,7 @@
             BatteryController batteryController) {
         mIconController = iconController;
         mBatteryController = batteryController;
+        batteryController.addStateChangedCallback(this);
     }
 
     public void setFingerprintUnlockController(
@@ -73,6 +75,7 @@
         }
         mFullscreenStackVisibility = newFullscreen;
         mDockedStackVisibility = newDocked;
+        mLastStatusBarMode = statusBarMode;
         mLastFullscreenBounds.set(fullscreenStackBounds);
         mLastDockedBounds.set(dockedStackBounds);
     }
@@ -123,4 +126,16 @@
             mIconController.setIconsDark(true, animateChange());
         }
     }
+
+    @Override
+    public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
+
+    }
+
+    @Override
+    public void onPowerSaveChanged(boolean isPowerSave) {
+        onSystemUiVisibilityChanged(mFullscreenStackVisibility, mDockedStackVisibility,
+                0 /* mask */, mLastFullscreenBounds, mLastDockedBounds, true /* sbModeChange*/,
+                mLastStatusBarMode);
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 64c082b..96fb7a8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -1610,7 +1610,8 @@
         }
         Entry entry = mNotificationData.get(key);
 
-        if (entry != null && mRemoteInputController.isRemoteInputActive(entry)) {
+        if (entry != null && mRemoteInputController.isRemoteInputActive(entry)
+                && (entry.row != null && !entry.row.isDismissed())) {
             mLatestRankingMap = ranking;
             mRemoteInputEntriesToRemoveOnCollapse.add(entry);
             return;
@@ -2535,6 +2536,7 @@
                             mStatusBarWindowManager.setHeadsUpShowing(false);
                             mHeadsUpManager.setHeadsUpGoingAway(false);
                         }
+                        removeRemoteInputEntriesKeptUntilCollapsed();
                     }
                 });
             }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
index 10facea..da698d8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
@@ -86,7 +86,7 @@
     private static final String TAG = "QSTileHost";
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
-    public static final String TILES_SETTING = "sysui_qs_tiles";
+    public static final String TILES_SETTING = Secure.QS_TILES;
 
     private final Context mContext;
     private final PhoneStatusBar mStatusBar;
@@ -407,19 +407,7 @@
                         new UserHandle(ActivityManager.getCurrentUser()));
                 lifecycleManager.onStopListening();
                 lifecycleManager.onTileRemoved();
-                lifecycleManager.flushMessagesAndUnbind();
-            }
-        }
-        for (int i = 0; i < NA; i++) {
-            String tileSpec = newTiles.get(i);
-            if (!tileSpec.startsWith(CustomTile.PREFIX)) continue;
-            if (!previousTiles.contains(tileSpec)) {
-                ComponentName component = CustomTile.getComponentFromSpec(tileSpec);
-                Intent intent = new Intent().setComponent(component);
-                TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(),
-                        mContext, mServices, new Tile(), intent,
-                        new UserHandle(ActivityManager.getCurrentUser()));
-                lifecycleManager.onTileAdded();
+                TileLifecycleManager.setTileAdded(mContext, component, false);
                 lifecycleManager.flushMessagesAndUnbind();
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
index 61bac2d..e6066aa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
@@ -59,6 +59,7 @@
     private AudioManager mAudioManager;
     private boolean mGestureAborted;
     private boolean mLongClicked;
+    private OnClickListener mOnClickListener;
 
     private final Runnable mCheckLongPress = new Runnable() {
         public void run() {
@@ -109,6 +110,12 @@
         mCode = code;
     }
 
+    @Override
+    public void setOnClickListener(OnClickListener onClickListener) {
+        super.setOnClickListener(onClickListener);
+        mOnClickListener = onClickListener;
+    }
+
     public void loadAsync(String uri) {
         new AsyncTask<String, Void, Drawable>() {
             @Override
@@ -190,6 +197,7 @@
                     // Provide the same haptic feedback that the system offers for virtual keys.
                     performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
                 }
+                playSoundEffect(SoundEffectConstants.CLICK);
                 removeCallbacks(mCheckLongPress);
                 postDelayed(mCheckLongPress, ViewConfiguration.getLongPressTimeout());
                 break;
@@ -215,14 +223,14 @@
                     if (doIt) {
                         sendEvent(KeyEvent.ACTION_UP, 0);
                         sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
-                        playSoundEffect(SoundEffectConstants.CLICK);
                     } else {
                         sendEvent(KeyEvent.ACTION_UP, KeyEvent.FLAG_CANCELED);
                     }
                 } else {
                     // no key code, just a regular ImageView
-                    if (doIt) {
-                        performClick();
+                    if (doIt && mOnClickListener != null) {
+                        mOnClickListener.onClick(this);
+                        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
                     }
                 }
                 removeCallbacks(mCheckLongPress);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
index 29577ef..cdd452f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
@@ -348,7 +348,7 @@
     }
 
     public boolean isActive() {
-        return mEditText.isFocused();
+        return mEditText.isFocused() && mEditText.isEnabled();
     }
 
     public void stealFocusFrom(RemoteInputView other) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index c8c4310..d1de38c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -216,7 +216,6 @@
     private float mTopPaddingOverflow;
     private boolean mDontReportNextOverScroll;
     private boolean mDontClampNextScroll;
-    private boolean mRequestViewResizeAnimationOnLayout;
     private boolean mNeedViewResizeAnimation;
     private View mExpandedGroupView;
     private boolean mEverythingNeedsAnimation;
@@ -518,10 +517,6 @@
         setMaxLayoutHeight(getHeight());
         updateContentHeight();
         clampScrollPosition();
-        if (mRequestViewResizeAnimationOnLayout) {
-            requestAnimationOnViewResize(null);
-            mRequestViewResizeAnimationOnLayout = false;
-        }
         requestChildrenUpdate();
         updateFirstAndLastBackgroundViews();
     }
@@ -1966,9 +1961,9 @@
     }
 
     private void applyCurrentBackgroundBounds() {
-        if (!mFadingOut) {
-            mScrimController.setExcludedBackgroundArea(mCurrentBounds);
-        }
+        mScrimController.setExcludedBackgroundArea(
+                mFadingOut || mParentFadingOut || mAmbientState.isDark() ? null
+                        : mCurrentBounds);
         invalidate();
     }
 
@@ -3104,9 +3099,6 @@
 
     @Override
     public void onReset(ExpandableView view) {
-        if (mIsExpanded && mAnimationsEnabled) {
-            mRequestViewResizeAnimationOnLayout = true;
-        }
         updateAnimationState(view);
         updateChronometerForChild(view);
     }
@@ -3847,11 +3839,7 @@
     }
 
     private void updateFadingState() {
-        if (mFadingOut || mParentFadingOut || mAmbientState.isDark()) {
-            mScrimController.setExcludedBackgroundArea(null);
-        } else {
-            applyCurrentBackgroundBounds();
-        }
+        applyCurrentBackgroundBounds();
         updateSrcDrawing();
     }
 
diff --git a/packages/SystemUI/tests/Android.mk b/packages/SystemUI/tests/Android.mk
index c9c5805..188f8bf 100644
--- a/packages/SystemUI/tests/Android.mk
+++ b/packages/SystemUI/tests/Android.mk
@@ -58,6 +58,9 @@
 # UI it doesn't own. This is necessary to allow screenshots to be taken
 LOCAL_CERTIFICATE := platform
 
+LOCAL_JACK_COVERAGE_INCLUDE_FILTER := com.android.systemui.*
+LOCAL_JACK_COVERAGE_EXCLUDE_FILTER := com.android.systemui.tests.*
+
 include frameworks/base/packages/SettingsLib/common.mk
 
 include $(BUILD_PACKAGE)
diff --git a/packages/VpnDialogs/res/values-ro/strings.xml b/packages/VpnDialogs/res/values-ro/strings.xml
index 4865e96..e2e1e44 100644
--- a/packages/VpnDialogs/res/values-ro/strings.xml
+++ b/packages/VpnDialogs/res/values-ro/strings.xml
@@ -25,5 +25,5 @@
     <string name="duration" msgid="3584782459928719435">"Durată:"</string>
     <string name="data_transmitted" msgid="7988167672982199061">"Trimise:"</string>
     <string name="data_received" msgid="4062776929376067820">"Primite:"</string>
-    <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> (de) octeți/<xliff:g id="NUMBER_1">%2$s</xliff:g> (de) pachete"</string>
+    <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g>   octeți/<xliff:g id="NUMBER_1">%2$s</xliff:g>   pachete"</string>
 </resources>
diff --git a/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java b/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java
index 242eca8..3a82f88 100644
--- a/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java
+++ b/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java
@@ -19,17 +19,22 @@
 import static android.app.WallpaperManager.FLAG_LOCK;
 import static android.app.WallpaperManager.FLAG_SYSTEM;
 
+import android.app.AppGlobals;
 import android.app.WallpaperManager;
 import android.app.backup.BackupAgent;
 import android.app.backup.BackupDataInput;
 import android.app.backup.BackupDataOutput;
 import android.app.backup.FullBackupDataOutput;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageInfo;
 import android.graphics.Rect;
 import android.os.Environment;
 import android.os.FileUtils;
 import android.os.ParcelFileDescriptor;
+import android.os.RemoteException;
 import android.os.UserHandle;
 import android.util.Slog;
 import android.util.Xml;
@@ -217,6 +222,19 @@
             // wallpaper image present.
             restoreFromStage(imageStage, infoStage, "wp", sysWhich);
             restoreFromStage(lockImageStage, infoStage, "kwp", FLAG_LOCK);
+
+            // And reset to the wallpaper service we should be using
+            ComponentName wpService = parseWallpaperComponent(infoStage, "wp");
+            if (servicePackageExists(wpService)) {
+                if (DEBUG) {
+                    Slog.i(TAG, "Using wallpaper service " + wpService);
+                }
+                mWm.setWallpaperComponent(wpService, UserHandle.USER_SYSTEM);
+            } else {
+                if (DEBUG) {
+                    Slog.v(TAG, "Can't use wallpaper service " + wpService);
+                }
+            }
         } catch (Exception e) {
             Slog.e(TAG, "Unable to restore wallpaper: " + e.getMessage());
         } finally {
@@ -274,18 +292,60 @@
             } while (type != XmlPullParser.END_DOCUMENT);
         } catch (Exception e) {
             // Whoops; can't process the info file at all.  Report failure.
-            Slog.w(TAG, "Failed to parse restored metadata: " + e.getMessage());
+            Slog.w(TAG, "Failed to parse restored crop: " + e.getMessage());
             return null;
         }
 
         return cropHint;
     }
 
+    private ComponentName parseWallpaperComponent(File wallpaperInfo, String sectionTag) {
+        ComponentName name = null;
+        try (FileInputStream stream = new FileInputStream(wallpaperInfo)) {
+            final XmlPullParser parser = Xml.newPullParser();
+            parser.setInput(stream, StandardCharsets.UTF_8.name());
+
+            int type;
+            do {
+                type = parser.next();
+                if (type == XmlPullParser.START_TAG) {
+                    String tag = parser.getName();
+                    if (sectionTag.equals(tag)) {
+                        final String parsedName = parser.getAttributeValue(null, "component");
+                        name = (parsedName != null)
+                                ? ComponentName.unflattenFromString(parsedName)
+                                : null;
+                        break;
+                    }
+                }
+            } while (type != XmlPullParser.END_DOCUMENT);
+        } catch (Exception e) {
+            // Whoops; can't process the info file at all.  Report failure.
+            Slog.w(TAG, "Failed to parse restored component: " + e.getMessage());
+            return null;
+        }
+        return name;
+    }
+
     private int getAttributeInt(XmlPullParser parser, String name, int defValue) {
         final String value = parser.getAttributeValue(null, name);
         return (value == null) ? defValue : Integer.parseInt(value);
     }
 
+    private boolean servicePackageExists(ComponentName comp) {
+        try {
+            if (comp != null) {
+                final IPackageManager pm = AppGlobals.getPackageManager();
+                final PackageInfo info = pm.getPackageInfo(comp.getPackageName(),
+                        0, UserHandle.USER_SYSTEM);
+                return (info != null);
+            }
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Unable to contact package manager");
+        }
+        return false;
+    }
+
     //
     // Key/value API: abstract, therefore required; but not used
     //
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 5099db7..8a0dfe5 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -2207,7 +2207,12 @@
     // CATEGORY: SETTINGS
     ACTION_AMBIENT_DISPLAY = 495;
 
+    // ACTION: Settings -> [sub settings activity] -> Options menu -> Help & Support
+    //   SUBTYPE: sub settings classname
+    ACTION_SETTING_HELP_AND_FEEDBACK = 496;
+
     // ---- End N-MR1 Constants, all N-MR1 constants go above this line ----
+
     // Add new aosp constants above this line.
     // END OF AOSP CONSTANTS
   }
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 695ea60..8dca14f 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -2208,6 +2208,8 @@
 
         AccessibilityServiceInfo mAccessibilityServiceInfo;
 
+        // The service that's bound to this instance. Whenever this value is non-null, this
+        // object is registered as a death recipient
         IBinder mService;
 
         IAccessibilityServiceClient mServiceInterface;
@@ -2342,14 +2344,14 @@
                 }
             } else {
                 userState.mBindingServices.add(mComponentName);
-                mService = userState.mUiAutomationServiceClient.asBinder();
                 mMainHandler.post(new Runnable() {
                     @Override
                     public void run() {
                         // Simulate asynchronous connection since in onServiceConnected
                         // we may modify the state data in case of an error but bind is
                         // called while iterating over the data and bad things can happen.
-                        onServiceConnected(mComponentName, mService);
+                        onServiceConnected(mComponentName,
+                                userState.mUiAutomationServiceClient.asBinder());
                     }
                 });
                 userState.mUiAutomationService = this;
@@ -2441,7 +2443,19 @@
         @Override
         public void onServiceConnected(ComponentName componentName, IBinder service) {
             synchronized (mLock) {
-                mService = service;
+                if (mService != service) {
+                    if (mService != null) {
+                        mService.unlinkToDeath(this, 0);
+                    }
+                    mService = service;
+                    try {
+                        mService.linkToDeath(this, 0);
+                    } catch (RemoteException re) {
+                        Slog.e(LOG_TAG, "Failed registering death link");
+                        binderDied();
+                        return;
+                    }
+                }
                 mServiceInterface = IAccessibilityServiceClient.Stub.asInterface(service);
                 UserState userState = getUserStateLocked(mUserId);
                 addServiceLocked(this, userState);
@@ -3075,7 +3089,6 @@
         }
 
         public void onAdded() throws RemoteException {
-            linkToOwnDeathLocked();
             final long identity = Binder.clearCallingIdentity();
             try {
                 mWindowManagerService.addWindowToken(mOverlayWindowToken,
@@ -3092,17 +3105,6 @@
             } finally {
                 Binder.restoreCallingIdentity(identity);
             }
-            unlinkToOwnDeathLocked();
-        }
-
-        public void linkToOwnDeathLocked() throws RemoteException {
-            mService.linkToDeath(this, 0);
-        }
-
-        public void unlinkToOwnDeathLocked() {
-            if (mService != null) {
-                mService.unlinkToDeath(this, 0);
-            }
         }
 
         public void resetLocked() {
@@ -3115,7 +3117,10 @@
             } catch (RemoteException re) {
                 /* ignore */
             }
-            mService = null;
+            if (mService != null) {
+                mService.unlinkToDeath(this, 0);
+                mService = null;
+            }
             mServiceInterface = null;
         }
 
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index 9d3889b..b5fcb5c 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -2266,6 +2266,7 @@
         pw.print(info.updatePeriodMillis);
         pw.print(" resizeMode=");
         pw.print(info.resizeMode);
+        pw.print(" widgetCategory=");
         pw.print(info.widgetCategory);
         pw.print(" autoAdvanceViewId=");
         pw.print(info.autoAdvanceViewId);
diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java
index b5b0cd8..4caeba8 100644
--- a/services/core/java/com/android/server/AppOpsService.java
+++ b/services/core/java/com/android/server/AppOpsService.java
@@ -875,7 +875,7 @@
             return AppOpsManager.MODE_IGNORED;
         }
         synchronized (this) {
-            if (isOpRestricted(uid, code, resolvedPackageName)) {
+            if (isOpRestrictedLocked(uid, code, resolvedPackageName)) {
                 return AppOpsManager.MODE_IGNORED;
             }
             code = AppOpsManager.opToSwitch(code);
@@ -1024,7 +1024,7 @@
                 return AppOpsManager.MODE_ERRORED;
             }
             Op op = getOpLocked(ops, code, true);
-            if (isOpRestricted(uid, code, packageName)) {
+            if (isOpRestrictedLocked(uid, code, packageName)) {
                 return AppOpsManager.MODE_IGNORED;
             }
             if (op.duration == -1) {
@@ -1082,7 +1082,7 @@
                 return AppOpsManager.MODE_ERRORED;
             }
             Op op = getOpLocked(ops, code, true);
-            if (isOpRestricted(uid, code, resolvedPackageName)) {
+            if (isOpRestrictedLocked(uid, code, resolvedPackageName)) {
                 return AppOpsManager.MODE_IGNORED;
             }
             final int switchCode = AppOpsManager.opToSwitch(code);
@@ -1308,7 +1308,7 @@
         return op;
     }
 
-    private boolean isOpRestricted(int uid, int code, String packageName) {
+    private boolean isOpRestrictedLocked(int uid, int code, String packageName) {
         int userHandle = UserHandle.getUserId(uid);
         final int restrictionSetCount = mOpUserRestrictions.size();
 
@@ -2210,25 +2210,33 @@
 
     private void setUserRestrictionNoCheck(int code, boolean restricted, IBinder token,
             int userHandle, String[] exceptionPackages) {
-        ClientRestrictionState restrictionState = mOpUserRestrictions.get(token);
+        boolean notifyChange = false;
 
-        if (restrictionState == null) {
-            try {
-                restrictionState = new ClientRestrictionState(token);
-            } catch (RemoteException e) {
-                return;
+        synchronized (AppOpsService.this) {
+            ClientRestrictionState restrictionState = mOpUserRestrictions.get(token);
+
+            if (restrictionState == null) {
+                try {
+                    restrictionState = new ClientRestrictionState(token);
+                } catch (RemoteException e) {
+                    return;
+                }
+                mOpUserRestrictions.put(token, restrictionState);
             }
-            mOpUserRestrictions.put(token, restrictionState);
+
+            if (restrictionState.setRestriction(code, restricted, exceptionPackages, userHandle)) {
+                notifyChange = true;
+            }
+
+            if (restrictionState.isDefault()) {
+                mOpUserRestrictions.remove(token);
+                restrictionState.destroy();
+            }
         }
 
-        if (restrictionState.setRestriction(code, restricted, exceptionPackages, userHandle)) {
+        if (notifyChange) {
             notifyWatchersOfChange(code);
         }
-
-        if (restrictionState.isDefault()) {
-            mOpUserRestrictions.remove(token);
-            restrictionState.destroy();
-        }
     }
 
     private void notifyWatchersOfChange(int code) {
@@ -2263,10 +2271,12 @@
     @Override
     public void removeUser(int userHandle) throws RemoteException {
         checkSystemUid("removeUser");
-        final int tokenCount = mOpUserRestrictions.size();
-        for (int i = tokenCount - 1; i >= 0; i--) {
-            ClientRestrictionState opRestrictions = mOpUserRestrictions.valueAt(i);
-            opRestrictions.removeUser(userHandle);
+        synchronized (AppOpsService.this) {
+            final int tokenCount = mOpUserRestrictions.size();
+            for (int i = tokenCount - 1; i >= 0; i--) {
+                ClientRestrictionState opRestrictions = mOpUserRestrictions.valueAt(i);
+                opRestrictions.removeUser(userHandle);
+            }
         }
     }
 
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index b7461ee..14243c5 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -38,7 +38,6 @@
 
 import android.annotation.Nullable;
 import android.app.BroadcastOptions;
-import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
@@ -132,9 +131,12 @@
 import com.android.server.connectivity.DataConnectionStats;
 import com.android.server.connectivity.KeepaliveTracker;
 import com.android.server.connectivity.Nat464Xlat;
+import com.android.server.connectivity.LingerMonitor;
 import com.android.server.connectivity.NetworkAgentInfo;
 import com.android.server.connectivity.NetworkDiagnostics;
 import com.android.server.connectivity.NetworkMonitor;
+import com.android.server.connectivity.NetworkNotificationManager;
+import com.android.server.connectivity.NetworkNotificationManager.NotificationType;
 import com.android.server.connectivity.PacManager;
 import com.android.server.connectivity.PermissionMonitor;
 import com.android.server.connectivity.Tethering;
@@ -436,6 +438,8 @@
     TelephonyManager mTelephonyManager;
 
     private KeepaliveTracker mKeepaliveTracker;
+    private NetworkNotificationManager mNotifier;
+    private LingerMonitor mLingerMonitor;
 
     // sequence number for Networks; keep in sync with system/netd/NetworkController.cpp
     private final static int MIN_NET_ID = 100; // some reserved marks
@@ -832,6 +836,9 @@
         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
 
         mKeepaliveTracker = new KeepaliveTracker(mHandler);
+        mNotifier = new NetworkNotificationManager(mContext, mTelephonyManager,
+                mContext.getSystemService(NotificationManager.class));
+        mLingerMonitor = new LingerMonitor(mContext, mNotifier);
     }
 
     private NetworkRequest createInternetRequestForTransport(int transportType) {
@@ -2230,16 +2237,15 @@
                         updateCapabilities(nai, nai.networkCapabilities);
                     }
                     if (!visible) {
-                        setProvNotificationVisibleIntent(false, netId, null, 0, null, null, false);
+                        mNotifier.clearNotification(netId);
                     } else {
                         if (nai == null) {
                             loge("EVENT_PROVISIONING_NOTIFICATION from unknown NetworkMonitor");
                             break;
                         }
                         if (!nai.networkMisc.provisioningNotificationDisabled) {
-                            setProvNotificationVisibleIntent(true, netId, NotificationType.SIGN_IN,
-                                    nai.networkInfo.getType(), nai.networkInfo.getExtraInfo(),
-                                    (PendingIntent)msg.obj, nai.networkMisc.explicitlySelected);
+                            mNotifier.showNotification(netId, NotificationType.SIGN_IN, nai, null,
+                                    (PendingIntent) msg.obj, nai.networkMisc.explicitlySelected);
                         }
                     }
                     break;
@@ -2389,6 +2395,7 @@
             }
             mLegacyTypeTracker.remove(nai, wasDefault);
             rematchAllNetworksAndRequests(null, 0);
+            mLingerMonitor.noteDisconnect(nai);
             if (nai.created) {
                 // Tell netd to clean up the configuration for this network
                 // (routing rules, DNS, etc).
@@ -2710,8 +2717,8 @@
         PendingIntent pendingIntent = PendingIntent.getActivityAsUser(
                 mContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT);
 
-        setProvNotificationVisibleIntent(true, nai.network.netId, NotificationType.NO_INTERNET,
-                nai.networkInfo.getType(), nai.networkInfo.getExtraInfo(), pendingIntent, true);
+        mNotifier.showNotification(nai.network.netId, NotificationType.NO_INTERNET, nai, null,
+                pendingIntent, true);
     }
 
     private class InternalHandler extends Handler {
@@ -3617,118 +3624,6 @@
         return -1;
     }
 
-    private static final String NOTIFICATION_ID = "CaptivePortal.Notification";
-    private static enum NotificationType { SIGN_IN, NO_INTERNET; };
-
-    private void setProvNotificationVisible(boolean visible, int networkType, String action) {
-        Intent intent = new Intent(action);
-        PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
-        // Concatenate the range of types onto the range of NetIDs.
-        int id = MAX_NET_ID + 1 + (networkType - ConnectivityManager.TYPE_NONE);
-        setProvNotificationVisibleIntent(visible, id, NotificationType.SIGN_IN,
-                networkType, null, pendingIntent, false);
-    }
-
-    /**
-     * Show or hide network provisioning notifications.
-     *
-     * We use notifications for two purposes: to notify that a network requires sign in
-     * (NotificationType.SIGN_IN), or to notify that a network does not have Internet access
-     * (NotificationType.NO_INTERNET). We display at most one notification per ID, so on a
-     * particular network we can display the notification type that was most recently requested.
-     * So for example if a captive portal fails to reply within a few seconds of connecting, we
-     * might first display NO_INTERNET, and then when the captive portal check completes, display
-     * SIGN_IN.
-     *
-     * @param id an identifier that uniquely identifies this notification.  This must match
-     *         between show and hide calls.  We use the NetID value but for legacy callers
-     *         we concatenate the range of types with the range of NetIDs.
-     */
-    private void setProvNotificationVisibleIntent(boolean visible, int id,
-            NotificationType notifyType, int networkType, String extraInfo, PendingIntent intent,
-            boolean highPriority) {
-        if (VDBG || (DBG && visible)) {
-            log("setProvNotificationVisibleIntent " + notifyType + " visible=" + visible
-                    + " networkType=" + getNetworkTypeName(networkType)
-                    + " extraInfo=" + extraInfo + " highPriority=" + highPriority);
-        }
-
-        Resources r = Resources.getSystem();
-        NotificationManager notificationManager = (NotificationManager) mContext
-            .getSystemService(Context.NOTIFICATION_SERVICE);
-
-        if (visible) {
-            CharSequence title;
-            CharSequence details;
-            int icon;
-            if (notifyType == NotificationType.NO_INTERNET &&
-                    networkType == ConnectivityManager.TYPE_WIFI) {
-                title = r.getString(R.string.wifi_no_internet, 0);
-                details = r.getString(R.string.wifi_no_internet_detailed);
-                icon = R.drawable.stat_notify_wifi_in_range;  // TODO: Need new icon.
-            } else if (notifyType == NotificationType.SIGN_IN) {
-                switch (networkType) {
-                    case ConnectivityManager.TYPE_WIFI:
-                        title = r.getString(R.string.wifi_available_sign_in, 0);
-                        details = r.getString(R.string.network_available_sign_in_detailed,
-                                extraInfo);
-                        icon = R.drawable.stat_notify_wifi_in_range;
-                        break;
-                    case ConnectivityManager.TYPE_MOBILE:
-                    case ConnectivityManager.TYPE_MOBILE_HIPRI:
-                        title = r.getString(R.string.network_available_sign_in, 0);
-                        // TODO: Change this to pull from NetworkInfo once a printable
-                        // name has been added to it
-                        details = mTelephonyManager.getNetworkOperatorName();
-                        icon = R.drawable.stat_notify_rssi_in_range;
-                        break;
-                    default:
-                        title = r.getString(R.string.network_available_sign_in, 0);
-                        details = r.getString(R.string.network_available_sign_in_detailed,
-                                extraInfo);
-                        icon = R.drawable.stat_notify_rssi_in_range;
-                        break;
-                }
-            } else {
-                Slog.wtf(TAG, "Unknown notification type " + notifyType + "on network type "
-                        + getNetworkTypeName(networkType));
-                return;
-            }
-
-            Notification notification = new Notification.Builder(mContext)
-                    .setWhen(0)
-                    .setSmallIcon(icon)
-                    .setAutoCancel(true)
-                    .setTicker(title)
-                    .setColor(mContext.getColor(
-                            com.android.internal.R.color.system_notification_accent_color))
-                    .setContentTitle(title)
-                    .setContentText(details)
-                    .setContentIntent(intent)
-                    .setLocalOnly(true)
-                    .setPriority(highPriority ?
-                            Notification.PRIORITY_HIGH :
-                            Notification.PRIORITY_DEFAULT)
-                    .setDefaults(highPriority ? Notification.DEFAULT_ALL : 0)
-                    .setOnlyAlertOnce(true)
-                    .build();
-
-            try {
-                notificationManager.notifyAsUser(NOTIFICATION_ID, id, notification, UserHandle.ALL);
-            } catch (NullPointerException npe) {
-                loge("setNotificationVisible: visible notificationManager npe=" + npe);
-                npe.printStackTrace();
-            }
-        } else {
-            try {
-                notificationManager.cancelAsUser(NOTIFICATION_ID, id, UserHandle.ALL);
-            } catch (NullPointerException npe) {
-                loge("setNotificationVisible: cancel notificationManager npe=" + npe);
-                npe.printStackTrace();
-            }
-        }
-    }
-
     /** Location to an updatable file listing carrier provisioning urls.
      *  An example:
      *
@@ -3832,7 +3727,9 @@
         enforceConnectivityInternalPermission();
         final long ident = Binder.clearCallingIdentity();
         try {
-            setProvNotificationVisible(visible, networkType, action);
+            // Concatenate the range of types onto the range of NetIDs.
+            int id = MAX_NET_ID + 1 + (networkType - ConnectivityManager.TYPE_NONE);
+            mNotifier.setProvNotificationVisible(visible, id, action);
         } finally {
             Binder.restoreCallingIdentity(ident);
         }
@@ -4356,6 +4253,10 @@
         return nai == getDefaultNetwork();
     }
 
+    private boolean isDefaultRequest(NetworkRequestInfo nri) {
+        return nri.request.requestId == mDefaultRequest.requestId;
+    }
+
     public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo,
             LinkProperties linkProperties, NetworkCapabilities networkCapabilities,
             int currentScore, NetworkMisc networkMisc) {
@@ -4798,6 +4699,9 @@
                         if (VDBG) log("   accepting network in place of " + currentNetwork.name());
                         currentNetwork.removeRequest(nri.request.requestId);
                         currentNetwork.lingerRequest(nri.request, now, mLingerDelayMs);
+                        if (isDefaultRequest(nri)) {
+                            mLingerMonitor.noteLingerDefaultNetwork(currentNetwork, newNetwork);
+                        }
                         affectedNetworks.add(currentNetwork);
                     } else {
                         if (VDBG) log("   accepting network in place of null");
@@ -4815,7 +4719,7 @@
                     // network.  Think about if there is a way to reduce this.  Push
                     // netid->request mapping to each factory?
                     sendUpdatedScoreToFactories(nri.request, newNetwork.getCurrentScore());
-                    if (mDefaultRequest.requestId == nri.request.requestId) {
+                    if (isDefaultRequest(nri)) {
                         isNewDefault = true;
                         oldDefaultNetwork = currentNetwork;
                     }
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index 9108acf..2f96b20 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -22,6 +22,7 @@
 import android.accounts.AccountAndUser;
 import android.accounts.AccountAuthenticatorResponse;
 import android.accounts.AccountManager;
+import android.accounts.AccountManagerInternal;
 import android.accounts.AuthenticatorDescription;
 import android.accounts.CantAddAccountActivity;
 import android.accounts.GrantCredentialsPermissionActivity;
@@ -29,11 +30,14 @@
 import android.accounts.IAccountAuthenticatorResponse;
 import android.accounts.IAccountManager;
 import android.accounts.IAccountManagerResponse;
+import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.app.ActivityManager;
 import android.app.ActivityManagerNative;
+import android.app.ActivityThread;
 import android.app.AppGlobals;
 import android.app.AppOpsManager;
+import android.app.INotificationManager;
 import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
@@ -46,9 +50,11 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.IntentSender;
 import android.content.ServiceConnection;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -72,11 +78,14 @@
 import android.os.Message;
 import android.os.Parcel;
 import android.os.Process;
+import android.os.RemoteCallback;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.os.storage.StorageManager;
+import android.service.notification.StatusBarNotification;
 import android.text.TextUtils;
 import android.util.Log;
 import android.util.Pair;
@@ -86,6 +95,7 @@
 
 import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.content.PackageMonitor;
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.internal.util.Preconditions;
@@ -237,6 +247,13 @@
             + " AND " + ACCOUNTS_NAME + "=?"
             + " AND " + ACCOUNTS_TYPE + "=?";
 
+    private static final String COUNT_OF_MATCHING_GRANTS_ANY_TOKEN = ""
+            + "SELECT COUNT(*) FROM " + TABLE_GRANTS + ", " + TABLE_ACCOUNTS
+            + " WHERE " + GRANTS_ACCOUNTS_ID + "=" + ACCOUNTS_ID
+            + " AND " + GRANTS_GRANTEE_UID + "=?"
+            + " AND " + ACCOUNTS_NAME + "=?"
+            + " AND " + ACCOUNTS_TYPE + "=?";
+
     private static final String SELECTION_AUTHTOKENS_BY_ACCOUNT =
             AUTHTOKENS_ACCOUNTS_ID + "=(select _id FROM accounts WHERE name=? AND type=?)";
 
@@ -376,6 +393,118 @@
                 }
             }
         }, UserHandle.ALL, userFilter, null, null);
+
+        LocalServices.addService(AccountManagerInternal.class, new AccountManagerInternalImpl());
+
+        // Need to cancel account request notifications if the update/install can access the account
+        new PackageMonitor() {
+            @Override
+            public void onPackageAdded(String packageName, int uid) {
+                // Called on a handler, and running as the system
+                cancelAccountAccessRequestNotificationIfNeeded(uid, true);
+            }
+
+            @Override
+            public void onPackageUpdateFinished(String packageName, int uid) {
+                // Called on a handler, and running as the system
+                cancelAccountAccessRequestNotificationIfNeeded(uid, true);
+            }
+        }.register(mContext, mMessageHandler.getLooper(), UserHandle.ALL, true);
+
+        // Cancel account request notification if an app op was preventing the account access
+        mAppOpsManager.startWatchingMode(AppOpsManager.OP_GET_ACCOUNTS, null,
+                new AppOpsManager.OnOpChangedInternalListener() {
+            @Override
+            public void onOpChanged(int op, String packageName) {
+                try {
+                    final int userId = ActivityManager.getCurrentUser();
+                    final int uid = mPackageManager.getPackageUidAsUser(packageName, userId);
+                    final int mode = mAppOpsManager.checkOpNoThrow(
+                            AppOpsManager.OP_GET_ACCOUNTS, uid, packageName);
+                    if (mode == AppOpsManager.MODE_ALLOWED) {
+                        final long identity = Binder.clearCallingIdentity();
+                        try {
+                            cancelAccountAccessRequestNotificationIfNeeded(packageName, uid, true);
+                        } finally {
+                            Binder.restoreCallingIdentity(identity);
+                        }
+                    }
+                } catch (NameNotFoundException e) {
+                    /* ignore */
+                }
+            }
+        });
+
+        // Cancel account request notification if a permission was preventing the account access
+        mPackageManager.addOnPermissionsChangeListener(
+                (int uid) -> {
+            Account[] accounts = null;
+            String[] packageNames = mPackageManager.getPackagesForUid(uid);
+            if (packageNames != null) {
+                final int userId = UserHandle.getUserId(uid);
+                final long identity = Binder.clearCallingIdentity();
+                try {
+                    for (String packageName : packageNames) {
+                        if (mContext.getPackageManager().checkPermission(
+                                Manifest.permission.GET_ACCOUNTS, packageName)
+                                        != PackageManager.PERMISSION_GRANTED) {
+                            continue;
+                        }
+
+                        if (accounts == null) {
+                            accounts = getAccountsAsUser(null, userId, "android");
+                            if (ArrayUtils.isEmpty(accounts)) {
+                                return;
+                            }
+                        }
+
+                        for (Account account : accounts) {
+                            cancelAccountAccessRequestNotificationIfNeeded(
+                                    account, uid, packageName, true);
+                        }
+                    }
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+        });
+    }
+
+    private void cancelAccountAccessRequestNotificationIfNeeded(int uid,
+            boolean checkAccess) {
+        Account[] accounts = getAccountsAsUser(null, UserHandle.getUserId(uid), "android");
+        for (Account account : accounts) {
+            cancelAccountAccessRequestNotificationIfNeeded(account, uid, checkAccess);
+        }
+    }
+
+    private void cancelAccountAccessRequestNotificationIfNeeded(String packageName, int uid,
+            boolean checkAccess) {
+        Account[] accounts = getAccountsAsUser(null, UserHandle.getUserId(uid), "android");
+        for (Account account : accounts) {
+            cancelAccountAccessRequestNotificationIfNeeded(account, uid, packageName, checkAccess);
+        }
+    }
+
+    private void cancelAccountAccessRequestNotificationIfNeeded(Account account, int uid,
+            boolean checkAccess) {
+        String[] packageNames = mPackageManager.getPackagesForUid(uid);
+        if (packageNames != null) {
+            for (String packageName : packageNames) {
+                cancelAccountAccessRequestNotificationIfNeeded(account, uid,
+                        packageName, checkAccess);
+            }
+        }
+    }
+
+    private void cancelAccountAccessRequestNotificationIfNeeded(Account account,
+            int uid, String packageName, boolean checkAccess) {
+        if (!checkAccess || hasAccountAccess(account, packageName,
+                UserHandle.getUserHandleForUid(uid))) {
+            cancelNotification(getCredentialPermissionNotificationId(account,
+                    AccountManager.ACCOUNT_ACCESS_TOKEN, uid), packageName,
+                    UserHandle.getUserHandleForUid(uid));
+        }
     }
 
     @Override
@@ -934,6 +1063,7 @@
      * Should only be called inside of a clearCallingIdentity block.
      */
     private AuthenticatorDescription[] getAuthenticatorTypesInternal(int userId) {
+        mAuthenticatorCache.updateServices(userId);
         Collection<AccountAuthenticatorCache.ServiceInfo<AuthenticatorDescription>>
                 authenticatorCollection = mAuthenticatorCache.getAllServices(userId);
         AuthenticatorDescription[] types =
@@ -947,8 +1077,6 @@
         return types;
     }
 
-
-
     private boolean isCrossUser(int callingUid, int userId) {
         return (userId != UserHandle.getCallingUserId()
                 && callingUid != Process.myUid()
@@ -1723,6 +1851,21 @@
         } finally {
             Binder.restoreCallingIdentity(id);
         }
+
+        if (isChanged) {
+            synchronized (accounts.credentialsPermissionNotificationIds) {
+                for (Pair<Pair<Account, String>, Integer> key
+                        : accounts.credentialsPermissionNotificationIds.keySet()) {
+                    if (account.equals(key.first.first)
+                            && AccountManager.ACCOUNT_ACCESS_TOKEN.equals(key.first.second)) {
+                        final int uid = (Integer) key.second;
+                        mMessageHandler.post(() -> cancelAccountAccessRequestNotificationIfNeeded(
+                                account, uid, false));
+                    }
+                }
+            }
+        }
+
         return isChanged;
     }
 
@@ -2119,7 +2262,7 @@
 
         final int callingUid = getCallingUid();
         clearCallingIdentity();
-        if (callingUid != Process.SYSTEM_UID) {
+        if (UserHandle.getAppId(callingUid) != Process.SYSTEM_UID) {
             throw new SecurityException("can only call from system");
         }
         int userId = UserHandle.getUserId(callingUid);
@@ -2319,9 +2462,11 @@
                         if (result.containsKey(AccountManager.KEY_AUTH_TOKEN_LABEL)) {
                             Intent intent = newGrantCredentialsPermissionIntent(
                                     account,
+                                    null,
                                     callerUid,
                                     new AccountAuthenticatorResponse(this),
-                                    authTokenType);
+                                    authTokenType,
+                                    true);
                             Bundle bundle = new Bundle();
                             bundle.putParcelable(AccountManager.KEY_INTENT, intent);
                             onResult(bundle);
@@ -2372,7 +2517,7 @@
                                     intent);
                             doNotification(mAccounts,
                                     account, result.getString(AccountManager.KEY_AUTH_FAILED_MESSAGE),
-                                    intent, accounts.userId);
+                                    intent, "android", accounts.userId);
                         }
                     }
                     super.onResult(result);
@@ -2403,7 +2548,7 @@
     }
 
     private void createNoCredentialsPermissionNotification(Account account, Intent intent,
-            int userId) {
+            String packageName, int userId) {
         int uid = intent.getIntExtra(
                 GrantCredentialsPermissionActivity.EXTRAS_REQUESTING_UID, -1);
         String authTokenType = intent.getStringExtra(
@@ -2431,20 +2576,23 @@
                         PendingIntent.FLAG_CANCEL_CURRENT, null, user))
                 .build();
         installNotification(getCredentialPermissionNotificationId(
-                account, authTokenType, uid), n, user);
+                account, authTokenType, uid), n, packageName, user.getIdentifier());
     }
 
-    private Intent newGrantCredentialsPermissionIntent(Account account, int uid,
-            AccountAuthenticatorResponse response, String authTokenType) {
+    private Intent newGrantCredentialsPermissionIntent(Account account, String packageName,
+            int uid, AccountAuthenticatorResponse response, String authTokenType,
+            boolean startInNewTask) {
 
         Intent intent = new Intent(mContext, GrantCredentialsPermissionActivity.class);
-        // See FLAG_ACTIVITY_NEW_TASK docs for limitations and benefits of the flag.
-        // Since it was set in Eclair+ we can't change it without breaking apps using
-        // the intent from a non-Activity context.
-        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        intent.addCategory(
-                String.valueOf(getCredentialPermissionNotificationId(account, authTokenType, uid)));
 
+        if (startInNewTask) {
+            // See FLAG_ACTIVITY_NEW_TASK docs for limitations and benefits of the flag.
+            // Since it was set in Eclair+ we can't change it without breaking apps using
+            // the intent from a non-Activity context. This is the default behavior.
+            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        }
+        intent.addCategory(String.valueOf(getCredentialPermissionNotificationId(account,
+                authTokenType, uid) + (packageName != null ? packageName : "")));
         intent.putExtra(GrantCredentialsPermissionActivity.EXTRAS_ACCOUNT, account);
         intent.putExtra(GrantCredentialsPermissionActivity.EXTRAS_AUTH_TOKEN_TYPE, authTokenType);
         intent.putExtra(GrantCredentialsPermissionActivity.EXTRAS_RESPONSE, response);
@@ -3295,6 +3443,123 @@
     }
 
     @Override
+    public boolean hasAccountAccess(@NonNull Account account,  @NonNull String packageName,
+            @NonNull UserHandle userHandle) {
+        if (UserHandle.getAppId(Binder.getCallingUid()) != Process.SYSTEM_UID) {
+            throw new SecurityException("Can be called only by system UID");
+        }
+        Preconditions.checkNotNull(account, "account cannot be null");
+        Preconditions.checkNotNull(packageName, "packageName cannot be null");
+        Preconditions.checkNotNull(userHandle, "userHandle cannot be null");
+
+        final int userId = userHandle.getIdentifier();
+
+        Preconditions.checkArgumentInRange(userId, 0, Integer.MAX_VALUE, "user must be concrete");
+
+        try {
+
+            final int uid = mPackageManager.getPackageUidAsUser(packageName, userId);
+            // Use null token which means any token. Having a token means the package
+            // is trusted by the authenticator, hence it is fine to access the account.
+            if (permissionIsGranted(account, null, uid, userId)) {
+                return true;
+            }
+            // In addition to the permissions required to get an auth token we also allow
+            // the account to be accessed by holders of the get accounts permissions.
+            return checkUidPermission(Manifest.permission.GET_ACCOUNTS_PRIVILEGED, uid, packageName)
+                    || checkUidPermission(Manifest.permission.GET_ACCOUNTS, uid, packageName);
+        } catch (NameNotFoundException e) {
+            return false;
+        }
+    }
+
+    private boolean checkUidPermission(String permission, int uid, String opPackageName) {
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            IPackageManager pm = ActivityThread.getPackageManager();
+            if (pm.checkUidPermission(permission, uid) != PackageManager.PERMISSION_GRANTED) {
+                return false;
+            }
+            final int opCode = AppOpsManager.permissionToOpCode(permission);
+            return (opCode == AppOpsManager.OP_NONE || mAppOpsManager.noteOpNoThrow(
+                    opCode, uid, opPackageName) == AppOpsManager.MODE_ALLOWED);
+        } catch (RemoteException e) {
+            /* ignore - local call */
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+        return false;
+    }
+
+    @Override
+    public IntentSender createRequestAccountAccessIntentSenderAsUser(@NonNull Account account,
+            @NonNull String packageName, @NonNull UserHandle userHandle) {
+        if (UserHandle.getAppId(Binder.getCallingUid()) != Process.SYSTEM_UID) {
+            throw new SecurityException("Can be called only by system UID");
+        }
+
+        Preconditions.checkNotNull(account, "account cannot be null");
+        Preconditions.checkNotNull(packageName, "packageName cannot be null");
+        Preconditions.checkNotNull(userHandle, "userHandle cannot be null");
+
+        final int userId = userHandle.getIdentifier();
+
+        Preconditions.checkArgumentInRange(userId, 0, Integer.MAX_VALUE, "user must be concrete");
+
+        final int uid;
+        try {
+            uid = mPackageManager.getPackageUidAsUser(packageName, userId);
+        } catch (NameNotFoundException e) {
+            Slog.e(TAG, "Unknown package " + packageName);
+            return null;
+        }
+
+        Intent intent = newRequestAccountAccessIntent(account, packageName, uid, null);
+
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            return PendingIntent.getActivityAsUser(
+                    mContext, 0, intent, PendingIntent.FLAG_ONE_SHOT
+                            | PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+                    null, new UserHandle(userId)).getIntentSender();
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    private Intent newRequestAccountAccessIntent(Account account, String packageName,
+            int uid, RemoteCallback callback) {
+        return newGrantCredentialsPermissionIntent(account, packageName, uid,
+                new AccountAuthenticatorResponse(new IAccountAuthenticatorResponse.Stub() {
+            @Override
+            public void onResult(Bundle value) throws RemoteException {
+                handleAuthenticatorResponse(true);
+            }
+
+            @Override
+            public void onRequestContinued() {
+                /* ignore */
+            }
+
+            @Override
+            public void onError(int errorCode, String errorMessage) throws RemoteException {
+                handleAuthenticatorResponse(false);
+            }
+
+            private void handleAuthenticatorResponse(boolean accessGranted) throws RemoteException {
+                cancelNotification(getCredentialPermissionNotificationId(account,
+                        AccountManager.ACCOUNT_ACCESS_TOKEN, uid), packageName,
+                        UserHandle.getUserHandleForUid(uid));
+                if (callback != null) {
+                    Bundle result = new Bundle();
+                    result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, accessGranted);
+                    callback.sendResult(result);
+                }
+            }
+        }), AccountManager.ACCOUNT_ACCESS_TOKEN, false);
+    }
+
+    @Override
     public boolean someUserHasAccount(@NonNull final Account account) {
         if (!UserHandle.isSameApp(Process.SYSTEM_UID, Binder.getCallingUid())) {
             throw new SecurityException("Only system can check for accounts across users");
@@ -4934,7 +5199,7 @@
     }
 
     private void doNotification(UserAccounts accounts, Account account, CharSequence message,
-            Intent intent, int userId) {
+            Intent intent, String packageName, final int userId) {
         long identityToken = clearCallingIdentity();
         try {
             if (Log.isLoggable(TAG, Log.VERBOSE)) {
@@ -4944,12 +5209,12 @@
             if (intent.getComponent() != null &&
                     GrantCredentialsPermissionActivity.class.getName().equals(
                             intent.getComponent().getClassName())) {
-                createNoCredentialsPermissionNotification(account, intent, userId);
+                createNoCredentialsPermissionNotification(account, intent, packageName, userId);
             } else {
+                Context contextForUser = getContextForUser(new UserHandle(userId));
                 final Integer notificationId = getSigninRequiredNotificationId(accounts, account);
                 intent.addCategory(String.valueOf(notificationId));
-                UserHandle user = new UserHandle(userId);
-                Context contextForUser = getContextForUser(user);
+
                 final String notificationTitleFormat =
                         contextForUser.getText(R.string.notification_title).toString();
                 Notification n = new Notification.Builder(contextForUser)
@@ -4961,9 +5226,9 @@
                         .setContentText(message)
                         .setContentIntent(PendingIntent.getActivityAsUser(
                                 mContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT,
-                                null, user))
+                                null, new UserHandle(userId)))
                         .build();
-                installNotification(notificationId, n, user);
+                installNotification(notificationId, n, packageName, userId);
             }
         } finally {
             restoreCallingIdentity(identityToken);
@@ -4971,18 +5236,40 @@
     }
 
     @VisibleForTesting
-    protected void installNotification(final int notificationId, final Notification n,
+    protected void installNotification(int notificationId, final Notification notification,
             UserHandle user) {
-        ((NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE))
-                .notifyAsUser(null, notificationId, n, user);
+        installNotification(notificationId, notification, "android", user.getIdentifier());
+    }
+
+    private void installNotification(int notificationId, final Notification notification,
+            String packageName, int userId) {
+        final long token = clearCallingIdentity();
+        try {
+            INotificationManager notificationManager = NotificationManager.getService();
+            try {
+                notificationManager.enqueueNotificationWithTag(packageName, packageName, null,
+                        notificationId, notification, new int[1], userId);
+            } catch (RemoteException e) {
+                /* ignore - local call */
+            }
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
     }
 
     @VisibleForTesting
     protected void cancelNotification(int id, UserHandle user) {
+        cancelNotification(id, mContext.getPackageName(), user);
+    }
+
+    protected void cancelNotification(int id, String packageName, UserHandle user) {
         long identityToken = clearCallingIdentity();
         try {
-            ((NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE))
-                .cancelAsUser(null, id, user);
+            INotificationManager service = INotificationManager.Stub.asInterface(
+                    ServiceManager.getService(Context.NOTIFICATION_SERVICE));
+            service.cancelNotificationWithTag(packageName, null, id, user.getIdentifier());
+        } catch (RemoteException e) {
+            /* ignore - local call */
         } finally {
             restoreCallingIdentity(identityToken);
         }
@@ -5043,18 +5330,40 @@
 
     private boolean permissionIsGranted(
             Account account, String authTokenType, int callerUid, int userId) {
-        final boolean isPrivileged = isPrivileged(callerUid);
-        final boolean fromAuthenticator = account != null
-                && isAccountManagedByCaller(account.type, callerUid, userId);
-        final boolean hasExplicitGrants = account != null
-                && hasExplicitlyGrantedPermission(account, authTokenType, callerUid);
-        if (Log.isLoggable(TAG, Log.VERBOSE)) {
-            Log.v(TAG, "checkGrantsOrCallingUidAgainstAuthenticator: caller uid "
-                    + callerUid + ", " + account
-                    + ": is authenticator? " + fromAuthenticator
-                    + ", has explicit permission? " + hasExplicitGrants);
+        if (UserHandle.getAppId(callerUid) == Process.SYSTEM_UID) {
+            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                Log.v(TAG, "Access to " + account + " granted calling uid is system");
+            }
+            return true;
         }
-        return fromAuthenticator || hasExplicitGrants || isPrivileged;
+
+        if (isPrivileged(callerUid)) {
+            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                Log.v(TAG, "Access to " + account + " granted calling uid "
+                        + callerUid + " privileged");
+            }
+            return true;
+        }
+        if (account != null && isAccountManagedByCaller(account.type, callerUid, userId)) {
+            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                Log.v(TAG, "Access to " + account + " granted calling uid "
+                        + callerUid + " manages the account");
+            }
+            return true;
+        }
+        if (account != null && hasExplicitlyGrantedPermission(account, authTokenType, callerUid)) {
+            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                Log.v(TAG, "Access to " + account + " granted calling uid "
+                        + callerUid + " user granted access");
+            }
+            return true;
+        }
+
+        if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            Log.v(TAG, "Access to " + account + " not granted for uid " + callerUid);
+        }
+
+        return false;
     }
 
     private boolean isAccountVisibleToCaller(String accountType, int callingUid, int userId,
@@ -5138,16 +5447,26 @@
 
     private boolean hasExplicitlyGrantedPermission(Account account, String authTokenType,
             int callerUid) {
-        if (callerUid == Process.SYSTEM_UID) {
+        if (UserHandle.getAppId(callerUid) == Process.SYSTEM_UID) {
             return true;
         }
-        UserAccounts accounts = getUserAccountsForCaller();
+        UserAccounts accounts = getUserAccounts(UserHandle.getUserId(callerUid));
         synchronized (accounts.cacheLock) {
             final SQLiteDatabase db = accounts.openHelper.getReadableDatabase();
-            String[] args = { String.valueOf(callerUid), authTokenType,
-                    account.name, account.type};
-            final boolean permissionGranted =
-                    DatabaseUtils.longForQuery(db, COUNT_OF_MATCHING_GRANTS, args) != 0;
+
+            final String query;
+            final String[] args;
+
+            if (authTokenType != null) {
+                query = COUNT_OF_MATCHING_GRANTS;
+                args = new String[] {String.valueOf(callerUid), authTokenType,
+                        account.name, account.type};
+            } else {
+                query = COUNT_OF_MATCHING_GRANTS_ANY_TOKEN;
+                args = new String[] {String.valueOf(callerUid), account.name,
+                        account.type};
+            }
+            final boolean permissionGranted = DatabaseUtils.longForQuery(db, query, args) != 0;
             if (!permissionGranted && ActivityManager.isRunningInTestHarness()) {
                 // TODO: Skip this check when running automated tests. Replace this
                 // with a more general solution.
@@ -5246,7 +5565,7 @@
             throws RemoteException {
         final int callingUid = getCallingUid();
 
-        if (callingUid != Process.SYSTEM_UID) {
+        if (UserHandle.getAppId(callingUid) != Process.SYSTEM_UID) {
             throw new SecurityException();
         }
 
@@ -5288,6 +5607,8 @@
             }
             cancelNotification(getCredentialPermissionNotificationId(account, authTokenType, uid),
                     UserHandle.of(accounts.userId));
+
+            cancelAccountAccessRequestNotificationIfNeeded(account, uid, true);
         }
     }
 
@@ -5605,4 +5926,45 @@
             }
         }
     }
+
+    private final class AccountManagerInternalImpl extends AccountManagerInternal {
+        @Override
+        public void requestAccountAccess(@NonNull Account account, @NonNull String packageName,
+                @IntRange(from = 0) int userId, @NonNull RemoteCallback callback) {
+            if (account == null) {
+                Slog.w(TAG, "account cannot be null");
+                return;
+            }
+            if (packageName == null) {
+                Slog.w(TAG, "packageName cannot be null");
+                return;
+            }
+            if (userId < UserHandle.USER_SYSTEM) {
+                Slog.w(TAG, "user id must be concrete");
+                return;
+            }
+            if (callback == null) {
+                Slog.w(TAG, "callback cannot be null");
+                return;
+            }
+
+            if (hasAccountAccess(account, packageName, new UserHandle(userId))) {
+                Bundle result = new Bundle();
+                result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
+                callback.sendResult(result);
+                return;
+            }
+
+            final int uid;
+            try {
+                uid = mPackageManager.getPackageUidAsUser(packageName, userId);
+            } catch (NameNotFoundException e) {
+                Slog.e(TAG, "Unknown package " + packageName);
+                return;
+            }
+
+            Intent intent = newRequestAccountAccessIntent(account, packageName, uid, callback);
+            doNotification(mUsers.get(userId), account, null, intent, packageName, userId);
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/accounts/IAccountAuthenticatorCache.java b/services/core/java/com/android/server/accounts/IAccountAuthenticatorCache.java
index bb09687..2c7d921 100644
--- a/services/core/java/com/android/server/accounts/IAccountAuthenticatorCache.java
+++ b/services/core/java/com/android/server/accounts/IAccountAuthenticatorCache.java
@@ -64,4 +64,10 @@
             Handler handler);
 
     void invalidateCache(int userId);
+
+    /**
+     * Request to update services info for which package has been updated, but hasn't been
+     * picked up by the cache.
+     */
+    void updateServices(int userId);
 }
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 9e601eb..aedf089 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -1158,6 +1158,7 @@
      * For example, references to the commonly used services.
      */
     HashMap<String, IBinder> mAppBindArgs;
+    HashMap<String, IBinder> mIsolatedAppBindArgs;
 
     /**
      * Temporary to avoid allocations.  Protected by main lock.
@@ -2935,18 +2936,24 @@
      * lazily setup to make sure the services are running when they're asked for.
      */
     private HashMap<String, IBinder> getCommonServicesLocked(boolean isolated) {
+        // Isolated processes won't get this optimization, so that we don't
+        // violate the rules about which services they have access to.
+        if (isolated) {
+            if (mIsolatedAppBindArgs == null) {
+                mIsolatedAppBindArgs = new HashMap<>();
+                mIsolatedAppBindArgs.put("package", ServiceManager.getService("package"));
+            }
+            return mIsolatedAppBindArgs;
+        }
+
         if (mAppBindArgs == null) {
             mAppBindArgs = new HashMap<>();
 
-            // Isolated processes won't get this optimization, so that we don't
-            // violate the rules about which services they have access to.
-            if (!isolated) {
-                // Setup the application init args
-                mAppBindArgs.put("package", ServiceManager.getService("package"));
-                mAppBindArgs.put("window", ServiceManager.getService("window"));
-                mAppBindArgs.put(Context.ALARM_SERVICE,
-                        ServiceManager.getService(Context.ALARM_SERVICE));
-            }
+            // Setup the application init args
+            mAppBindArgs.put("package", ServiceManager.getService("package"));
+            mAppBindArgs.put("window", ServiceManager.getService("window"));
+            mAppBindArgs.put(Context.ALARM_SERVICE,
+                    ServiceManager.getService(Context.ALARM_SERVICE));
         }
         return mAppBindArgs;
     }
@@ -13813,7 +13820,7 @@
                     try {
                         java.lang.Process logcat = new ProcessBuilder(
                                 "/system/bin/timeout", "-k", "15s", "10s",
-                                "/system/bin/logcat", "-v", "time", "-b", "events", "-b", "system",
+                                "/system/bin/logcat", "-v", "threadtime", "-b", "events", "-b", "system",
                                 "-b", "main", "-b", "crash", "-t", String.valueOf(lines))
                                         .redirectErrorStream(true).start();
 
@@ -17770,6 +17777,7 @@
                 || Intent.ACTION_MEDIA_BUTTON.equals(action)
                 || Intent.ACTION_MEDIA_SCANNER_SCAN_FILE.equals(action)
                 || Intent.ACTION_SHOW_KEYBOARD_SHORTCUTS.equals(action)
+                || Intent.ACTION_MASTER_CLEAR.equals(action)
                 || AppWidgetManager.ACTION_APPWIDGET_CONFIGURE.equals(action)
                 || AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)
                 || LocationManager.HIGH_POWER_REQUEST_CHANGE_ACTION.equals(action)
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 00fda43..489eb77 100755
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -750,6 +750,14 @@
                 && intent.getType() == null;
     }
 
+    static boolean isMainIntent(Intent intent) {
+        return Intent.ACTION_MAIN.equals(intent.getAction())
+                && intent.hasCategory(Intent.CATEGORY_LAUNCHER)
+                && intent.getCategories().size() == 1
+                && intent.getData() == null
+                && intent.getType() == null;
+    }
+
     private boolean canLaunchHomeActivity(int uid, ActivityRecord sourceRecord) {
         if (uid == Process.myUid() || uid == 0) {
             // System process can launch home activity.
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index a27adf7..8c4c0ad 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -2485,13 +2485,25 @@
                     }
                 }
 
+                boolean allowSavedSurface = true;
                 if (next.newIntents != null) {
+                    // Restrict saved surface to launcher start, or there is no intent at all
+                    // (eg. task being brought to front). If the intent is something else,
+                    // likely the app is going to show some specific page or view, instead of
+                    // what's left last time.
+                    for (int i = next.newIntents.size() - 1; i >= 0; i--) {
+                        final Intent intent = next.newIntents.get(i);
+                        if (intent != null && !ActivityRecord.isMainIntent(intent)) {
+                            allowSavedSurface = false;
+                            break;
+                        }
+                    }
                     next.app.thread.scheduleNewIntent(next.newIntents, next.appToken);
                 }
 
                 // Well the app will no longer be stopped.
                 // Clear app token stopped state in window manager if needed.
-                mWindowManager.notifyAppResumed(next.appToken, next.stopped);
+                mWindowManager.notifyAppResumed(next.appToken, next.stopped, allowSavedSurface);
 
                 EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY, next.userId,
                         System.identityHashCode(next), next.task.taskId, next.shortComponentName);
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 5252446..6c61226 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -103,6 +103,7 @@
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.PowerManagerInternal;
+import android.os.Process;
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.os.UserHandle;
@@ -132,6 +133,9 @@
     private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION;
     private static final String TAG_USER_LEAVING = TAG + POSTFIX_USER_LEAVING;
 
+    // TODO b/30204367 remove when the platform fully supports ephemeral applications
+    private static final boolean USE_DEFAULT_EPHEMERAL_LAUNCHER = false;
+
     private final ActivityManagerService mService;
     private final ActivityStackSupervisor mSupervisor;
     private ActivityStartInterceptor mInterceptor;
@@ -456,39 +460,13 @@
         // starts either the intent we resolved here [on install error] or the ephemeral
         // app [on install success].
         if (rInfo != null && rInfo.ephemeralResolveInfo != null) {
-            // Create a pending intent to start the intent resolved here.
-            final IIntentSender failureTarget = mService.getIntentSenderLocked(
-                    ActivityManager.INTENT_SENDER_ACTIVITY, callingPackage,
-                    Binder.getCallingUid(), userId, null, null, 0, new Intent[]{ intent },
-                    new String[]{ resolvedType },
-                    PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT
-                            | PendingIntent.FLAG_IMMUTABLE, null);
-
-            // Create a pending intent to start the ephemeral application; force it to be
-            // directed to the ephemeral package.
-            ephemeralIntent.setPackage(rInfo.ephemeralResolveInfo.getPackageName());
-            final IIntentSender ephemeralTarget = mService.getIntentSenderLocked(
-                    ActivityManager.INTENT_SENDER_ACTIVITY, callingPackage,
-                    Binder.getCallingUid(), userId, null, null, 0, new Intent[]{ ephemeralIntent },
-                    new String[]{ resolvedType },
-                    PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT
-                            | PendingIntent.FLAG_IMMUTABLE, null);
-
-            int flags = intent.getFlags();
-            intent = new Intent();
-            intent.setFlags(flags
-                    | Intent.FLAG_ACTIVITY_NEW_TASK
-                    | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
-            intent.putExtra(Intent.EXTRA_PACKAGE_NAME,
-                    rInfo.ephemeralResolveInfo.getPackageName());
-            intent.putExtra(Intent.EXTRA_EPHEMERAL_FAILURE, new IntentSender(failureTarget));
-            intent.putExtra(Intent.EXTRA_EPHEMERAL_SUCCESS, new IntentSender(ephemeralTarget));
-
+            intent = buildEphemeralInstallerIntent(intent, ephemeralIntent,
+                    rInfo.ephemeralResolveInfo.getPackageName(), callingPackage, resolvedType,
+                    userId);
             resolvedType = null;
             callingUid = realCallingUid;
             callingPid = realCallingPid;
 
-            rInfo = rInfo.ephemeralInstaller;
             aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, null /*profilerInfo*/);
         }
 
@@ -543,6 +521,60 @@
         return err;
     }
 
+    /**
+     * Builds and returns an intent to launch the ephemeral installer.
+     */
+    private Intent buildEphemeralInstallerIntent(Intent launchIntent, Intent origIntent,
+            String ephemeralPackage, String callingPackage, String resolvedType, int userId) {
+        final Intent nonEphemeralIntent = new Intent(origIntent);
+        nonEphemeralIntent.setFlags(nonEphemeralIntent.getFlags() | Intent.FLAG_IGNORE_EPHEMERAL);
+        // Intent that is launched if the ephemeral package couldn't be installed
+        // for any reason.
+        final IIntentSender failureIntentTarget = mService.getIntentSenderLocked(
+                ActivityManager.INTENT_SENDER_ACTIVITY, callingPackage,
+                Binder.getCallingUid(), userId, null /*token*/, null /*resultWho*/, 1,
+                new Intent[]{ nonEphemeralIntent }, new String[]{ resolvedType },
+                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT
+                | PendingIntent.FLAG_IMMUTABLE, null /*bOptions*/);
+
+        final Intent ephemeralIntent;
+        if (USE_DEFAULT_EPHEMERAL_LAUNCHER) {
+            // Force the intent to be directed to the ephemeral package
+            ephemeralIntent = new Intent(origIntent);
+            ephemeralIntent.setPackage(ephemeralPackage);
+        } else {
+            // Success intent goes back to the installer
+            // TODO; do we need any extras for the installer?
+            ephemeralIntent = new Intent(launchIntent);
+            ephemeralIntent.setData(null);
+        }
+
+        // Intent that is eventually launched if the ephemeral package was
+        // installed successfully. This will actually be launched by a platform
+        // broadcast receiver.
+        final IIntentSender successIntentTarget = mService.getIntentSenderLocked(
+                ActivityManager.INTENT_SENDER_ACTIVITY, callingPackage,
+                Binder.getCallingUid(), userId, null /*token*/, null /*resultWho*/, 0,
+                new Intent[]{ ephemeralIntent }, new String[]{ resolvedType },
+                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT
+                | PendingIntent.FLAG_IMMUTABLE, null /*bOptions*/);
+
+        // Finally build the actual intent to launch the ephemeral installer
+        int flags = launchIntent.getFlags();
+        final Intent intent = new Intent();
+        intent.setFlags(flags
+                | Intent.FLAG_ACTIVITY_NEW_TASK
+                | Intent.FLAG_ACTIVITY_CLEAR_TASK
+                | Intent.FLAG_ACTIVITY_NO_HISTORY
+                | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+        intent.putExtra(Intent.EXTRA_PACKAGE_NAME, ephemeralPackage);
+        intent.putExtra(Intent.EXTRA_EPHEMERAL_FAILURE, new IntentSender(failureIntentTarget));
+        intent.putExtra(Intent.EXTRA_EPHEMERAL_SUCCESS, new IntentSender(successIntentTarget));
+        // TODO: Remove when the platform has fully implemented ephemeral apps
+        intent.setData(origIntent.getData());
+        return intent;
+    }
+
     void postStartActivityUncheckedProcessing(
             ActivityRecord r, int result, int prevFocusedStackId, ActivityRecord sourceRecord,
             ActivityStack targetStack) {
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index 7eff773..576f2b2 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -575,6 +575,8 @@
     boolean handleAppCrashLocked(ProcessRecord app, String reason,
             String shortMsg, String longMsg, String stackTrace, AppErrorDialog.Data data) {
         long now = SystemClock.uptimeMillis();
+        boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0;
 
         Long crashTime;
         Long crashTimePersistent;
@@ -612,7 +614,9 @@
                 // processes run critical code.
                 mService.removeProcessLocked(app, false, false, "crash");
                 mService.mStackSupervisor.resumeFocusedStackTopActivityLocked();
-                return false;
+                if (!showBackground) {
+                    return false;
+                }
             }
             mService.mStackSupervisor.resumeFocusedStackTopActivityLocked();
         } else {
@@ -705,7 +709,7 @@
             }
             final boolean crashSilenced = mAppsNotReportingCrashes != null &&
                     mAppsNotReportingCrashes.contains(proc.info.packageName);
-            if (mService.canShowErrorDialogs() && !crashSilenced) {
+            if ((mService.canShowErrorDialogs() || showBackground) && !crashSilenced) {
                 proc.crashDialog = new AppErrorDialog(mContext, mService, data);
             } else {
                 // The device is asleep, so just pretend that the user
@@ -942,7 +946,9 @@
                     null, null, 0, null, null, null, AppOpsManager.OP_NONE,
                     null, false, false, MY_PID, Process.SYSTEM_UID, 0 /* TODO: Verify */);
 
-            if (mService.canShowErrorDialogs()) {
+            boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(),
+                    Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0;
+            if (mService.canShowErrorDialogs() || showBackground) {
                 d = new AppNotRespondingDialog(mService,
                         mContext, proc, (ActivityRecord)data.get("activity"),
                         msg.arg1 != 0);
diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java
index 2467a90..9c08453 100644
--- a/services/core/java/com/android/server/am/PendingIntentRecord.java
+++ b/services/core/java/com/android/server/am/PendingIntentRecord.java
@@ -38,6 +38,7 @@
 
 import java.io.PrintWriter;
 import java.lang.ref.WeakReference;
+import java.util.Objects;
 
 final class PendingIntentRecord extends IIntentSender.Stub {
     private static final String TAG = TAG_WITH_CLASS_NAME ? "PendingIntentRecord" : TAG_AM;
@@ -102,7 +103,7 @@
             if (requestResolvedType != null) {
                 hash = (ODD_PRIME_NUMBER*hash) + requestResolvedType.hashCode();
             }
-            hash = (ODD_PRIME_NUMBER*hash) + _p.hashCode();
+            hash = (ODD_PRIME_NUMBER*hash) + (_p != null ? _p.hashCode() : 0);
             hash = (ODD_PRIME_NUMBER*hash) + _t;
             hashCode = hash;
             //Slog.i(ActivityManagerService.TAG, this + " hashCode=0x"
@@ -121,20 +122,14 @@
                 if (userId != other.userId){
                     return false;
                 }
-                if (!packageName.equals(other.packageName)) {
+                if (!Objects.equals(packageName, other.packageName)) {
                     return false;
                 }
                 if (activity != other.activity) {
                     return false;
                 }
-                if (who != other.who) {
-                    if (who != null) {
-                        if (!who.equals(other.who)) {
-                            return false;
-                        }
-                    } else if (other.who != null) {
-                        return false;
-                    }
+                if (!Objects.equals(who, other.who)) {
+                    return false;
                 }
                 if (requestCode != other.requestCode) {
                     return false;
@@ -148,14 +143,8 @@
                         return false;
                     }
                 }
-                if (requestResolvedType != other.requestResolvedType) {
-                    if (requestResolvedType != null) {
-                        if (!requestResolvedType.equals(other.requestResolvedType)) {
-                            return false;
-                        }
-                    } else if (other.requestResolvedType != null) {
-                        return false;
-                    }
+                if (!Objects.equals(requestResolvedType, other.requestResolvedType)) {
+                    return false;
                 }
                 if (flags != other.flags) {
                     return false;
diff --git a/services/core/java/com/android/server/am/TaskPersister.java b/services/core/java/com/android/server/am/TaskPersister.java
index 48fecd5..43eb251 100644
--- a/services/core/java/com/android/server/am/TaskPersister.java
+++ b/services/core/java/com/android/server/am/TaskPersister.java
@@ -87,6 +87,8 @@
     private final RecentTasks mRecentTasks;
     private final SparseArray<SparseBooleanArray> mTaskIdsInFile = new SparseArray<>();
     private final File mTaskIdsDir;
+    // To lock file operations in TaskPersister
+    private final Object mIoLock = new Object();
 
     /**
      * Value determines write delay mode as follows: < 0 We are Flushing. No delays between writes
@@ -195,52 +197,52 @@
             return mTaskIdsInFile.get(userId).clone();
         }
         final SparseBooleanArray persistedTaskIds = new SparseBooleanArray();
-        BufferedReader reader = null;
-        String line;
-        try {
-            reader = new BufferedReader(new FileReader(getUserPersistedTaskIdsFile(userId)));
-            while ((line = reader.readLine()) != null) {
-                for (String taskIdString : line.split("\\s+")) {
-                    int id = Integer.parseInt(taskIdString);
-                    persistedTaskIds.put(id, true);
+        synchronized (mIoLock) {
+            BufferedReader reader = null;
+            String line;
+            try {
+                reader = new BufferedReader(new FileReader(getUserPersistedTaskIdsFile(userId)));
+                while ((line = reader.readLine()) != null) {
+                    for (String taskIdString : line.split("\\s+")) {
+                        int id = Integer.parseInt(taskIdString);
+                        persistedTaskIds.put(id, true);
+                    }
                 }
+            } catch (FileNotFoundException e) {
+                // File doesn't exist. Ignore.
+            } catch (Exception e) {
+                Slog.e(TAG, "Error while reading taskIds file for user " + userId, e);
+            } finally {
+                IoUtils.closeQuietly(reader);
             }
-        } catch (FileNotFoundException e) {
-            // File doesn't exist. Ignore.
-        } catch (Exception e) {
-            Slog.e(TAG, "Error while reading taskIds file for user " + userId, e);
-        } finally {
-            IoUtils.closeQuietly(reader);
         }
         mTaskIdsInFile.put(userId, persistedTaskIds);
         return persistedTaskIds.clone();
     }
 
+
     @VisibleForTesting
-    void maybeWritePersistedTaskIdsForUser(@NonNull SparseBooleanArray taskIds, int userId) {
+    void writePersistedTaskIdsForUser(@NonNull SparseBooleanArray taskIds, int userId) {
         if (userId < 0) {
             return;
         }
-        SparseBooleanArray persistedIdsInFile = mTaskIdsInFile.get(userId);
-        if (persistedIdsInFile != null && persistedIdsInFile.equals(taskIds)) {
-            return;
-        }
         final File persistedTaskIdsFile = getUserPersistedTaskIdsFile(userId);
-        BufferedWriter writer = null;
-        try {
-            writer = new BufferedWriter(new FileWriter(persistedTaskIdsFile));
-            for (int i = 0; i < taskIds.size(); i++) {
-                if (taskIds.valueAt(i)) {
-                    writer.write(String.valueOf(taskIds.keyAt(i)));
-                    writer.newLine();
+        synchronized (mIoLock) {
+            BufferedWriter writer = null;
+            try {
+                writer = new BufferedWriter(new FileWriter(persistedTaskIdsFile));
+                for (int i = 0; i < taskIds.size(); i++) {
+                    if (taskIds.valueAt(i)) {
+                        writer.write(String.valueOf(taskIds.keyAt(i)));
+                        writer.newLine();
+                    }
                 }
+            } catch (Exception e) {
+                Slog.e(TAG, "Error while writing taskIds file for user " + userId, e);
+            } finally {
+                IoUtils.closeQuietly(writer);
             }
-        } catch (Exception e) {
-            Slog.e(TAG, "Error while writing taskIds file for user " + userId, e);
-        } finally {
-            IoUtils.closeQuietly(writer);
         }
-        mTaskIdsInFile.put(userId, taskIds.clone());
     }
 
     void unloadUserDataFromMemory(int userId) {
@@ -543,16 +545,23 @@
     }
 
     private void writeTaskIdsFiles() {
-        int candidateUserIds[];
+        SparseArray<SparseBooleanArray> changedTaskIdsPerUser = new SparseArray<>();
         synchronized (mService) {
-            candidateUserIds = mRecentTasks.usersWithRecentsLoadedLocked();
-        }
-        SparseBooleanArray taskIdsToSave;
-        for (int userId : candidateUserIds) {
-            synchronized (mService) {
-                taskIdsToSave = mRecentTasks.mPersistedTaskIds.get(userId).clone();
+            for (int userId : mRecentTasks.usersWithRecentsLoadedLocked()) {
+                SparseBooleanArray taskIdsToSave = mRecentTasks.mPersistedTaskIds.get(userId);
+                SparseBooleanArray persistedIdsInFile = mTaskIdsInFile.get(userId);
+                if (persistedIdsInFile != null && persistedIdsInFile.equals(taskIdsToSave)) {
+                    continue;
+                } else {
+                    SparseBooleanArray taskIdsToSaveCopy = taskIdsToSave.clone();
+                    mTaskIdsInFile.put(userId, taskIdsToSaveCopy);
+                    changedTaskIdsPerUser.put(userId, taskIdsToSaveCopy);
+                }
             }
-            maybeWritePersistedTaskIdsForUser(taskIdsToSave, userId);
+        }
+        for (int i = 0; i < changedTaskIdsPerUser.size(); i++) {
+            writePersistedTaskIdsForUser(changedTaskIdsPerUser.valueAt(i),
+                    changedTaskIdsPerUser.keyAt(i));
         }
     }
 
diff --git a/services/core/java/com/android/server/connectivity/LingerMonitor.java b/services/core/java/com/android/server/connectivity/LingerMonitor.java
new file mode 100644
index 0000000..4034877
--- /dev/null
+++ b/services/core/java/com/android/server/connectivity/LingerMonitor.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2016 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 com.android.server.connectivity;
+
+import android.app.PendingIntent;
+import android.net.ConnectivityManager;
+import android.net.NetworkCapabilities;
+import android.net.Uri;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.SparseArray;
+import android.util.SparseIntArray;
+import android.util.SparseBooleanArray;
+import java.util.Arrays;
+import java.util.HashMap;
+
+import com.android.internal.util.MessageUtils;
+import com.android.server.connectivity.NetworkNotificationManager;
+import com.android.server.connectivity.NetworkNotificationManager.NotificationType;
+
+import static android.net.ConnectivityManager.NETID_UNSET;
+
+/**
+ * Class that monitors default network linger events and possibly notifies the user of network
+ * switches.
+ *
+ * This class is not thread-safe and all its methods must be called on the ConnectivityService
+ * handler thread.
+ */
+public class LingerMonitor {
+
+    private static final boolean DBG = true;
+    private static final boolean VDBG = false;
+    private static final String TAG = LingerMonitor.class.getSimpleName();
+
+    private static final HashMap<String, Integer> sTransportNames = makeTransportToNameMap();
+    private static final Intent CELLULAR_SETTINGS = new Intent().setComponent(new ComponentName(
+            "com.android.settings", "com.android.settings.Settings$DataUsageSummaryActivity"));
+
+    private static final int NOTIFY_TYPE_NONE = 0;
+    private static final int NOTIFY_TYPE_NOTIFICATION = 1;
+    private static final int NOTIFY_TYPE_TOAST = 2;
+
+    private static SparseArray<String> sNotifyTypeNames = MessageUtils.findMessageNames(
+            new Class[] { LingerMonitor.class }, new String[]{ "NOTIFY_TYPE_" });
+
+    private final Context mContext;
+    private final NetworkNotificationManager mNotifier;
+
+    /** Current notifications. Maps the netId we switched away from to the netId we switched to. */
+    private final SparseIntArray mNotifications = new SparseIntArray();
+
+    /** Whether we ever notified that we switched away from a particular network. */
+    private final SparseBooleanArray mEverNotified = new SparseBooleanArray();
+
+    public LingerMonitor(Context context, NetworkNotificationManager notifier) {
+        mContext = context;
+        mNotifier = notifier;
+    }
+
+    private static HashMap<String, Integer> makeTransportToNameMap() {
+        SparseArray<String> numberToName = MessageUtils.findMessageNames(
+            new Class[] { NetworkCapabilities.class }, new String[]{ "TRANSPORT_" });
+        HashMap<String, Integer> nameToNumber = new HashMap<>();
+        for (int i = 0; i < numberToName.size(); i++) {
+            // MessageUtils will fail to initialize if there are duplicate constant values, so there
+            // are no duplicates here.
+            nameToNumber.put(numberToName.valueAt(i), numberToName.keyAt(i));
+        }
+        return nameToNumber;
+    }
+
+    private static boolean hasTransport(NetworkAgentInfo nai, int transport) {
+        return nai.networkCapabilities.hasTransport(transport);
+    }
+
+    private int getNotificationSource(NetworkAgentInfo toNai) {
+        for (int i = 0; i < mNotifications.size(); i++) {
+            if (mNotifications.valueAt(i) == toNai.network.netId) {
+                return mNotifications.keyAt(i);
+            }
+        }
+        return NETID_UNSET;
+    }
+
+    private boolean everNotified(NetworkAgentInfo nai) {
+        return mEverNotified.get(nai.network.netId, false);
+    }
+
+    private boolean isNotificationEnabled(NetworkAgentInfo fromNai, NetworkAgentInfo toNai) {
+        // TODO: Evaluate moving to CarrierConfigManager.
+        String[] notifySwitches = mContext.getResources().getStringArray(
+                com.android.internal.R.array.config_networkNotifySwitches);
+
+        if (VDBG) {
+            Log.d(TAG, "Notify on network switches: " + Arrays.toString(notifySwitches));
+        }
+
+        for (String notifySwitch : notifySwitches) {
+            if (TextUtils.isEmpty(notifySwitch)) continue;
+            String[] transports = notifySwitch.split("-", 2);
+            if (transports.length != 2) {
+                Log.e(TAG, "Invalid network switch notification configuration: " + notifySwitch);
+                continue;
+            }
+            int fromTransport = sTransportNames.get("TRANSPORT_" + transports[0]);
+            int toTransport = sTransportNames.get("TRANSPORT_" + transports[1]);
+            if (hasTransport(fromNai, fromTransport) && hasTransport(toNai, toTransport)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    private void showNotification(NetworkAgentInfo fromNai, NetworkAgentInfo toNai) {
+        PendingIntent pendingIntent = PendingIntent.getActivityAsUser(
+                mContext, 0, CELLULAR_SETTINGS, PendingIntent.FLAG_CANCEL_CURRENT, null,
+                UserHandle.CURRENT);
+
+        mNotifier.showNotification(fromNai.network.netId, NotificationType.NETWORK_SWITCH,
+                fromNai, toNai, pendingIntent, true);
+    }
+
+    // Removes any notification that was put up as a result of switching to nai.
+    private void maybeStopNotifying(NetworkAgentInfo nai) {
+        int fromNetId = getNotificationSource(nai);
+        if (fromNetId != NETID_UNSET) {
+            mNotifications.delete(fromNetId);
+            mNotifier.clearNotification(fromNetId);
+            // Toasts can't be deleted.
+        }
+    }
+
+    // Notify the user of a network switch using a notification or a toast.
+    private void notify(NetworkAgentInfo fromNai, NetworkAgentInfo toNai, boolean forceToast) {
+        boolean notify = false;
+        int notifyType = mContext.getResources().getInteger(
+                com.android.internal.R.integer.config_networkNotifySwitchType);
+
+        if (notifyType == NOTIFY_TYPE_NOTIFICATION && forceToast) {
+            notifyType = NOTIFY_TYPE_TOAST;
+        }
+
+        switch (notifyType) {
+            case NOTIFY_TYPE_NONE:
+                break;
+            case NOTIFY_TYPE_NOTIFICATION:
+                showNotification(fromNai, toNai);
+                notify = true;
+                break;
+            case NOTIFY_TYPE_TOAST:
+                mNotifier.showToast(fromNai, toNai);
+                notify = true;
+                break;
+            default:
+                Log.e(TAG, "Unknown notify type " + notifyType);
+        }
+
+        if (VDBG) {
+            Log.d(TAG, "Notify type: " + sNotifyTypeNames.get(notifyType, "" + notifyType));
+        }
+
+        if (notify) {
+            if (DBG) {
+                Log.d(TAG, "Notifying switch from=" + fromNai.name() + " to=" + toNai.name() +
+                        " type=" + sNotifyTypeNames.get(notifyType, "unknown(" + notifyType + ")"));
+            }
+            mNotifications.put(fromNai.network.netId, toNai.network.netId);
+            mEverNotified.put(fromNai.network.netId, true);
+        }
+    }
+
+    // The default network changed from fromNai to toNai due to a change in score.
+    public void noteLingerDefaultNetwork(NetworkAgentInfo fromNai, NetworkAgentInfo toNai) {
+        if (VDBG) {
+            Log.d(TAG, "noteLingerDefaultNetwork from=" + fromNai.name() +
+                    " everValidated=" + fromNai.everValidated +
+                    " lastValidated=" + fromNai.lastValidated +
+                    " to=" + toNai.name());
+        }
+
+        // If we are currently notifying the user because the device switched to fromNai, now that
+        // we are switching away from it we should remove the notification. This includes the case
+        // where we switch back to toNai because its score improved again (e.g., because it regained
+        // Internet access).
+        maybeStopNotifying(fromNai);
+
+        // If this network never validated, don't notify. Otherwise, we could do things like:
+        //
+        // 1. Unvalidated wifi connects.
+        // 2. Unvalidated mobile data connects.
+        // 3. Cell validates, and we show a notification.
+        // or:
+        // 1. User connects to wireless printer.
+        // 2. User turns on cellular data.
+        // 3. We show a notification.
+        if (!fromNai.everValidated) return;
+
+        // If this network is a captive portal, don't notify. This cannot happen on initial connect
+        // to a captive portal, because the everValidated check above will fail. However, it can
+        // happen if the captive portal reasserts itself (e.g., because its timeout fires). In that
+        // case, as soon as the captive portal reasserts itself, we'll show a sign-in notification.
+        // We don't want to overwrite that notification with this one; the user has already been
+        // notified, and of the two, the captive portal notification is the more useful one because
+        // it allows the user to sign in to the captive portal. In this case, display a toast
+        // in addition to the captive portal notification.
+        //
+        // Note that if the network we switch to is already up when the captive portal reappears,
+        // this won't work because NetworkMonitor tells ConnectivityService that the network is
+        // unvalidated (causing a switch) before asking it to show the sign in notification. In this
+        // case, the toast won't show and we'll only display the sign in notification. This is the
+        // best we can do at this time.
+        boolean forceToast = fromNai.networkCapabilities.hasCapability(
+                NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
+
+        // Only show the notification once, in order to avoid irritating the user every time.
+        // TODO: should we do this?
+        if (everNotified(fromNai)) {
+            if (VDBG) {
+                Log.d(TAG, "Not notifying handover from " + fromNai.name() + ", already notified");
+            }
+            return;
+        }
+
+        if (isNotificationEnabled(fromNai, toNai)) {
+            notify(fromNai, toNai, forceToast);
+        }
+    }
+
+    public void noteDisconnect(NetworkAgentInfo nai) {
+        mNotifications.delete(nai.network.netId);
+        mEverNotified.delete(nai.network.netId);
+        maybeStopNotifying(nai);
+        // No need to cancel notifications on nai: NetworkMonitor does that on disconnect.
+    }
+}
diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
index 7a25df6..b0330b9 100644
--- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
+++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
@@ -411,14 +411,17 @@
 
     /**
      * Cancel lingering. Called by ConnectivityService when a request is added to this network.
+     * Returns true if the given request was lingering on this network, false otherwise.
      */
-    public void unlingerRequest(NetworkRequest request) {
+    public boolean unlingerRequest(NetworkRequest request) {
         LingerTimer timer = mLingerTimerForRequest.get(request.requestId);
         if (timer != null) {
             if (VDBG) Log.d(TAG, "Removing LingerTimer " + timer + " from " + this.name());
             mLingerTimers.remove(timer);
             mLingerTimerForRequest.remove(request.requestId);
+            return true;
         }
+        return false;
     }
 
     public long getLingerExpiry() {
diff --git a/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java b/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java
new file mode 100644
index 0000000..99926a9
--- /dev/null
+++ b/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java
@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) 2016 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 com.android.server.connectivity;
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.widget.Toast;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.net.NetworkCapabilities;
+import android.os.UserHandle;
+import android.telephony.TelephonyManager;
+import android.util.Slog;
+
+import com.android.internal.R;
+
+import static android.net.NetworkCapabilities.*;
+
+
+public class NetworkNotificationManager {
+
+    public static enum NotificationType { SIGN_IN, NO_INTERNET, NETWORK_SWITCH };
+
+    private static final String NOTIFICATION_ID = "Connectivity.Notification";
+
+    private static final String TAG = NetworkNotificationManager.class.getSimpleName();
+    private static final boolean DBG = true;
+    private static final boolean VDBG = false;
+
+    private final Context mContext;
+    private final TelephonyManager mTelephonyManager;
+    private final NotificationManager mNotificationManager;
+
+    public NetworkNotificationManager(Context c, TelephonyManager t, NotificationManager n) {
+        mContext = c;
+        mTelephonyManager = t;
+        mNotificationManager = n;
+    }
+
+    // TODO: deal more gracefully with multi-transport networks.
+    private static int getFirstTransportType(NetworkAgentInfo nai) {
+        for (int i = 0; i < 64; i++) {
+            if (nai.networkCapabilities.hasTransport(i)) return i;
+        }
+        return -1;
+    }
+
+    private static String getTransportName(int transportType) {
+        Resources r = Resources.getSystem();
+        String[] networkTypes = r.getStringArray(R.array.network_switch_type_name);
+        try {
+            return networkTypes[transportType];
+        } catch (IndexOutOfBoundsException e) {
+            return r.getString(R.string.network_switch_type_name_unknown);
+        }
+    }
+
+    private static int getIcon(int transportType) {
+        return (transportType == TRANSPORT_WIFI) ?
+                R.drawable.stat_notify_wifi_in_range :  // TODO: Distinguish ! from ?.
+                R.drawable.stat_notify_rssi_in_range;
+    }
+
+    /**
+     * Show or hide network provisioning notifications.
+     *
+     * We use notifications for two purposes: to notify that a network requires sign in
+     * (NotificationType.SIGN_IN), or to notify that a network does not have Internet access
+     * (NotificationType.NO_INTERNET). We display at most one notification per ID, so on a
+     * particular network we can display the notification type that was most recently requested.
+     * So for example if a captive portal fails to reply within a few seconds of connecting, we
+     * might first display NO_INTERNET, and then when the captive portal check completes, display
+     * SIGN_IN.
+     *
+     * @param id an identifier that uniquely identifies this notification.  This must match
+     *         between show and hide calls.  We use the NetID value but for legacy callers
+     *         we concatenate the range of types with the range of NetIDs.
+     * @param nai the network with which the notification is associated. For a SIGN_IN or
+     *         NO_INTERNET notification, this is the network we're connecting to. For a
+     *         NETWORK_SWITCH notification it's the network that we switched from. When this network
+     *         disconnects the notification is removed.
+     * @param switchToNai for a NETWORK_SWITCH notification, the network we are switching to. Null
+     *         in all other cases. Only used to determine the text of the notification.
+     */
+    public void showNotification(int id, NotificationType notifyType, NetworkAgentInfo nai,
+            NetworkAgentInfo switchToNai, PendingIntent intent, boolean highPriority) {
+        int transportType;
+        String extraInfo;
+        if (nai != null) {
+            transportType = getFirstTransportType(nai);
+            extraInfo = nai.networkInfo.getExtraInfo();
+            // Only notify for Internet-capable networks.
+            if (!nai.networkCapabilities.hasCapability(NET_CAPABILITY_INTERNET)) return;
+        } else {
+            // Legacy notifications.
+            transportType = TRANSPORT_CELLULAR;
+            extraInfo = null;
+        }
+
+        if (DBG) {
+            Slog.d(TAG, "showNotification " + notifyType
+                    + " transportType=" + getTransportName(transportType)
+                    + " extraInfo=" + extraInfo + " highPriority=" + highPriority);
+        }
+
+        Resources r = Resources.getSystem();
+        CharSequence title;
+        CharSequence details;
+        int icon = getIcon(transportType);
+        if (notifyType == NotificationType.NO_INTERNET && transportType == TRANSPORT_WIFI) {
+            title = r.getString(R.string.wifi_no_internet, 0);
+            details = r.getString(R.string.wifi_no_internet_detailed);
+        } else if (notifyType == NotificationType.SIGN_IN) {
+            switch (transportType) {
+                case TRANSPORT_WIFI:
+                    title = r.getString(R.string.wifi_available_sign_in, 0);
+                    details = r.getString(R.string.network_available_sign_in_detailed, extraInfo);
+                    break;
+                case TRANSPORT_CELLULAR:
+                    title = r.getString(R.string.network_available_sign_in, 0);
+                    // TODO: Change this to pull from NetworkInfo once a printable
+                    // name has been added to it
+                    details = mTelephonyManager.getNetworkOperatorName();
+                    break;
+                default:
+                    title = r.getString(R.string.network_available_sign_in, 0);
+                    details = r.getString(R.string.network_available_sign_in_detailed, extraInfo);
+                    break;
+            }
+        } else if (notifyType == NotificationType.NETWORK_SWITCH) {
+            String fromTransport = getTransportName(transportType);
+            String toTransport = getTransportName(getFirstTransportType(switchToNai));
+            title = r.getString(R.string.network_switch_metered, toTransport);
+            details = r.getString(R.string.network_switch_metered_detail, toTransport,
+                    fromTransport);
+        } else {
+            Slog.wtf(TAG, "Unknown notification type " + notifyType + "on network transport "
+                    + getTransportName(transportType));
+            return;
+        }
+
+        Notification.Builder builder = new Notification.Builder(mContext)
+                .setWhen(System.currentTimeMillis())
+                .setShowWhen(notifyType == NotificationType.NETWORK_SWITCH)
+                .setSmallIcon(icon)
+                .setAutoCancel(true)
+                .setTicker(title)
+                .setColor(mContext.getColor(
+                        com.android.internal.R.color.system_notification_accent_color))
+                .setContentTitle(title)
+                .setContentIntent(intent)
+                .setLocalOnly(true)
+                .setPriority(highPriority ?
+                        Notification.PRIORITY_HIGH :
+                        Notification.PRIORITY_DEFAULT)
+                .setDefaults(highPriority ? Notification.DEFAULT_ALL : 0)
+                .setOnlyAlertOnce(true);
+
+        if (notifyType == NotificationType.NETWORK_SWITCH) {
+            builder.setStyle(new Notification.BigTextStyle().bigText(details));
+        } else {
+            builder.setContentText(details);
+        }
+
+        Notification notification = builder.build();
+
+        try {
+            mNotificationManager.notifyAsUser(NOTIFICATION_ID, id, notification, UserHandle.ALL);
+        } catch (NullPointerException npe) {
+            Slog.d(TAG, "setNotificationVisible: visible notificationManager npe=" + npe);
+        }
+    }
+
+    public void clearNotification(int id) {
+        if (DBG) {
+            Slog.d(TAG, "clearNotification id=" + id);
+        }
+        try {
+            mNotificationManager.cancelAsUser(NOTIFICATION_ID, id, UserHandle.ALL);
+        } catch (NullPointerException npe) {
+            Slog.d(TAG, "setNotificationVisible: cancel notificationManager npe=" + npe);
+        }
+    }
+
+    /**
+     * Legacy provisioning notifications coming directly from DcTracker.
+     */
+    public void setProvNotificationVisible(boolean visible, int id, String action) {
+        if (visible) {
+            Intent intent = new Intent(action);
+            PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
+            showNotification(id, NotificationType.SIGN_IN, null, null, pendingIntent, false);
+        } else {
+            clearNotification(id);
+        }
+    }
+
+    public void showToast(NetworkAgentInfo fromNai, NetworkAgentInfo toNai) {
+        String fromTransport = getTransportName(getFirstTransportType(fromNai));
+        String toTransport = getTransportName(getFirstTransportType(toNai));
+        String text = mContext.getResources().getString(
+                R.string.network_switch_metered_toast, fromTransport, toTransport);
+        Toast.makeText(mContext, text, Toast.LENGTH_LONG).show();
+    }
+}
diff --git a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java
index 7525f30..c2c1a8c 100644
--- a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java
+++ b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java
@@ -25,6 +25,7 @@
 import android.net.RouteInfo;
 import android.net.ip.RouterAdvertisementDaemon;
 import android.net.ip.RouterAdvertisementDaemon.RaParams;
+import android.net.util.NetdService;
 import android.os.INetworkManagementService;
 import android.os.ServiceSpecificException;
 import android.os.RemoteException;
@@ -193,7 +194,7 @@
 
     private void configureLocalDns(
             HashSet<Inet6Address> deprecatedDnses, HashSet<Inet6Address> newDnses) {
-        INetd netd = getNetdServiceOrNull();
+        final INetd netd = NetdService.getInstance();
         if (netd == null) {
             if (newDnses != null) newDnses.clear();
             Log.e(TAG, "No netd service instance available; not setting local IPv6 addresses");
@@ -265,18 +266,6 @@
         return localRoutes;
     }
 
-    private INetd getNetdServiceOrNull() {
-        if (mNMService != null) {
-            try {
-                return mNMService.getNetdService();
-            } catch (RemoteException ignored) {
-                // This blocks until netd can be reached, but it can return
-                // null during a netd crash.
-            }
-        }
-        return null;
-    }
-
     // Given a prefix like 2001:db8::/64 return 2001:db8::1.
     private static Inet6Address getLocalDnsIpFor(IpPrefix localPrefix) {
         final byte[] dnsBytes = localPrefix.getRawAddress();
diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java
index 01b2393..12955f5 100644
--- a/services/core/java/com/android/server/content/ContentService.java
+++ b/services/core/java/com/android/server/content/ContentService.java
@@ -482,7 +482,6 @@
             SyncManager syncManager = getSyncManager();
             if (syncManager != null) {
                 syncManager.scheduleSync(account, userId, uId, authority, extras,
-                        0 /* no delay */, 0 /* no delay */,
                         false /* onlyThoseWithUnkownSyncableState */);
             }
         } finally {
@@ -547,11 +546,8 @@
                 getSyncManager().updateOrAddPeriodicSync(info, runAtTime,
                         flextime, extras);
             } else {
-                long beforeRuntimeMillis = (flextime) * 1000;
-                long runtimeMillis = runAtTime * 1000;
                 syncManager.scheduleSync(
                         request.getAccount(), userId, callerUid, request.getProvider(), extras,
-                        beforeRuntimeMillis, runtimeMillis,
                         false /* onlyThoseWithUnknownSyncableState */);
             }
         } finally {
@@ -841,7 +837,7 @@
         try {
             SyncManager syncManager = getSyncManager();
             if (syncManager != null) {
-                return syncManager.getIsSyncable(
+                return syncManager.computeSyncable(
                         account, userId, providerName);
             }
         } finally {
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index 39ddc3a..f739fa8 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -19,6 +19,7 @@
 import android.accounts.Account;
 import android.accounts.AccountAndUser;
 import android.accounts.AccountManager;
+import android.accounts.AccountManagerInternal;
 import android.app.ActivityManager;
 import android.app.ActivityManagerNative;
 import android.app.AppGlobals;
@@ -64,6 +65,7 @@
 import android.os.Message;
 import android.os.Messenger;
 import android.os.PowerManager;
+import android.os.RemoteCallback;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.SystemClock;
@@ -79,6 +81,7 @@
 import android.util.Pair;
 import android.util.Slog;
 
+import com.android.internal.util.ArrayUtils;
 import com.android.server.LocalServices;
 import com.android.server.job.JobSchedulerInternal;
 import com.google.android.collect.Lists;
@@ -133,6 +136,8 @@
 public class SyncManager {
     static final String TAG = "SyncManager";
 
+    private static final boolean DEBUG_ACCOUNT_ACCESS = false;
+
     /** Delay a sync due to local changes this long. In milliseconds */
     private static final long LOCAL_SYNC_DELAY;
 
@@ -194,6 +199,11 @@
     private static final String HANDLE_SYNC_ALARM_WAKE_LOCK = "SyncManagerHandleSyncAlarm";
     private static final String SYNC_LOOP_WAKE_LOCK = "SyncLoopWakeLock";
 
+
+    private static final int SYNC_OP_STATE_VALID = 0;
+    private static final int SYNC_OP_STATE_INVALID = 1;
+    private static final int SYNC_OP_STATE_INVALID_NO_ACCOUNT_ACCESS = 2;
+
     private Context mContext;
 
     private static final AccountAndUser[] INITIAL_ACCOUNTS_ARRAY = new AccountAndUser[0];
@@ -310,6 +320,10 @@
 
     private final UserManager mUserManager;
 
+    private final AccountManager mAccountManager;
+
+    private final AccountManagerInternal mAccountManagerInternal;
+
     private List<UserInfo> getAllUsers() {
         return mUserManager.getUsers();
     }
@@ -490,8 +504,6 @@
             @Override
             public void onSyncRequest(SyncStorageEngine.EndPoint info, int reason, Bundle extras) {
                 scheduleSync(info.account, info.userId, reason, info.provider, extras,
-                        0 /* no flexMillis */,
-                        0 /* run immediately */,
                         false);
             }
         });
@@ -522,8 +534,7 @@
                 if (!removed) {
                     scheduleSync(null, UserHandle.USER_ALL,
                             SyncOperation.REASON_SERVICE_CHANGED,
-                            type.authority, null, 0 /* no delay */, 0 /* no delay */,
-                            false /* onlyThoseWithUnkownSyncableState */);
+                            type.authority, null, false /* onlyThoseWithUnkownSyncableState */);
                 }
             }
         }, mSyncHandler);
@@ -562,6 +573,9 @@
         }
         mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
         mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+        mAccountManager = (AccountManager) mContext.getSystemService(Context.ACCOUNT_SERVICE);
+        mAccountManagerInternal = LocalServices.getService(AccountManagerInternal.class);
+
         mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService(
                 BatteryStats.SERVICE_NAME));
 
@@ -655,7 +669,7 @@
         return mSyncStorageEngine;
     }
 
-    public int getIsSyncable(Account account, int userId, String providerName) {
+    private int getIsSyncable(Account account, int userId, String providerName) {
         int isSyncable = mSyncStorageEngine.getIsSyncable(account, userId, providerName);
         UserInfo userInfo = UserManager.get(mContext).getUserInfo(userId);
 
@@ -666,22 +680,22 @@
         RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo =
                 mSyncAdapters.getServiceInfo(
                         SyncAdapterType.newKey(providerName, account.type), userId);
-        if (syncAdapterInfo == null) return isSyncable;
+        if (syncAdapterInfo == null) return AuthorityInfo.NOT_SYNCABLE;
 
         PackageInfo pInfo = null;
         try {
             pInfo = AppGlobals.getPackageManager().getPackageInfo(
                     syncAdapterInfo.componentName.getPackageName(), 0, userId);
-            if (pInfo == null) return isSyncable;
+            if (pInfo == null) return AuthorityInfo.NOT_SYNCABLE;
         } catch (RemoteException re) {
             // Shouldn't happen.
-            return isSyncable;
+            return AuthorityInfo.NOT_SYNCABLE;
         }
         if (pInfo.restrictedAccountType != null
                 && pInfo.restrictedAccountType.equals(account.type)) {
             return isSyncable;
         } else {
-            return 0;
+            return AuthorityInfo.NOT_SYNCABLE;
         }
     }
 
@@ -733,13 +747,10 @@
      * @param extras a Map of SyncAdapter-specific information to control
      *          syncs of a specific provider. Can be null. Is ignored
      *          if the url is null.
-     * @param beforeRuntimeMillis milliseconds before runtimeMillis that this sync can run.
-     * @param runtimeMillis maximum milliseconds in the future to wait before performing sync.
      * @param onlyThoseWithUnkownSyncableState Only sync authorities that have unknown state.
      */
     public void scheduleSync(Account requestedAccount, int userId, int reason,
-            String requestedAuthority, Bundle extras, long beforeRuntimeMillis,
-            long runtimeMillis, boolean onlyThoseWithUnkownSyncableState) {
+            String requestedAuthority, Bundle extras, boolean onlyThoseWithUnkownSyncableState) {
         final boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE);
         if (extras == null) {
             extras = new Bundle();
@@ -749,17 +760,27 @@
                     + requestedAuthority);
         }
 
-        AccountAndUser[] accounts;
-        if (requestedAccount != null && userId != UserHandle.USER_ALL) {
-            accounts = new AccountAndUser[] { new AccountAndUser(requestedAccount, userId) };
+        AccountAndUser[] accounts = null;
+        if (requestedAccount != null) {
+            if (userId != UserHandle.USER_ALL) {
+                accounts = new AccountAndUser[]{new AccountAndUser(requestedAccount, userId)};
+            } else {
+                for (AccountAndUser runningAccount : mRunningAccounts) {
+                    if (requestedAccount.equals(runningAccount.account)) {
+                        accounts = ArrayUtils.appendElement(AccountAndUser.class,
+                                accounts, runningAccount);
+                    }
+                }
+            }
         } else {
             accounts = mRunningAccounts;
-            if (accounts.length == 0) {
-                if (isLoggable) {
-                    Slog.v(TAG, "scheduleSync: no accounts configured, dropping");
-                }
-                return;
+        }
+
+        if (ArrayUtils.isEmpty(accounts)) {
+            if (isLoggable) {
+                Slog.v(TAG, "scheduleSync: no accounts configured, dropping");
             }
+            return;
         }
 
         final boolean uploadOnly = extras.getBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, false);
@@ -808,29 +829,41 @@
             }
 
             for (String authority : syncableAuthorities) {
-                int isSyncable = getIsSyncable(account.account, account.userId,
-                        authority);
+                int isSyncable = computeSyncable(account.account, account.userId, authority);
+
                 if (isSyncable == AuthorityInfo.NOT_SYNCABLE) {
                     continue;
                 }
-                final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo;
-                syncAdapterInfo = mSyncAdapters.getServiceInfo(
-                        SyncAdapterType.newKey(authority, account.account.type), account.userId);
+
+                final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo =
+                        mSyncAdapters.getServiceInfo(SyncAdapterType.newKey(authority,
+                                account.account.type), account.userId);
                 if (syncAdapterInfo == null) {
                     continue;
                 }
+
                 final int owningUid = syncAdapterInfo.uid;
-                final String owningPackage = syncAdapterInfo.componentName.getPackageName();
-                try {
-                    if (ActivityManagerNative.getDefault().getAppStartMode(owningUid,
-                            owningPackage) == ActivityManager.APP_START_MODE_DISABLED) {
-                        Slog.w(TAG, "Not scheduling job " + syncAdapterInfo.uid + ":"
-                                + syncAdapterInfo.componentName
-                                + " -- package not allowed to start");
-                        continue;
+
+                if (isSyncable == AuthorityInfo.SYNCABLE_NO_ACCOUNT_ACCESS) {
+                    if (isLoggable) {
+                        Slog.v(TAG, "    Not scheduling sync operation: "
+                                + "isSyncable == SYNCABLE_NO_ACCOUNT_ACCESS");
                     }
-                } catch (RemoteException e) {
+                    Bundle finalExtras = new Bundle(extras);
+                    mAccountManagerInternal.requestAccountAccess(account.account,
+                            syncAdapterInfo.componentName.getPackageName(),
+                            UserHandle.getUserId(owningUid),
+                            new RemoteCallback((Bundle result) -> {
+                                if (result != null
+                                        && result.getBoolean(AccountManager.KEY_BOOLEAN_RESULT)) {
+                                    scheduleSync(account.account, userId, reason, authority,
+                                            finalExtras, onlyThoseWithUnkownSyncableState);
+                                }
+                            }
+                        ));
+                    continue;
                 }
+
                 final boolean allowParallelSyncs = syncAdapterInfo.type.allowParallelSyncs();
                 final boolean isAlwaysSyncable = syncAdapterInfo.type.isAlwaysSyncable();
                 if (isSyncable < 0 && isAlwaysSyncable) {
@@ -838,6 +871,7 @@
                             account.account, account.userId, authority, AuthorityInfo.SYNCABLE);
                     isSyncable = AuthorityInfo.SYNCABLE;
                 }
+
                 if (onlyThoseWithUnkownSyncableState && isSyncable >= 0) {
                     continue;
                 }
@@ -863,6 +897,9 @@
                                 account.account, authority, account.userId);
                 long delayUntil =
                         mSyncStorageEngine.getDelayUntilTime(info);
+
+                final String owningPackage = syncAdapterInfo.componentName.getPackageName();
+
                 if (isSyncable < 0) {
                     // Initialisation sync.
                     Bundle newExtras = new Bundle();
@@ -887,8 +924,6 @@
                     if (isLoggable) {
                         Slog.v(TAG, "scheduleSync:"
                                 + " delay until " + delayUntil
-                                + " run by " + runtimeMillis
-                                + " flexMillis " + beforeRuntimeMillis
                                 + ", source " + source
                                 + ", account " + account
                                 + ", authority " + authority
@@ -904,6 +939,56 @@
         }
     }
 
+    public int computeSyncable(Account account, int userId, String authority) {
+        final int status = getIsSyncable(account, userId, authority);
+        if (status == AuthorityInfo.NOT_SYNCABLE) {
+            return AuthorityInfo.NOT_SYNCABLE;
+        }
+        final SyncAdapterType type = SyncAdapterType.newKey(authority, account.type);
+        final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo =
+                mSyncAdapters.getServiceInfo(type, userId);
+        if (syncAdapterInfo == null) {
+            return AuthorityInfo.NOT_SYNCABLE;
+        }
+        final int owningUid = syncAdapterInfo.uid;
+        final String owningPackage = syncAdapterInfo.componentName.getPackageName();
+        try {
+            if (ActivityManagerNative.getDefault().getAppStartMode(owningUid,
+                    owningPackage) == ActivityManager.APP_START_MODE_DISABLED) {
+                Slog.w(TAG, "Not scheduling job " + syncAdapterInfo.uid + ":"
+                        + syncAdapterInfo.componentName
+                        + " -- package not allowed to start");
+                return AuthorityInfo.NOT_SYNCABLE;
+            }
+        } catch (RemoteException e) {
+            /* ignore - local call */
+        }
+        if (!canAccessAccount(account, owningPackage, owningUid)) {
+            Log.w(TAG, "Access to " + account + " denied for package "
+                    + owningPackage + " in UID " + syncAdapterInfo.uid);
+            return AuthorityInfo.SYNCABLE_NO_ACCOUNT_ACCESS;
+        }
+
+        return status;
+    }
+
+    private boolean canAccessAccount(Account account, String packageName, int uid) {
+        if (mAccountManager.hasAccountAccess(account, packageName,
+                UserHandle.getUserHandleForUid(uid))) {
+            return true;
+        }
+        // We relax the account access rule to also include the system apps as
+        // they are trusted and we want to minimize the cases where the user
+        // involvement is required to grant access to the synced account.
+        try {
+            mContext.getPackageManager().getApplicationInfoAsUser(packageName,
+                    PackageManager.MATCH_SYSTEM_ONLY, UserHandle.getUserId(uid));
+            return true;
+        } catch (NameNotFoundException e) {
+            return false;
+        }
+    }
+
     private void removeSyncsForAuthority(EndPoint info) {
         verifyJobScheduler();
         List<SyncOperation> ops = getAllPendingSyncs();
@@ -960,8 +1045,6 @@
         final Bundle extras = new Bundle();
         extras.putBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, true);
         scheduleSync(account, userId, reason, authority, extras,
-                LOCAL_SYNC_DELAY /* earliest run time */,
-                2 * LOCAL_SYNC_DELAY /* latest sync time. */,
                 false /* onlyThoseWithUnkownSyncableState */);
     }
 
@@ -1421,7 +1504,6 @@
                 mContext.getOpPackageName());
         for (Account account : accounts) {
             scheduleSync(account, userId, SyncOperation.REASON_USER_START, null, null,
-                    0 /* no delay */, 0 /* No flexMillis */,
                     true /* onlyThoseWithUnknownSyncableState */);
         }
     }
@@ -2530,13 +2612,18 @@
                 }
             }
 
-            if (isOperationValid(op)) {
-                if (!dispatchSyncOperation(op)) {
+            final int syncOpState = computeSyncOpState(op);
+            switch (syncOpState) {
+                case SYNC_OP_STATE_INVALID_NO_ACCOUNT_ACCESS:
+                case SYNC_OP_STATE_INVALID: {
                     mSyncJobService.callJobFinished(op.jobId, false);
-                }
-            } else {
+                } return;
+            }
+
+            if (!dispatchSyncOperation(op)) {
                 mSyncJobService.callJobFinished(op.jobId, false);
             }
+
             setAuthorityPendingState(op.target);
         }
 
@@ -2596,8 +2683,7 @@
 
             if (syncTargets != null) {
                 scheduleSync(syncTargets.account, syncTargets.userId,
-                        SyncOperation.REASON_ACCOUNTS_UPDATED, syncTargets.provider, null, 0, 0,
-                        true);
+                        SyncOperation.REASON_ACCOUNTS_UPDATED, syncTargets.provider, null, true);
             }
         }
 
@@ -2665,6 +2751,26 @@
                     SyncStorageEngine.SOURCE_PERIODIC, extras,
                     syncAdapterInfo.type.allowParallelSyncs(), true, SyncOperation.NO_JOB_ID,
                     pollFrequencyMillis, flexMillis);
+
+            final int syncOpState = computeSyncOpState(op);
+            switch (syncOpState) {
+                case SYNC_OP_STATE_INVALID_NO_ACCOUNT_ACCESS: {
+                    mAccountManagerInternal.requestAccountAccess(op.target.account,
+                            op.owningPackage, UserHandle.getUserId(op.owningUid),
+                            new RemoteCallback((Bundle result) -> {
+                                if (result != null
+                                        && result.getBoolean(AccountManager.KEY_BOOLEAN_RESULT)) {
+                                    updateOrAddPeriodicSync(target, pollFrequency, flex, extras);
+                                }
+                            }
+                        ));
+                } return;
+
+                case SYNC_OP_STATE_INVALID: {
+                    return;
+                }
+            }
+
             scheduleSyncOperationH(op);
             mSyncStorageEngine.reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS);
         }
@@ -2725,29 +2831,38 @@
         /**
          * Determine if a sync is no longer valid and should be dropped.
          */
-        private boolean isOperationValid(SyncOperation op) {
+        private int computeSyncOpState(SyncOperation op) {
             final boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE);
             int state;
             final EndPoint target = op.target;
-            boolean syncEnabled = mSyncStorageEngine.getMasterSyncAutomatically(target.userId);
+
             // Drop the sync if the account of this operation no longer exists.
             AccountAndUser[] accounts = mRunningAccounts;
             if (!containsAccountAndUser(accounts, target.account, target.userId)) {
                 if (isLoggable) {
                     Slog.v(TAG, "    Dropping sync operation: account doesn't exist.");
                 }
-                return false;
+                return SYNC_OP_STATE_INVALID;
             }
             // Drop this sync request if it isn't syncable.
-            state = getIsSyncable(target.account, target.userId, target.provider);
-            if (state == 0) {
+            state = computeSyncable(target.account, target.userId, target.provider);
+            if (state == AuthorityInfo.SYNCABLE_NO_ACCOUNT_ACCESS) {
                 if (isLoggable) {
-                    Slog.v(TAG, "    Dropping sync operation: isSyncable == 0.");
+                    Slog.v(TAG, "    Dropping sync operation: "
+                            + "isSyncable == SYNCABLE_NO_ACCOUNT_ACCESS");
                 }
-                return false;
+                return SYNC_OP_STATE_INVALID_NO_ACCOUNT_ACCESS;
             }
-            syncEnabled = syncEnabled && mSyncStorageEngine.getSyncAutomatically(
-                    target.account, target.userId, target.provider);
+            if (state == AuthorityInfo.NOT_SYNCABLE) {
+                if (isLoggable) {
+                    Slog.v(TAG, "    Dropping sync operation: isSyncable == NOT_SYNCABLE");
+                }
+                return SYNC_OP_STATE_INVALID;
+            }
+
+            final boolean syncEnabled = mSyncStorageEngine.getMasterSyncAutomatically(target.userId)
+                    && mSyncStorageEngine.getSyncAutomatically(target.account,
+                            target.userId, target.provider);
 
             // We ignore system settings that specify the sync is invalid if:
             // 1) It's manual - we try it anyway. When/if it fails it will be rescheduled.
@@ -2760,9 +2875,9 @@
                 if (isLoggable) {
                     Slog.v(TAG, "    Dropping sync operation: disallowed by settings/network.");
                 }
-                return false;
+                return SYNC_OP_STATE_INVALID;
             }
-            return true;
+            return SYNC_OP_STATE_VALID;
         }
 
         private boolean dispatchSyncOperation(SyncOperation op) {
diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java
index bc3fc6a..64849aa 100644
--- a/services/core/java/com/android/server/content/SyncStorageEngine.java
+++ b/services/core/java/com/android/server/content/SyncStorageEngine.java
@@ -234,6 +234,12 @@
          */
         public static final int SYNCABLE_NOT_INITIALIZED = 2;
 
+        /**
+         * The adapter is syncable but does not have access to the synced account and needs a
+         * user access approval.
+         */
+        public static final int SYNCABLE_NO_ACCOUNT_ACCESS = 3;
+
         final EndPoint target;
         final int ident;
         boolean enabled;
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 0abd2e7..45a9644 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -1402,6 +1402,9 @@
                 throw new IllegalArgumentException("width, height, and densityDpi must be "
                         + "greater than 0");
             }
+            if (surface.isSingleBuffered()) {
+                throw new IllegalArgumentException("Surface can't be single-buffered");
+            }
 
             if ((flags & DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC) != 0) {
                 flags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR;
diff --git a/services/core/java/com/android/server/display/NightDisplayService.java b/services/core/java/com/android/server/display/NightDisplayService.java
index 07fa2ce..e7fd3d8 100644
--- a/services/core/java/com/android/server/display/NightDisplayService.java
+++ b/services/core/java/com/android/server/display/NightDisplayService.java
@@ -182,6 +182,8 @@
     }
 
     private void setUp() {
+        Slog.d(TAG, "setUp: currentUser=" + mCurrentUser);
+
         // Create a new controller for the current user and start listening for changes.
         mController = new NightDisplayController(getContext(), mCurrentUser);
         mController.setListener(this);
@@ -196,6 +198,8 @@
     }
 
     private void tearDown() {
+        Slog.d(TAG, "tearDown: currentUser=" + mCurrentUser);
+
         if (mController != null) {
             mController.setListener(null);
             mController = null;
@@ -273,6 +277,8 @@
 
     @Override
     public void onAutoModeChanged(int autoMode) {
+        Slog.d(TAG, "onAutoModeChanged: autoMode=" + autoMode);
+
         if (mAutoMode != null) {
             mAutoMode.onStop();
             mAutoMode = null;
@@ -291,6 +297,8 @@
 
     @Override
     public void onCustomStartTimeChanged(NightDisplayController.LocalTime startTime) {
+        Slog.d(TAG, "onCustomStartTimeChanged: startTime=" + startTime);
+
         if (mAutoMode != null) {
             mAutoMode.onCustomStartTimeChanged(startTime);
         }
@@ -298,6 +306,8 @@
 
     @Override
     public void onCustomEndTimeChanged(NightDisplayController.LocalTime endTime) {
+        Slog.d(TAG, "onCustomEndTimeChanged: endTime=" + endTime);
+
         if (mAutoMode != null) {
             mAutoMode.onCustomEndTimeChanged(endTime);
         }
@@ -419,7 +429,7 @@
 
         @Override
         public void onAlarm() {
-            if (DEBUG) Slog.d(TAG, "onAlarm");
+            Slog.d(TAG, "onAlarm");
             updateActivated();
         }
     }
@@ -477,7 +487,8 @@
 
         @Override
         public void onTwilightStateChanged(@Nullable TwilightState state) {
-            if (DEBUG) Slog.d(TAG, "onTwilightStateChanged");
+            Slog.d(TAG, "onTwilightStateChanged: isNight="
+                    + (state == null ? null : state.isNight()));
             updateActivated(state);
         }
     }
diff --git a/services/core/java/com/android/server/location/GpsXtraDownloader.java b/services/core/java/com/android/server/location/GpsXtraDownloader.java
index c464371..bf779859 100644
--- a/services/core/java/com/android/server/location/GpsXtraDownloader.java
+++ b/services/core/java/com/android/server/location/GpsXtraDownloader.java
@@ -22,6 +22,10 @@
 import java.io.IOException;
 import java.net.HttpURLConnection;
 import java.net.URL;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.IOException;
 import java.util.Properties;
 import java.util.Random;
 import java.util.concurrent.TimeUnit;
@@ -37,6 +41,7 @@
 
     private static final String TAG = "GpsXtraDownloader";
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+    private static final long MAXIMUM_CONTENT_LENGTH_BYTES = 1000000;  // 1MB.
     private static final String DEFAULT_USER_AGENT = "Android";
     private static final int CONNECTION_TIMEOUT_MS = (int) TimeUnit.SECONDS.toMillis(30);
 
@@ -124,7 +129,19 @@
                 return null;
             }
 
-            return Streams.readFully(connection.getInputStream());
+            try (InputStream in = connection.getInputStream()) {
+                ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+                byte[] buffer = new byte[1024];
+                int count;
+                while ((count = in.read(buffer)) != -1) {
+                    bytes.write(buffer, 0, count);
+                    if (bytes.size() > MAXIMUM_CONTENT_LENGTH_BYTES) {
+                        if (DEBUG) Log.d(TAG, "XTRA file too large");
+                        return null;
+                    }
+                }
+                return bytes.toByteArray();
+            }
         } catch (IOException ioe) {
             if (DEBUG) Log.d(TAG, "Error downloading gps XTRA: ", ioe);
         } finally {
@@ -136,3 +153,4 @@
     }
 
 }
+
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 777eee8..697186e 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -78,6 +78,8 @@
 public class MediaSessionService extends SystemService implements Monitor {
     private static final String TAG = "MediaSessionService";
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+    // Leave log for media key event always.
+    private static final boolean DEBUG_MEDIA_KEY_EVENT = DEBUG || true;
 
     private static final int WAKELOCK_TIMEOUT = 5000;
 
@@ -302,7 +304,7 @@
      */
     private void destroySessionLocked(MediaSessionRecord session) {
         if (DEBUG) {
-            Log.d(TAG, "Destroying session : " + session.toString());
+            Log.d(TAG, "Destroying " + session);
         }
         int userId = session.getUserId();
         UserRecord user = mUserRecords.get(userId);
@@ -408,7 +410,7 @@
                     if (component != null) {
                         if (compName.equals(component)) {
                             if (DEBUG) {
-                                Log.d(TAG, "ok to get sessions: " + component +
+                                Log.d(TAG, "ok to get sessions. " + component +
                                         " is authorized notification listener");
                             }
                             return true;
@@ -417,7 +419,7 @@
                 }
             }
             if (DEBUG) {
-                Log.d(TAG, "not ok to get sessions, " + compName +
+                Log.d(TAG, "not ok to get sessions. " + compName +
                         " is not in list of ENABLED_NOTIFICATION_LISTENERS for user " + userId);
             }
         }
@@ -462,7 +464,7 @@
         mHandler.post(MessageHandler.MSG_SESSIONS_CHANGED, userId, 0);
 
         if (DEBUG) {
-            Log.d(TAG, "Created session for package " + callerPackageName + " with tag " + tag);
+            Log.d(TAG, "Created session for " + callerPackageName + " with tag " + tag);
         }
         return session;
     }
@@ -881,17 +883,16 @@
 
         private void dispatchAdjustVolumeLocked(int suggestedStream, int direction, int flags,
                 MediaSessionRecord session) {
-            if (DEBUG) {
-                String description = session == null ? null : session.toString();
-                Log.d(TAG, "Adjusting session " + description + " by " + direction + ". flags="
-                        + flags + ", suggestedStream=" + suggestedStream);
-
-            }
             boolean preferSuggestedStream = false;
             if (isValidLocalStreamType(suggestedStream)
                     && AudioSystem.isStreamActive(suggestedStream, 0)) {
                 preferSuggestedStream = true;
             }
+            if (DEBUG) {
+                Log.d(TAG, "Adjusting " + session + " by " + direction + ". flags="
+                        + flags + ", suggestedStream=" + suggestedStream
+                        + ", preferSuggestedStream=" + preferSuggestedStream);
+            }
             if (session == null || preferSuggestedStream) {
                 if ((flags & AudioManager.FLAG_ACTIVE_MEDIA_ONLY) != 0
                         && !AudioSystem.isStreamActive(AudioManager.STREAM_MUSIC, 0)) {
@@ -946,8 +947,8 @@
         private void dispatchMediaKeyEventLocked(KeyEvent keyEvent, boolean needWakeLock,
                 MediaSessionRecord session) {
             if (session != null) {
-                if (DEBUG) {
-                    Log.d(TAG, "Sending media key to " + session.toString());
+                if (DEBUG_MEDIA_KEY_EVENT) {
+                    Log.d(TAG, "Sending " + keyEvent + " to " + session);
                 }
                 if (needWakeLock) {
                     mKeyEventReceiver.aquireWakeLockLocked();
@@ -966,11 +967,6 @@
                             && user.mRestoredMediaButtonReceiver == null) {
                         continue;
                     }
-                    if (DEBUG) {
-                        Log.d(TAG, "Sending media key to last known PendingIntent "
-                                + user.mLastMediaButtonReceiver + " or restored Intent "
-                                + user.mRestoredMediaButtonReceiver);
-                    }
                     if (needWakeLock) {
                         mKeyEventReceiver.aquireWakeLockLocked();
                     }
@@ -979,10 +975,19 @@
                     mediaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
                     try {
                         if (user.mLastMediaButtonReceiver != null) {
+                            if (DEBUG_MEDIA_KEY_EVENT) {
+                                Log.d(TAG, "Sending " + keyEvent
+                                        + " to the last known pendingIntent "
+                                        + user.mLastMediaButtonReceiver);
+                            }
                             user.mLastMediaButtonReceiver.send(getContext(),
                                     needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1,
                                     mediaButtonIntent, mKeyEventReceiver, mHandler);
                         } else {
+                            if (DEBUG_MEDIA_KEY_EVENT) {
+                                Log.d(TAG, "Sending " + keyEvent + " to the restored intent "
+                                        + user.mRestoredMediaButtonReceiver);
+                            }
                             mediaButtonIntent.setComponent(user.mRestoredMediaButtonReceiver);
                             getContext().sendBroadcastAsUser(mediaButtonIntent,
                                     UserHandle.of(userId));
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index da615ec..f3fc676 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -133,7 +133,6 @@
 import android.os.HandlerThread;
 import android.os.IDeviceIdleController;
 import android.os.INetworkManagementService;
-import android.os.IPowerManager;
 import android.os.Message;
 import android.os.MessageQueue.IdleHandler;
 import android.os.PowerManager;
@@ -286,7 +285,6 @@
     private static final int MSG_LIMIT_REACHED = 5;
     private static final int MSG_RESTRICT_BACKGROUND_CHANGED = 6;
     private static final int MSG_ADVISE_PERSIST_THRESHOLD = 7;
-    private static final int MSG_SCREEN_ON_CHANGED = 8;
     private static final int MSG_RESTRICT_BACKGROUND_WHITELIST_CHANGED = 9;
     private static final int MSG_UPDATE_INTERFACE_QUOTA = 10;
     private static final int MSG_REMOVE_INTERFACE_QUOTA = 11;
@@ -294,7 +292,6 @@
 
     private final Context mContext;
     private final IActivityManager mActivityManager;
-    private final IPowerManager mPowerManager;
     private final INetworkStatsService mNetworkStats;
     private final INetworkManagementService mNetworkManager;
     private UsageStatsManagerInternal mUsageStats;
@@ -312,7 +309,6 @@
 
     @GuardedBy("allLocks") volatile boolean mSystemReady;
 
-    @GuardedBy("mUidRulesFirstLock") volatile boolean mScreenOn;
     @GuardedBy("mUidRulesFirstLock") volatile boolean mRestrictBackground;
     @GuardedBy("mUidRulesFirstLock") volatile boolean mRestrictPower;
     @GuardedBy("mUidRulesFirstLock") volatile boolean mDeviceIdleMode;
@@ -418,9 +414,8 @@
     // TODO: migrate notifications to SystemUI
 
     public NetworkPolicyManagerService(Context context, IActivityManager activityManager,
-            IPowerManager powerManager, INetworkStatsService networkStats,
-            INetworkManagementService networkManagement) {
-        this(context, activityManager, powerManager, networkStats, networkManagement,
+            INetworkStatsService networkStats, INetworkManagementService networkManagement) {
+        this(context, activityManager, networkStats, networkManagement,
                 NtpTrustedTime.getInstance(context), getSystemDir(), false);
     }
 
@@ -429,12 +424,10 @@
     }
 
     public NetworkPolicyManagerService(Context context, IActivityManager activityManager,
-            IPowerManager powerManager, INetworkStatsService networkStats,
-            INetworkManagementService networkManagement, TrustedTime time, File systemDir,
-            boolean suppressDefaultPolicy) {
+            INetworkStatsService networkStats, INetworkManagementService networkManagement,
+            TrustedTime time, File systemDir, boolean suppressDefaultPolicy) {
         mContext = checkNotNull(context, "missing context");
         mActivityManager = checkNotNull(activityManager, "missing activityManager");
-        mPowerManager = checkNotNull(powerManager, "missing powerManager");
         mNetworkStats = checkNotNull(networkStats, "missing networkStats");
         mNetworkManager = checkNotNull(networkManagement, "missing networkManagement");
         mDeviceIdleController = IDeviceIdleController.Stub.asInterface(ServiceManager.getService(
@@ -618,8 +611,6 @@
             }
         }
 
-        updateScreenOn();
-
         try {
             mActivityManager.registerUidObserver(mUidObserver,
                     ActivityManager.UID_OBSERVER_PROCSTATE|ActivityManager.UID_OBSERVER_GONE);
@@ -628,14 +619,6 @@
             // ignored; both services live in system_server
         }
 
-        // TODO: traverse existing processes to know foreground state, or have
-        // activitymanager dispatch current state when new observer attached.
-
-        final IntentFilter screenFilter = new IntentFilter();
-        screenFilter.addAction(Intent.ACTION_SCREEN_ON);
-        screenFilter.addAction(Intent.ACTION_SCREEN_OFF);
-        mContext.registerReceiver(mScreenReceiver, screenFilter);
-
         // listen for changes to power save whitelist
         final IntentFilter whitelistFilter = new IntentFilter(
                 PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED);
@@ -734,15 +717,6 @@
         }
     };
 
-    final private BroadcastReceiver mScreenReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            // screen-related broadcasts are protected by system, no need
-            // for permissions check.
-            mHandler.obtainMessage(MSG_SCREEN_ON_CHANGED).sendToTarget();
-        }
-    };
-
     final private BroadcastReceiver mPackageReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -2520,7 +2494,7 @@
 
     private boolean isUidStateForegroundUL(int state) {
         // only really in foreground when screen is also on
-        return mScreenOn && state <= ActivityManager.PROCESS_STATE_TOP;
+        return state <= ActivityManager.PROCESS_STATE_TOP;
     }
 
     /**
@@ -2591,31 +2565,6 @@
         }
     }
 
-    private void updateScreenOn() {
-        synchronized (mUidRulesFirstLock) {
-            try {
-                mScreenOn = mPowerManager.isInteractive();
-            } catch (RemoteException e) {
-                // ignored; service lives in system_server
-            }
-            updateRulesForScreenUL();
-        }
-    }
-
-    /**
-     * Update rules that might be changed by {@link #mScreenOn} value.
-     */
-    private void updateRulesForScreenUL() {
-        // only update rules for anyone with foreground activities
-        final int size = mUidState.size();
-        for (int i = 0; i < size; i++) {
-            if (mUidState.valueAt(i) <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
-                final int uid = mUidState.keyAt(i);
-                updateRestrictionRulesForUidUL(uid);
-            }
-        }
-    }
-
     static boolean isProcStateAllowedWhileIdleOrPowerSaveMode(int procState) {
         return procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
     }
@@ -2997,12 +2946,8 @@
             mUidRules.put(uid, newUidRules);
         }
 
-        boolean changed = false;
-
         // Second step: apply bw changes based on change of state.
         if (newRule != oldRule) {
-            changed = true;
-
             if ((newRule & RULE_TEMPORARY_ALLOW_METERED) != 0) {
                 // Temporarily whitelist foreground app, removing from blacklist if necessary
                 // (since bw_penalty_box prevails over bw_happy_box).
@@ -3082,7 +3027,6 @@
 
         final boolean isIdle = isUidIdle(uid);
         final boolean restrictMode = isIdle || mRestrictPower || mDeviceIdleMode;
-        final int uidPolicy = mUidPolicy.get(uid, POLICY_NONE);
         final int oldUidRules = mUidRules.get(uid, RULE_NONE);
         final boolean isForeground = isUidForegroundOnRestrictPowerUL(uid);
 
@@ -3105,7 +3049,7 @@
         final int newUidRules = (oldUidRules & MASK_METERED_NETWORKS) | newRule;
 
         if (LOGV) {
-            Log.v(TAG, "updateRulesForNonMeteredNetworksUL(" + uid + ")"
+            Log.v(TAG, "updateRulesForPowerRestrictionsUL(" + uid + ")"
                     + ", isIdle: " + isIdle
                     + ", mRestrictPower: " + mRestrictPower
                     + ", mDeviceIdleMode: " + mDeviceIdleMode
@@ -3347,10 +3291,6 @@
                     }
                     return true;
                 }
-                case MSG_SCREEN_ON_CHANGED: {
-                    updateScreenOn();
-                    return true;
-                }
                 case MSG_UPDATE_INTERFACE_QUOTA: {
                     removeInterfaceQuota((String) msg.obj);
                     // int params need to be stitched back into a long
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 6a56fa6..d25abbf 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -870,13 +870,8 @@
                 IntentSender statusReceiver, int userId) {
         final int callingUid = Binder.getCallingUid();
         mPm.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall");
-        boolean allowSilentUninstall = true;
         if ((callingUid != Process.SHELL_UID) && (callingUid != Process.ROOT_UID)) {
             mAppOps.checkPackage(callingUid, callerPackageName);
-            final String installerPackageName = mPm.getInstallerPackageName(packageName);
-            allowSilentUninstall = mPm.isOrphaned(packageName) ||
-                    (installerPackageName != null
-                            && installerPackageName.equals(callerPackageName));
         }
 
         // Check whether the caller is device owner, in which case we do it silently.
@@ -887,8 +882,8 @@
 
         final PackageDeleteObserverAdapter adapter = new PackageDeleteObserverAdapter(mContext,
                 statusReceiver, packageName, isDeviceOwner, userId);
-        if (allowSilentUninstall && mContext.checkCallingOrSelfPermission(
-                android.Manifest.permission.DELETE_PACKAGES) == PackageManager.PERMISSION_GRANTED) {
+        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DELETE_PACKAGES)
+                    == PackageManager.PERMISSION_GRANTED) {
             // Sweet, call straight through!
             mPm.deletePackage(packageName, adapter.getBinder(), userId, flags);
         } else if (isDeviceOwner) {
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 6cdc40f..5831284 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -109,6 +109,7 @@
     final int installerUid;
     final SessionParams params;
     final long createdMillis;
+    final int defaultContainerGid;
 
     /** Staging location where client data is written. */
     final File stageDir;
@@ -199,13 +200,19 @@
     private final Handler.Callback mHandlerCallback = new Handler.Callback() {
         @Override
         public boolean handleMessage(Message msg) {
+            // Cache package manager data without the lock held
+            final PackageInfo pkgInfo = mPm.getPackageInfo(
+                    params.appPackageName, PackageManager.GET_SIGNATURES /*flags*/, userId);
+            final ApplicationInfo appInfo = mPm.getApplicationInfo(
+                    params.appPackageName, 0, userId);
+
             synchronized (mLock) {
                 if (msg.obj != null) {
                     mRemoteObserver = (IPackageInstallObserver2) msg.obj;
                 }
 
                 try {
-                    commitLocked();
+                    commitLocked(pkgInfo, appInfo);
                 } catch (PackageManagerException e) {
                     final String completeMsg = ExceptionUtils.getCompleteMessage(e);
                     Slog.e(TAG, "Commit of session " + sessionId + " failed: " + completeMsg);
@@ -264,6 +271,9 @@
         } else {
             mPermissionsAccepted = false;
         }
+        final int uid = mPm.getPackageUid(PackageManagerService.DEFAULT_CONTAINER_PACKAGE,
+                PackageManager.MATCH_SYSTEM_ONLY, UserHandle.USER_SYSTEM);
+        defaultContainerGid = UserHandle.getSharedAppGid(uid);
     }
 
     public SessionInfo generateInfo() {
@@ -520,7 +530,8 @@
         mHandler.obtainMessage(MSG_COMMIT, adapter.getBinder()).sendToTarget();
     }
 
-    private void commitLocked() throws PackageManagerException {
+    private void commitLocked(PackageInfo pkgInfo, ApplicationInfo appInfo)
+            throws PackageManagerException {
         if (mDestroyed) {
             throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR, "Session destroyed");
         }
@@ -538,7 +549,7 @@
         // Verify that stage looks sane with respect to existing application.
         // This currently only ensures packageName, versionCode, and certificate
         // consistency.
-        validateInstallLocked();
+        validateInstallLocked(pkgInfo, appInfo);
 
         Preconditions.checkNotNull(mPackageName);
         Preconditions.checkNotNull(mSignatures);
@@ -650,7 +661,8 @@
      * Note that upgrade compatibility is still performed by
      * {@link PackageManagerService}.
      */
-    private void validateInstallLocked() throws PackageManagerException {
+    private void validateInstallLocked(PackageInfo pkgInfo, ApplicationInfo appInfo)
+            throws PackageManagerException {
         mPackageName = null;
         mVersionCode = -1;
         mSignatures = null;
@@ -729,10 +741,8 @@
 
         if (removeSplitList.size() > 0) {
             // validate split names marked for removal
-            final int flags = mSignatures == null ? PackageManager.GET_SIGNATURES : 0;
-            final PackageInfo pkg = mPm.getPackageInfo(params.appPackageName, flags, userId);
             for (String splitName : removeSplitList) {
-                if (!ArrayUtils.contains(pkg.splitNames, splitName)) {
+                if (!ArrayUtils.contains(pkgInfo.splitNames, splitName)) {
                     throw new PackageManagerException(INSTALL_FAILED_INVALID_APK,
                             "Split not found: " + splitName);
                 }
@@ -740,11 +750,11 @@
 
             // ensure we've got appropriate package name, version code and signatures
             if (mPackageName == null) {
-                mPackageName = pkg.packageName;
-                mVersionCode = pkg.versionCode;
+                mPackageName = pkgInfo.packageName;
+                mVersionCode = pkgInfo.versionCode;
             }
             if (mSignatures == null) {
-                mSignatures = pkg.signatures;
+                mSignatures = pkgInfo.signatures;
             }
         }
 
@@ -757,8 +767,7 @@
 
         } else {
             // Partial installs must be consistent with existing install
-            final ApplicationInfo app = mPm.getApplicationInfo(mPackageName, 0, userId);
-            if (app == null) {
+            if (appInfo == null) {
                 throw new PackageManagerException(INSTALL_FAILED_INVALID_APK,
                         "Missing existing base package for " + mPackageName);
             }
@@ -766,8 +775,8 @@
             final PackageLite existing;
             final ApkLite existingBase;
             try {
-                existing = PackageParser.parsePackageLite(new File(app.getCodePath()), 0);
-                existingBase = PackageParser.parseApkLite(new File(app.getBaseCodePath()),
+                existing = PackageParser.parsePackageLite(new File(appInfo.getCodePath()), 0);
+                existingBase = PackageParser.parseApkLite(new File(appInfo.getBaseCodePath()),
                         PackageParser.PARSE_COLLECT_CERTIFICATES);
             } catch (PackageParserException e) {
                 throw PackageManagerException.from(e);
@@ -777,7 +786,7 @@
 
             // Inherit base if not overridden
             if (mResolvedBaseFile == null) {
-                mResolvedBaseFile = new File(app.getBaseCodePath());
+                mResolvedBaseFile = new File(appInfo.getBaseCodePath());
                 mResolvedInheritedFiles.add(mResolvedBaseFile);
             }
 
@@ -794,7 +803,7 @@
             }
 
             // Inherit compiled oat directory.
-            final File packageInstallDir = (new File(app.getBaseCodePath())).getParentFile();
+            final File packageInstallDir = (new File(appInfo.getBaseCodePath())).getParentFile();
             mInheritedFilesBase = packageInstallDir;
             final File oatDir = new File(packageInstallDir, "oat");
             if (oatDir.exists()) {
@@ -822,7 +831,8 @@
         }
     }
 
-    private void assertApkConsistent(String tag, ApkLite apk) throws PackageManagerException {
+    private void assertApkConsistent(String tag, ApkLite apk)
+            throws PackageManagerException {
         if (!mPackageName.equals(apk.packageName)) {
             throw new PackageManagerException(INSTALL_FAILED_INVALID_APK, tag + " package "
                     + apk.packageName + " inconsistent with " + mPackageName);
@@ -1035,10 +1045,7 @@
                     "Failed to finalize container " + cid);
         }
 
-        final int uid = mPm.getPackageUid(PackageManagerService.DEFAULT_CONTAINER_PACKAGE,
-                PackageManager.MATCH_SYSTEM_ONLY, UserHandle.USER_SYSTEM);
-        final int gid = UserHandle.getSharedAppGid(uid);
-        if (!PackageHelper.fixSdPermissions(cid, gid, null)) {
+        if (!PackageHelper.fixSdPermissions(cid, defaultContainerGid, null)) {
             throw new PackageManagerException(INSTALL_FAILED_CONTAINER_ERROR,
                     "Failed to fix permissions on container " + cid);
         }
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index f326555..f84356b 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -177,6 +177,7 @@
 import android.os.Message;
 import android.os.Parcel;
 import android.os.ParcelFileDescriptor;
+import android.os.PatternMatcher;
 import android.os.Process;
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
@@ -196,6 +197,7 @@
 import android.os.storage.VolumeInfo;
 import android.os.storage.VolumeRecord;
 import android.provider.Settings.Global;
+import android.provider.Settings.Secure;
 import android.security.KeyStore;
 import android.security.SystemKeyStore;
 import android.system.ErrnoException;
@@ -363,6 +365,7 @@
 
     static final boolean CLEAR_RUNTIME_PERMISSIONS_ON_UPGRADE = false;
 
+    // STOPSHIP; b/30256615
     private static final boolean DISABLE_EPHEMERAL_APPS = !Build.IS_DEBUGGABLE;
 
     private static final int RADIO_UID = Process.PHONE_UID;
@@ -531,6 +534,7 @@
     final String[] mSeparateProcesses;
     final boolean mIsUpgrade;
     final boolean mIsPreNUpgrade;
+    final boolean mIsPreNMR1Upgrade;
 
     /** The location for ASEC container files on internal storage. */
     final String mAsecInternalPath;
@@ -2238,6 +2242,8 @@
             // as there is no profiling data available.
             mIsPreNUpgrade = mIsUpgrade && ver.sdkVersion < Build.VERSION_CODES.N;
 
+            mIsPreNMR1Upgrade = mIsUpgrade && ver.sdkVersion < Build.VERSION_CODES.N_MR1;
+
             // save off the names of pre-existing system packages prior to scanning; we don't
             // want to automatically grant runtime permissions for new system apps
             if (mPromoteSystemApps) {
@@ -4722,20 +4728,6 @@
 
             final ResolveInfo bestChoice =
                     chooseBestActivity(intent, resolvedType, flags, query, userId);
-
-            if (isEphemeralAllowed(intent, query, userId)) {
-                Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "resolveEphemeral");
-                final EphemeralResolveInfo ai =
-                        getEphemeralResolveInfo(intent, resolvedType, userId);
-                if (ai != null) {
-                    if (DEBUG_EPHEMERAL) {
-                        Slog.v(TAG, "Returning an EphemeralResolveInfo");
-                    }
-                    bestChoice.ephemeralInstaller = mEphemeralInstallerInfo;
-                    bestChoice.ephemeralResolveInfo = ai;
-                }
-                Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
-            }
             return bestChoice;
         } finally {
             Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
@@ -4776,11 +4768,23 @@
                 false, false, false, userId);
     }
 
+    private boolean isEphemeralDisabled() {
+        // ephemeral apps have been disabled across the board
+        if (DISABLE_EPHEMERAL_APPS) {
+            return true;
+        }
+        // system isn't up yet; can't read settings, so, assume no ephemeral apps
+        if (!mSystemReady) {
+            return true;
+        }
+        return Secure.getInt(mContext.getContentResolver(), Secure.WEB_ACTION_ENABLED, 1) == 0;
+    }
 
     private boolean isEphemeralAllowed(
-            Intent intent, List<ResolveInfo> resolvedActivites, int userId) {
+            Intent intent, List<ResolveInfo> resolvedActivities, int userId,
+            boolean skipPackageCheck) {
         // Short circuit and return early if possible.
-        if (DISABLE_EPHEMERAL_APPS) {
+        if (isEphemeralDisabled()) {
             return false;
         }
         final int callingUser = UserHandle.getCallingUserId();
@@ -4793,18 +4797,21 @@
         if (intent.getComponent() != null) {
             return false;
         }
-        if (intent.getPackage() != null) {
+        if ((intent.getFlags() & Intent.FLAG_IGNORE_EPHEMERAL) != 0) {
+            return false;
+        }
+        if (!skipPackageCheck && intent.getPackage() != null) {
             return false;
         }
         final boolean isWebUri = hasWebURI(intent);
-        if (!isWebUri) {
+        if (!isWebUri || intent.getData().getHost() == null) {
             return false;
         }
         // Deny ephemeral apps if the user chose _ALWAYS or _ALWAYS_ASK for intent resolution.
         synchronized (mPackages) {
-            final int count = resolvedActivites.size();
+            final int count = (resolvedActivities == null ? 0 : resolvedActivities.size());
             for (int n = 0; n < count; n++) {
-                ResolveInfo info = resolvedActivites.get(n);
+                ResolveInfo info = resolvedActivities.get(n);
                 String packageName = info.activityInfo.packageName;
                 PackageSetting ps = mSettings.mPackages.get(packageName);
                 if (ps != null) {
@@ -4826,19 +4833,19 @@
         return true;
     }
 
-    private EphemeralResolveInfo getEphemeralResolveInfo(Intent intent, String resolvedType,
-            int userId) {
-        final int ephemeralPrefixMask = Global.getInt(mContext.getContentResolver(),
+    private static EphemeralResolveInfo getEphemeralResolveInfo(
+            Context context, EphemeralResolverConnection resolverConnection, Intent intent,
+            String resolvedType, int userId, String packageName) {
+        final int ephemeralPrefixMask = Global.getInt(context.getContentResolver(),
                 Global.EPHEMERAL_HASH_PREFIX_MASK, DEFAULT_EPHEMERAL_HASH_PREFIX_MASK);
-        final int ephemeralPrefixCount = Global.getInt(mContext.getContentResolver(),
+        final int ephemeralPrefixCount = Global.getInt(context.getContentResolver(),
                 Global.EPHEMERAL_HASH_PREFIX_COUNT, DEFAULT_EPHEMERAL_HASH_PREFIX_COUNT);
         final EphemeralDigest digest = new EphemeralDigest(intent.getData(), ephemeralPrefixMask,
                 ephemeralPrefixCount);
         final int[] shaPrefix = digest.getDigestPrefix();
         final byte[][] digestBytes = digest.getDigestBytes();
         final List<EphemeralResolveInfo> ephemeralResolveInfoList =
-                mEphemeralResolverConnection.getEphemeralResolveInfoList(
-                        shaPrefix, ephemeralPrefixMask);
+                resolverConnection.getEphemeralResolveInfoList(shaPrefix, ephemeralPrefixMask);
         if (ephemeralResolveInfoList == null || ephemeralResolveInfoList.size() == 0) {
             // No hash prefix match; there are no ephemeral apps for this domain.
             return null;
@@ -4855,6 +4862,10 @@
                 if (filters.isEmpty()) {
                     continue;
                 }
+                if (packageName != null
+                        && !packageName.equals(ephemeralApplication.getPackageName())) {
+                    continue;
+                }
                 // We have a domain match; resolve the filters to see if anything matches.
                 final EphemeralIntentResolver ephemeralResolver = new EphemeralIntentResolver();
                 for (int j = filters.size() - 1; j >= 0; --j) {
@@ -5258,8 +5269,12 @@
         }
 
         // reader
+        boolean sortResult = false;
+        boolean addEphemeral = false;
+        boolean matchEphemeralPackage = false;
+        List<ResolveInfo> result;
+        final String pkgName = intent.getPackage();
         synchronized (mPackages) {
-            final String pkgName = intent.getPackage();
             if (pkgName == null) {
                 List<CrossProfileIntentFilter> matchingFilters =
                         getMatchingCrossProfileIntentFilters(intent, resolvedType, userId);
@@ -5267,15 +5282,16 @@
                 ResolveInfo xpResolveInfo  = querySkipCurrentProfileIntents(matchingFilters, intent,
                         resolvedType, flags, userId);
                 if (xpResolveInfo != null) {
-                    List<ResolveInfo> result = new ArrayList<ResolveInfo>(1);
-                    result.add(xpResolveInfo);
-                    return filterIfNotSystemUser(result, userId);
+                    List<ResolveInfo> xpResult = new ArrayList<ResolveInfo>(1);
+                    xpResult.add(xpResolveInfo);
+                    return filterIfNotSystemUser(xpResult, userId);
                 }
 
                 // Check for results in the current profile.
-                List<ResolveInfo> result = mActivities.queryIntent(
-                        intent, resolvedType, flags, userId);
-                result = filterIfNotSystemUser(result, userId);
+                result = filterIfNotSystemUser(mActivities.queryIntent(
+                        intent, resolvedType, flags, userId), userId);
+                addEphemeral =
+                        isEphemeralAllowed(intent, result, userId, false /*skipPackageCheck*/);
 
                 // Check for cross profile results.
                 boolean hasNonNegativePriorityResult = hasNonNegativePriority(result);
@@ -5287,7 +5303,7 @@
                             Collections.singletonList(xpResolveInfo), userId).size() > 0;
                     if (isVisibleToUser) {
                         result.add(xpResolveInfo);
-                        Collections.sort(result, mResolvePrioritySorter);
+                        sortResult = true;
                     }
                 }
                 if (hasWebURI(intent)) {
@@ -5303,28 +5319,61 @@
                             // in the result.
                             result.remove(xpResolveInfo);
                         }
-                        if (result.size() == 0) {
+                        if (result.size() == 0 && !addEphemeral) {
                             result.add(xpDomainInfo.resolveInfo);
                             return result;
                         }
-                    } else if (result.size() <= 1) {
-                        return result;
                     }
-                    result = filterCandidatesWithDomainPreferredActivitiesLPr(intent, flags, result,
-                            xpDomainInfo, userId);
-                    Collections.sort(result, mResolvePrioritySorter);
+                    if (result.size() > 1 || addEphemeral) {
+                        result = filterCandidatesWithDomainPreferredActivitiesLPr(
+                                intent, flags, result, xpDomainInfo, userId);
+                        sortResult = true;
+                    }
                 }
-                return result;
+            } else {
+                final PackageParser.Package pkg = mPackages.get(pkgName);
+                if (pkg != null) {
+                    result = filterIfNotSystemUser(
+                            mActivities.queryIntentForPackage(
+                                    intent, resolvedType, flags, pkg.activities, userId),
+                            userId);
+                } else {
+                    // the caller wants to resolve for a particular package; however, there
+                    // were no installed results, so, try to find an ephemeral result
+                    addEphemeral = isEphemeralAllowed(
+                            intent, null /*result*/, userId, true /*skipPackageCheck*/);
+                    matchEphemeralPackage = true;
+                    result = new ArrayList<ResolveInfo>();
+                }
             }
-            final PackageParser.Package pkg = mPackages.get(pkgName);
-            if (pkg != null) {
-                return filterIfNotSystemUser(
-                        mActivities.queryIntentForPackage(
-                                intent, resolvedType, flags, pkg.activities, userId),
-                        userId);
-            }
-            return new ArrayList<ResolveInfo>();
         }
+        if (addEphemeral) {
+            Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "resolveEphemeral");
+            final EphemeralResolveInfo ai = getEphemeralResolveInfo(
+                    mContext, mEphemeralResolverConnection, intent, resolvedType, userId,
+                    matchEphemeralPackage ? pkgName : null);
+            if (ai != null) {
+                if (DEBUG_EPHEMERAL) {
+                    Slog.v(TAG, "Adding ephemeral installer to the ResolveInfo list");
+                }
+                final ResolveInfo ephemeralInstaller = new ResolveInfo(mEphemeralInstallerInfo);
+                ephemeralInstaller.ephemeralResolveInfo = ai;
+                // make sure this resolver is the default
+                ephemeralInstaller.isDefault = true;
+                ephemeralInstaller.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART
+                        | IntentFilter.MATCH_ADJUSTMENT_NORMAL;
+                // add a non-generic filter
+                ephemeralInstaller.filter = new IntentFilter(intent.getAction());
+                ephemeralInstaller.filter.addDataPath(
+                        intent.getData().getPath(), PatternMatcher.PATTERN_LITERAL);
+                result.add(ephemeralInstaller);
+            }
+            Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
+        }
+        if (sortResult) {
+            Collections.sort(result, mResolvePrioritySorter);
+        }
+        return result;
     }
 
     private static class CrossProfileDomainInfo {
@@ -6204,7 +6253,7 @@
 
     @Override
     public ParceledListSlice<EphemeralApplicationInfo> getEphemeralApplications(int userId) {
-        if (DISABLE_EPHEMERAL_APPS) {
+        if (isEphemeralDisabled()) {
             return null;
         }
 
@@ -6228,7 +6277,7 @@
         enforceCrossUserPermission(Binder.getCallingUid(), userId,
                 true /* requireFullPermission */, false /* checkShell */,
                 "isEphemeral");
-        if (DISABLE_EPHEMERAL_APPS) {
+        if (isEphemeralDisabled()) {
             return false;
         }
 
@@ -6246,7 +6295,7 @@
 
     @Override
     public byte[] getEphemeralApplicationCookie(String packageName, int userId) {
-        if (DISABLE_EPHEMERAL_APPS) {
+        if (isEphemeralDisabled()) {
             return null;
         }
 
@@ -6264,7 +6313,7 @@
 
     @Override
     public boolean setEphemeralApplicationCookie(String packageName, byte[] cookie, int userId) {
-        if (DISABLE_EPHEMERAL_APPS) {
+        if (isEphemeralDisabled()) {
             return true;
         }
 
@@ -6282,7 +6331,7 @@
 
     @Override
     public Bitmap getEphemeralApplicationIcon(String packageName, int userId) {
-        if (DISABLE_EPHEMERAL_APPS) {
+        if (isEphemeralDisabled()) {
             return null;
         }
 
@@ -6612,9 +6661,13 @@
 
     private void collectCertificatesLI(PackageSetting ps, PackageParser.Package pkg, File srcFile,
             final int policyFlags) throws PackageManagerException {
+        // When upgrading from pre-N MR1, verify the package time stamp using the package
+        // directory and not the APK file.
+        final long lastModifiedTime = mIsPreNMR1Upgrade
+                ? new File(pkg.codePath).lastModified() : getLastModifiedTime(pkg, srcFile);
         if (ps != null
                 && ps.codePath.equals(srcFile)
-                && ps.timeStamp == getLastModifiedTime(pkg, srcFile)
+                && ps.timeStamp == lastModifiedTime
                 && !isCompatSignatureUpdateNeeded(pkg)
                 && !isRecoverSignatureUpdateNeeded(pkg)) {
             long mSigningKeySetId = ps.keySetData.getProperSigningKeySet();
@@ -6636,7 +6689,7 @@
             Slog.w(TAG, "PackageSetting for " + ps.name
                     + " is missing signatures.  Collecting certs again to recover them.");
         } else {
-            Log.i(TAG, srcFile.toString() + " changed; collecting certs");
+            Slog.i(TAG, srcFile.toString() + " changed; collecting certs");
         }
 
         try {
@@ -8366,6 +8419,10 @@
             pkg.applicationInfo.flags |= ApplicationInfo.FLAG_FACTORY_TEST;
         }
 
+        if (isSystemApp(pkg)) {
+            pkgSetting.isOrphaned = true;
+        }
+
         ArrayList<PackageParser.Package> clientLibPkgs = null;
 
         if ((scanFlags & SCAN_CHECK_ONLY) != 0) {
@@ -8649,7 +8706,9 @@
             for (i=0; i<N; i++) {
                 PackageParser.PermissionGroup pg = pkg.permissionGroups.get(i);
                 PackageParser.PermissionGroup cur = mPermissionGroups.get(pg.info.name);
-                if (cur == null) {
+                final String curPackageName = cur == null ? null : cur.info.packageName;
+                final boolean isPackageUpdate = pg.info.packageName.equals(curPackageName);
+                if (cur == null || isPackageUpdate) {
                     mPermissionGroups.put(pg.info.name, pg);
                     if ((policyFlags&PackageParser.PARSE_CHATTY) != 0) {
                         if (r == null) {
@@ -8657,6 +8716,9 @@
                         } else {
                             r.append(' ');
                         }
+                        if (isPackageUpdate) {
+                            r.append("UPD:");
+                        }
                         r.append(pg.info.name);
                     }
                 } else {
@@ -9189,15 +9251,17 @@
         mEphemeralInstallerActivity.packageName = pkg.applicationInfo.packageName;
         mEphemeralInstallerActivity.processName = pkg.applicationInfo.packageName;
         mEphemeralInstallerActivity.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
-        mEphemeralInstallerActivity.flags = ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS |
-                ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS;
+        mEphemeralInstallerActivity.flags = ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS
+                | ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS;
         mEphemeralInstallerActivity.theme = 0;
         mEphemeralInstallerActivity.exported = true;
         mEphemeralInstallerActivity.enabled = true;
         mEphemeralInstallerInfo.activityInfo = mEphemeralInstallerActivity;
         mEphemeralInstallerInfo.priority = 0;
-        mEphemeralInstallerInfo.preferredOrder = 0;
-        mEphemeralInstallerInfo.match = 0;
+        mEphemeralInstallerInfo.preferredOrder = 1;
+        mEphemeralInstallerInfo.isDefault = true;
+        mEphemeralInstallerInfo.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART
+                | IntentFilter.MATCH_ADJUSTMENT_NORMAL;
 
         if (DEBUG_EPHEMERAL) {
             Slog.d(TAG, "Set ephemeral installer activity: " + mEphemeralInstallerComponent);
@@ -15310,6 +15374,19 @@
         Preconditions.checkNotNull(packageName);
         Preconditions.checkNotNull(observer);
         final int uid = Binder.getCallingUid();
+        if (uid != Process.SHELL_UID && uid != Process.ROOT_UID && uid != Process.SYSTEM_UID
+                && uid != getPackageUid(mRequiredInstallerPackage, 0, UserHandle.getUserId(uid))
+                && !isOrphaned(packageName)
+                && !isCallerSameAsInstaller(uid, packageName)) {
+            try {
+                final Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE);
+                intent.setData(Uri.fromParts("package", packageName, null));
+                intent.putExtra(PackageInstaller.EXTRA_CALLBACK, observer.asBinder());
+                observer.onUserActionRequired(intent);
+            } catch (RemoteException re) {
+            }
+            return;
+        }
         final boolean deleteAllUsers = (deleteFlags & PackageManager.DELETE_ALL_USERS) != 0;
         final int[] users = deleteAllUsers ? sUserManager.getUserIds() : new int[]{ userId };
         if (UserHandle.getUserId(uid) != userId || (deleteAllUsers && users.length > 1)) {
@@ -15378,6 +15455,12 @@
         });
     }
 
+    private boolean isCallerSameAsInstaller(int callingUid, String pkgName) {
+        final int installerPkgUid = getPackageUid(getInstallerPackageName(pkgName),
+                0 /* flags */, UserHandle.getUserId(callingUid));
+        return installerPkgUid == callingUid;
+    }
+
     private int[] getBlockUninstallForUsers(String packageName, int[] userIds) {
         int[] result = EMPTY_INT_ARRAY;
         for (int userId : userIds) {
diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java
index 827b88a..6f6fd7c 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackage.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackage.java
@@ -667,6 +667,12 @@
                 // - version code hasn't change
                 // - lastUpdateTime hasn't change
                 // - all target activities are still enabled.
+
+                // Note, system apps timestamps do *not* change after OTAs.  (But they do
+                // after an adb sync or a local flash.)
+                // This means if a system app's version code doesn't change on an OTA,
+                // we don't notice it's updated.  But that's fine since their version code *should*
+                // really change on OTAs.
                 if ((getPackageInfo().getVersionCode() == pi.versionCode)
                         && (getPackageInfo().getLastUpdateTime() == pi.lastUpdateTime)
                         && areAllActivitiesStillEnabled()) {
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index c1fc7f1..adf19dc 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -54,6 +54,7 @@
 import android.graphics.drawable.Icon;
 import android.net.Uri;
 import android.os.Binder;
+import android.os.Build;
 import android.os.Environment;
 import android.os.FileUtils;
 import android.os.Handler;
@@ -324,10 +325,30 @@
         int CHECK_LAUNCHER_ACTIVITY = 12;
         int IS_ACTIVITY_ENABLED = 13;
         int PACKAGE_UPDATE_CHECK = 14;
+        int ASYNC_PRELOAD_USER_DELAY = 15;
 
-        int COUNT = PACKAGE_UPDATE_CHECK + 1;
+        int COUNT = ASYNC_PRELOAD_USER_DELAY + 1;
     }
 
+    private static final String[] STAT_LABELS = {
+            "getHomeActivities()",
+            "Launcher permission check",
+            "getPackageInfo()",
+            "getPackageInfo(SIG)",
+            "getApplicationInfo",
+            "cleanupDanglingBitmaps",
+            "getActivity+metadata",
+            "getInstalledPackages",
+            "checkPackageChanges",
+            "getApplicationResources",
+            "resourceNameLookup",
+            "getLauncherActivity",
+            "checkLauncherActivity",
+            "isActivityEnabled",
+            "packageUpdateCheck",
+            "asyncPreloadUserDelay"
+    };
+
     final Object mStatLock = new Object();
 
     @GuardedBy("mStatLock")
@@ -533,19 +554,26 @@
     /** lifecycle event */
     void handleUnlockUser(int userId) {
         if (DEBUG) {
-            Slog.d(TAG, "handleUnlockUser: user=" + userId);
+        Slog.d(TAG, "handleUnlockUser: user=" + userId);
         }
         synchronized (mLock) {
             mUnlockedUsers.put(userId, true);
-
-            // Preload the user's shortcuts.
-            // Also see if the locale has changed.
-            // Note as of nyc, the locale is per-user, so the locale shouldn't change
-            // when the user is locked.  However due to b/30119489 it still happens.
-            getUserShortcutsLocked(userId).detectLocaleChange();
-
-            checkPackageChanges(userId);
         }
+
+        // Preload the user data.
+        // Note, we don't use mHandler here but instead just start a new thread.
+        // This is because mHandler (which uses com.android.internal.os.BackgroundThread) is very
+        // busy at this point and this could take hundreds of milliseconds, which would be too
+        // late since the launcher would already have started.
+        // So we just create a new thread.  This code runs rarely, so we don't use a thread pool
+        // or anything.
+        final long start = injectElapsedRealtime();
+        injectRunOnNewThread(() -> {
+            synchronized (mLock) {
+                logDurationStat(Stats.ASYNC_PRELOAD_USER_DELAY, start);
+                getUserShortcutsLocked(userId);
+            }
+        });
     }
 
     /** lifecycle event */
@@ -1110,6 +1138,9 @@
                 userPackages = new ShortcutUser(this, userId);
             }
             mUsers.put(userId, userPackages);
+
+            // Also when a user's data is first accessed, scan all packages.
+            checkPackageChanges(userId);
         }
         return userPackages;
     }
@@ -1468,6 +1499,10 @@
         mHandler.post(r);
     }
 
+    void injectRunOnNewThread(Runnable r) {
+        new Thread(r).start();
+    }
+
     /**
      * @throws IllegalArgumentException if {@code numShortcuts} is bigger than
      *                                  {@link #getMaxActivityShortcuts()}.
@@ -2625,10 +2660,14 @@
             boolean forceRescan) {
         final ShortcutUser user = getUserShortcutsLocked(userId);
 
+        // Note after each OTA, we'll need to rescan all system apps, as their lastUpdateTime
+        // is not reliable.
         final long now = injectCurrentTimeMillis();
+        final boolean afterOta =
+                !injectBuildFingerprint().equals(user.getLastAppScanOsFingerprint());
 
         // Then for each installed app, publish manifest shortcuts when needed.
-        forUpdatedPackages(userId, lastScanTime, ai -> {
+        forUpdatedPackages(userId, lastScanTime, afterOta, ai -> {
             user.attemptToRestoreIfNeededAndSave(this, ai.packageName, userId);
             user.rescanPackageIfNeeded(ai.packageName, forceRescan);
         });
@@ -2636,6 +2675,7 @@
         // Write the time just before the scan, because there may be apps that have just
         // been updated, and we want to catch them in the next time.
         user.setLastAppScanTime(now);
+        user.setLastAppScanOsFingerprint(injectBuildFingerprint());
         scheduleSaveUser(userId);
     }
 
@@ -2874,7 +2914,7 @@
         return parceledList.getList();
     }
 
-    private void forUpdatedPackages(@UserIdInt int userId, long lastScanTime,
+    private void forUpdatedPackages(@UserIdInt int userId, long lastScanTime, boolean afterOta,
             Consumer<ApplicationInfo> callback) {
         if (DEBUG) {
             Slog.d(TAG, "forUpdatedPackages for user " + userId + ", lastScanTime=" + lastScanTime);
@@ -2886,7 +2926,8 @@
             // If the package has been updated since the last scan time, then scan it.
             // Also if it's a system app with no update, lastUpdateTime is not reliable, so
             // just scan it.
-            if (pi.lastUpdateTime >= lastScanTime || isPureSystemApp(pi.applicationInfo)) {
+            if (pi.lastUpdateTime >= lastScanTime
+                    || (afterOta && isPureSystemApp(pi.applicationInfo))) {
                 if (DEBUG) {
                     Slog.d(TAG, "Found updated package " + pi.packageName);
                 }
@@ -3218,23 +3259,9 @@
 
             pw.println("  Stats:");
             synchronized (mStatLock) {
-                final String p = "    ";
-                dumpStatLS(pw, p, Stats.GET_DEFAULT_HOME, "getHomeActivities()");
-                dumpStatLS(pw, p, Stats.LAUNCHER_PERMISSION_CHECK, "Launcher permission check");
-
-                dumpStatLS(pw, p, Stats.GET_PACKAGE_INFO, "getPackageInfo()");
-                dumpStatLS(pw, p, Stats.GET_PACKAGE_INFO_WITH_SIG, "getPackageInfo(SIG)");
-                dumpStatLS(pw, p, Stats.GET_APPLICATION_INFO, "getApplicationInfo");
-                dumpStatLS(pw, p, Stats.CLEANUP_DANGLING_BITMAPS, "cleanupDanglingBitmaps");
-                dumpStatLS(pw, p, Stats.GET_ACTIVITY_WITH_METADATA, "getActivity+metadata");
-                dumpStatLS(pw, p, Stats.GET_INSTALLED_PACKAGES, "getInstalledPackages");
-                dumpStatLS(pw, p, Stats.CHECK_PACKAGE_CHANGES, "checkPackageChanges");
-                dumpStatLS(pw, p, Stats.GET_APPLICATION_RESOURCES, "getApplicationResources");
-                dumpStatLS(pw, p, Stats.RESOURCE_NAME_LOOKUP, "resourceNameLookup");
-                dumpStatLS(pw, p, Stats.GET_LAUNCHER_ACTIVITY, "getLauncherActivity");
-                dumpStatLS(pw, p, Stats.CHECK_LAUNCHER_ACTIVITY, "checkLauncherActivity");
-                dumpStatLS(pw, p, Stats.IS_ACTIVITY_ENABLED, "isActivityEnabled");
-                dumpStatLS(pw, p, Stats.PACKAGE_UPDATE_CHECK, "packageUpdateCheck");
+                for (int i = 0; i < Stats.COUNT; i++) {
+                    dumpStatLS(pw, "    ", i);
+                }
             }
 
             pw.println();
@@ -3277,12 +3304,12 @@
         return tobj.format("%Y-%m-%d %H:%M:%S");
     }
 
-    private void dumpStatLS(PrintWriter pw, String prefix, int statId, String label) {
+    private void dumpStatLS(PrintWriter pw, String prefix, int statId) {
         pw.print(prefix);
         final int count = mCountStats[statId];
         final long dur = mDurationStats[statId];
         pw.println(String.format("%s: count=%d, total=%dms, avg=%.1fms",
-                label, count, dur,
+                STAT_LABELS[statId], count, dur,
                 (count == 0 ? 0 : ((double) dur) / count)));
     }
 
@@ -3578,6 +3605,12 @@
         Binder.restoreCallingIdentity(token);
     }
 
+    // Injection point.
+    @VisibleForTesting
+    String injectBuildFingerprint() {
+        return Build.FINGERPRINT;
+    }
+
     final void wtf(String message) {
         wtf(message, /* exception= */ null);
     }
diff --git a/services/core/java/com/android/server/pm/ShortcutUser.java b/services/core/java/com/android/server/pm/ShortcutUser.java
index ce3ed9c..c05c66f 100644
--- a/services/core/java/com/android/server/pm/ShortcutUser.java
+++ b/services/core/java/com/android/server/pm/ShortcutUser.java
@@ -60,6 +60,7 @@
 
     // Suffix "2" was added to force rescan all packages after the next OTA.
     private static final String ATTR_LAST_APP_SCAN_TIME = "last-app-scan-time2";
+    private static final String ATTR_LAST_APP_SCAN_OS_FINGERPRINT = "last-app-scan-fp";
     private static final String KEY_USER_ID = "userId";
     private static final String KEY_LAUNCHERS = "launchers";
     private static final String KEY_PACKAGES = "packages";
@@ -125,6 +126,8 @@
 
     private long mLastAppScanTime;
 
+    private String mLastAppScanOsFingerprint;
+
     public ShortcutUser(ShortcutService service, int userId) {
         mService = service;
         mUserId = userId;
@@ -142,6 +145,14 @@
         mLastAppScanTime = lastAppScanTime;
     }
 
+    public String getLastAppScanOsFingerprint() {
+        return mLastAppScanOsFingerprint;
+    }
+
+    public void setLastAppScanOsFingerprint(String lastAppScanOsFingerprint) {
+        mLastAppScanOsFingerprint = lastAppScanOsFingerprint;
+    }
+
     // We don't expose this directly to non-test code because only ShortcutUser should add to/
     // remove from it.
     @VisibleForTesting
@@ -318,6 +329,8 @@
         ShortcutService.writeAttr(out, ATTR_KNOWN_LOCALES, mKnownLocales);
         ShortcutService.writeAttr(out, ATTR_LAST_APP_SCAN_TIME,
                 mLastAppScanTime);
+        ShortcutService.writeAttr(out, ATTR_LAST_APP_SCAN_OS_FINGERPRINT,
+                mLastAppScanOsFingerprint);
 
         ShortcutService.writeTagValue(out, TAG_LAUNCHER, mLastKnownLauncher);
 
@@ -364,7 +377,8 @@
                 ATTR_LAST_APP_SCAN_TIME);
         final long currentTime = s.injectCurrentTimeMillis();
         ret.mLastAppScanTime = lastAppScanTime < currentTime ? lastAppScanTime : 0;
-
+        ret.mLastAppScanOsFingerprint = ShortcutService.parseStringAttribute(parser,
+                ATTR_LAST_APP_SCAN_OS_FINGERPRINT);
         final int outerDepth = parser.getDepth();
         int type;
         while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -457,6 +471,8 @@
         pw.print(mLastAppScanTime);
         pw.print("] ");
         pw.print(ShortcutService.formatTime(mLastAppScanTime));
+        pw.print("  Last app scan FP: ");
+        pw.print(mLastAppScanOsFingerprint);
         pw.println();
 
         prefix += prefix + "  ";
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 8da3a7d..3a78968 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -6397,6 +6397,9 @@
             }
 
             mWindowManagerDrawComplete = true;
+            if (mKeyguardDelegate != null) {
+                mKeyguardDelegate.onDrawCompleteLw();
+            }
         }
 
         finishScreenTurningOn();
@@ -6866,7 +6869,8 @@
     /** {@inheritDoc} */
     @Override
     public void systemReady() {
-        mKeyguardDelegate = new KeyguardServiceDelegate(mContext);
+        mKeyguardDelegate = new KeyguardServiceDelegate(mContext,
+                mWindowManagerFuncs.getWindowManagerLock());
         mKeyguardDelegate.onSystemReady();
 
         readCameraLensCoverState();
@@ -7756,6 +7760,9 @@
         }
 
         final WindowState w = mTopFullscreenOpaqueWindowState;
+        if (w != mFocusedWindow) {
+            return false;
+        }
 
         // We only enable seamless rotation if the top window has requested
         // it and is in the fullscreen opaque state. Seamless rotation
diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
index 4fce49e..c48095e 100644
--- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
+++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
@@ -19,6 +19,7 @@
 import android.view.WindowManager;
 import android.view.WindowManagerPolicy.OnKeyguardExitResult;
 
+import com.android.internal.annotations.GuardedBy;
 import com.android.internal.policy.IKeyguardDrawnCallback;
 import com.android.internal.policy.IKeyguardExitCallback;
 import com.android.internal.policy.IKeyguardService;
@@ -43,6 +44,7 @@
     private static final int INTERACTIVE_STATE_AWAKE = 1;
     private static final int INTERACTIVE_STATE_GOING_TO_SLEEP = 2;
 
+    private final Object mWindowManagerLock;
     protected KeyguardServiceWrapper mKeyguardService;
     private final Context mContext;
     private final View mScrim; // shown if keyguard crashes
@@ -50,6 +52,9 @@
     private final KeyguardState mKeyguardState = new KeyguardState();
     private DrawnListener mDrawnListenerWhenConnect;
 
+    @GuardedBy("mWindowManagerLock")
+    private boolean mHideScrimPending;
+
     private static final class KeyguardState {
         KeyguardState() {
             // Assume keyguard is showing and secure until we know for sure. This is here in
@@ -92,10 +97,12 @@
         @Override
         public void onDrawn() throws RemoteException {
             if (DEBUG) Log.v(TAG, "**** SHOWN CALLED ****");
+            synchronized (mWindowManagerLock) {
+                mHideScrimPending = true;
+            }
             if (mDrawnListener != null) {
                 mDrawnListener.onDrawn();
             }
-            hideScrim();
         }
     };
 
@@ -116,7 +123,8 @@
         }
     };
 
-    public KeyguardServiceDelegate(Context context) {
+    public KeyguardServiceDelegate(Context context, Object windowManagerLock) {
+        mWindowManagerLock = windowManagerLock;
         mContext = context;
         mScrimHandler = UiThread.getHandler();
         mScrim = createScrim(context, mScrimHandler);
@@ -355,6 +363,16 @@
         }
     }
 
+    /**
+     * Called when all windows were fully drawn.
+     */
+    public void onDrawCompleteLw() {
+        if (mHideScrimPending) {
+            hideScrim();
+            mHideScrimPending = false;
+        }
+    }
+
     private static View createScrim(Context context, Handler handler) {
         final View view = new View(context);
 
diff --git a/services/core/java/com/android/server/power/ShutdownThread.java b/services/core/java/com/android/server/power/ShutdownThread.java
index 8ce2fd9..3d2839f 100644
--- a/services/core/java/com/android/server/power/ShutdownThread.java
+++ b/services/core/java/com/android/server/power/ShutdownThread.java
@@ -68,7 +68,7 @@
     private static final int MAX_BROADCAST_TIME = 10*1000;
     private static final int MAX_SHUTDOWN_WAIT_TIME = 20*1000;
     private static final int MAX_RADIO_WAIT_TIME = 12*1000;
-    private static final int MAX_UNCRYPT_WAIT_TIME = 15*60*1000;
+    private static final int MAX_UNCRYPT_WAIT_TIME = 30*60*1000;
     // constants for progress bar. the values are roughly estimated based on timeout.
     private static final int BROADCAST_STOP_PERCENT = 2;
     private static final int ACTIVITY_MANAGER_STOP_PERCENT = 4;
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index d9c4254..a7b9cf4 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -102,9 +102,8 @@
     private static final int MSG_START_USER = 7;
     private static final int MSG_CLEANUP_USER = 8;
     private static final int MSG_SWITCH_USER = 9;
-    private static final int MSG_SET_DEVICE_LOCKED = 10;
-    private static final int MSG_FLUSH_TRUST_USUALLY_MANAGED = 11;
-    private static final int MSG_UNLOCK_USER = 12;
+    private static final int MSG_FLUSH_TRUST_USUALLY_MANAGED = 10;
+    private static final int MSG_UNLOCK_USER = 11;
 
     private static final int TRUST_USUALLY_MANAGED_FLUSH_DELAY = 2 * 60 * 1000;
 
@@ -317,20 +316,6 @@
         }
     }
 
-    public void setDeviceLockedForUser(int userId, boolean locked) {
-        if (mLockPatternUtils.isSeparateProfileChallengeEnabled(userId)) {
-            synchronized (mDeviceLockedForUser) {
-                mDeviceLockedForUser.put(userId, locked);
-            }
-            if (locked) {
-                try {
-                    ActivityManagerNative.getDefault().notifyLockedProfile(userId);
-                } catch (RemoteException e) {
-                }
-            }
-        }
-    }
-
     boolean isDeviceLockedInner(int userId) {
         synchronized (mDeviceLockedForUser) {
             return mDeviceLockedForUser.get(userId, true);
@@ -838,10 +823,24 @@
         }
 
         @Override
-        public void setDeviceLockedForUser(int userId, boolean value) {
+        public void setDeviceLockedForUser(int userId, boolean locked) {
             enforceReportPermission();
-            mHandler.obtainMessage(MSG_SET_DEVICE_LOCKED, value ? 1 : 0, userId)
-                    .sendToTarget();
+            final long identity = Binder.clearCallingIdentity();
+            try {
+                if (mLockPatternUtils.isSeparateProfileChallengeEnabled(userId)) {
+                    synchronized (mDeviceLockedForUser) {
+                        mDeviceLockedForUser.put(userId, locked);
+                    }
+                    if (locked) {
+                        try {
+                            ActivityManagerNative.getDefault().notifyLockedProfile(userId);
+                        } catch (RemoteException e) {
+                        }
+                    }
+                }
+            } finally {
+                Binder.restoreCallingIdentity(identity);
+            }
         }
 
         @Override
@@ -917,9 +916,6 @@
                     mCurrentUser = msg.arg1;
                     refreshDeviceLockedForUser(UserHandle.USER_ALL);
                     break;
-                case MSG_SET_DEVICE_LOCKED:
-                    setDeviceLockedForUser(msg.arg2, msg.arg1 != 0);
-                    break;
                 case MSG_FLUSH_TRUST_USUALLY_MANAGED:
                     SparseBooleanArray usuallyManaged;
                     synchronized (mTrustUsuallyManagedForUser) {
diff --git a/services/core/java/com/android/server/twilight/TwilightService.java b/services/core/java/com/android/server/twilight/TwilightService.java
index acd6587..db7df25 100644
--- a/services/core/java/com/android/server/twilight/TwilightService.java
+++ b/services/core/java/com/android/server/twilight/TwilightService.java
@@ -151,7 +151,7 @@
     }
 
     private void startListening() {
-        if (DEBUG) Slog.d(TAG, "startListening");
+        Slog.d(TAG, "startListening");
 
         // Start listening for location updates (default: low power, max 1h, min 10m).
         mLocationManager.requestLocationUpdates(
@@ -173,7 +173,7 @@
             mTimeChangedReceiver = new BroadcastReceiver() {
                 @Override
                 public void onReceive(Context context, Intent intent) {
-                    if (DEBUG) Slog.d(TAG, "onReceive: " + intent);
+                    Slog.d(TAG, "onReceive: " + intent);
                     updateTwilightState();
                 }
             };
@@ -188,7 +188,7 @@
     }
 
     private void stopListening() {
-        if (DEBUG) Slog.d(TAG, "stopListening");
+        Slog.d(TAG, "stopListening");
 
         if (mTimeChangedReceiver != null) {
             getContext().unregisterReceiver(mTimeChangedReceiver);
@@ -241,15 +241,20 @@
 
     @Override
     public void onAlarm() {
-        if (DEBUG) Slog.d(TAG, "onAlarm");
+        Slog.d(TAG, "onAlarm");
         updateTwilightState();
     }
 
     @Override
     public void onLocationChanged(Location location) {
-        if (DEBUG) Slog.d(TAG, "onLocationChanged: " + location);
-        mLastLocation = location;
-        updateTwilightState();
+        if (location != null) {
+            Slog.d(TAG, "onLocationChanged:"
+                    + " provider=" + location.getProvider()
+                    + " accuracy=" + location.getAccuracy()
+                    + " time=" + location.getTime());
+            mLastLocation = location;
+            updateTwilightState();
+        }
     }
 
     @Override
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 64f79e1..3fd4b37 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -1350,7 +1350,9 @@
     @Override
     public ParcelFileDescriptor setWallpaper(String name, String callingPackage,
             Rect cropHint, boolean allowBackup, Bundle extras, int which,
-            IWallpaperManagerCallback completion) {
+            IWallpaperManagerCallback completion, int userId) {
+        userId = ActivityManager.handleIncomingUser(getCallingPid(), getCallingUid(), userId,
+                false /* all */, true /* full */, "changing wallpaper", null /* pkg */);
         checkPermission(android.Manifest.permission.SET_WALLPAPER);
 
         if ((which & (FLAG_LOCK|FLAG_SYSTEM)) == 0) {
@@ -1374,8 +1376,6 @@
             }
         }
 
-        final int userId = UserHandle.getCallingUserId();
-
         synchronized (mLock) {
             if (DEBUG) Slog.v(TAG, "setWallpaper which=0x" + Integer.toHexString(which));
             WallpaperData wallpaper;
@@ -1757,8 +1757,8 @@
         }
 
         WallpaperData wallpaper = (which == FLAG_LOCK)
-                ? mWallpaperMap.get(userId)
-                : mLockWallpaperMap.get(userId);
+                ? mLockWallpaperMap.get(userId)
+                : mWallpaperMap.get(userId);
         return (wallpaper != null) ? wallpaper.allowBackup : false;
     }
 
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index b065392..621e43a 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -439,12 +439,16 @@
      * Notify that the app is now resumed, and it was not stopped before, perform a clean
      * up of the surfaces
      */
-    void notifyAppResumed(boolean wasStopped) {
-        if (DEBUG_ADD_REMOVE) Slog.v(TAG, "notifyAppResumed: wasStopped=" + wasStopped + " " + this);
+    void notifyAppResumed(boolean wasStopped, boolean allowSavedSurface) {
+        if (DEBUG_ADD_REMOVE) Slog.v(TAG, "notifyAppResumed: wasStopped=" + wasStopped
+                + " allowSavedSurface=" + allowSavedSurface + " " + this);
         mAppStopped = false;
         if (!wasStopped) {
             destroySurfaces(true /*cleanupOnResume*/);
         }
+        if (!allowSavedSurface) {
+            destroySavedSurfaces();
+        }
     }
 
     /**
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 1d57872..aba64e8 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -637,7 +637,7 @@
      */
     TaskStack getDockedStackVisibleForUserLocked() {
         final TaskStack stack = mService.mStackIdToStack.get(DOCKED_STACK_ID);
-        return (stack != null && stack.isVisibleForUserLocked()) ? stack : null;
+        return (stack != null && stack.isVisibleLocked(true /* ignoreKeyguard */)) ? stack : null;
     }
 
     /**
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 1dcada6..fb9fafc 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -677,19 +677,6 @@
         return (tokensCount != 0) && mAppTokens.get(tokensCount - 1).showForAllUsers;
     }
 
-    boolean isVisibleForUser() {
-        for (int i = mAppTokens.size() - 1; i >= 0; i--) {
-            final AppWindowToken appToken = mAppTokens.get(i);
-            for (int j = appToken.allAppWindows.size() - 1; j >= 0; j--) {
-                WindowState window = appToken.allAppWindows.get(j);
-                if (!window.isHiddenFromUserLocked()) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
     boolean isVisible() {
         for (int i = mAppTokens.size() - 1; i >= 0; i--) {
             final AppWindowToken appToken = mAppTokens.get(i);
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 8be5b19..a665edd 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -398,23 +398,21 @@
             return false;
         }
 
-        final int oldDockSide = mStackId == DOCKED_STACK_ID ? getDockSide() : DOCKED_INVALID;
         mTmpRect2.set(mBounds);
         mDisplayContent.rotateBounds(mRotation, newRotation, mTmpRect2);
         if (mStackId == DOCKED_STACK_ID) {
             repositionDockedStackAfterRotation(mTmpRect2);
             snapDockedStackAfterRotation(mTmpRect2);
             final int newDockSide = getDockSide(mTmpRect2);
-            if (oldDockSide != newDockSide) {
-                // Update the dock create mode and clear the dock create bounds, these
-                // might change after a rotation and the original values will be invalid.
-                mService.setDockedStackCreateStateLocked(
-                        (newDockSide == DOCKED_LEFT || newDockSide == DOCKED_TOP)
-                        ? DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT
-                        : DOCKED_STACK_CREATE_MODE_BOTTOM_OR_RIGHT,
-                        null);
-                mDisplayContent.getDockedDividerController().notifyDockSideChanged(newDockSide);
-            }
+
+            // Update the dock create mode and clear the dock create bounds, these
+            // might change after a rotation and the original values will be invalid.
+            mService.setDockedStackCreateStateLocked(
+                    (newDockSide == DOCKED_LEFT || newDockSide == DOCKED_TOP)
+                    ? DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT
+                    : DOCKED_STACK_CREATE_MODE_BOTTOM_OR_RIGHT,
+                    null);
+            mDisplayContent.getDockedDividerController().notifyDockSideChanged(newDockSide);
         }
 
         mBoundsAfterRotation.set(mTmpRect2);
@@ -890,7 +888,7 @@
             mAdjustImeAmount = adjustAmount;
             mAdjustDividerAmount = adjustDividerAmount;
             updateAdjustedBounds();
-            return isVisibleForUserLocked();
+            return isVisibleLocked(true /* ignoreKeyguard */);
         } else {
             return false;
         }
@@ -926,7 +924,7 @@
         if (minimizeAmount != mMinimizeAmount) {
             mMinimizeAmount = minimizeAmount;
             updateAdjustedBounds();
-            return isVisibleForUserLocked();
+            return isVisibleLocked(true /* ignoreKeyguard*/);
         } else {
             return false;
         }
@@ -943,7 +941,7 @@
     void beginImeAdjustAnimation() {
         for (int j = mTasks.size() - 1; j >= 0; j--) {
             final Task task = mTasks.get(j);
-            if (task.isVisibleForUser()) {
+            if (task.isVisible()) {
                 task.setDragResizing(true, DRAG_RESIZE_MODE_DOCKED_DIVIDER);
                 task.addWindowsWaitingForDrawnIfResizingChanged();
             }
@@ -1233,9 +1231,13 @@
     }
 
     boolean isVisibleLocked() {
+        return isVisibleLocked(false /* ignoreKeyguard */);
+    }
+
+    boolean isVisibleLocked(boolean ignoreKeyguard) {
         final boolean keyguardOn = mService.mPolicy.isKeyguardShowingOrOccluded()
                 && !mService.mAnimator.mKeyguardGoingAway;
-        if (keyguardOn && !StackId.isAllowedOverLockscreen(mStackId)) {
+        if (!ignoreKeyguard && keyguardOn && !StackId.isAllowedOverLockscreen(mStackId)) {
             // The keyguard is showing and the stack shouldn't show on top of the keyguard.
             return false;
         }
@@ -1252,20 +1254,6 @@
         return false;
     }
 
-    /**
-     * @return true if a the stack is visible for the current in user, ignoring any other visibility
-     *         aspects, and false otherwise
-     */
-    boolean isVisibleForUserLocked() {
-        for (int i = mTasks.size() - 1; i >= 0; i--) {
-            final Task task = mTasks.get(i);
-            if (task.isVisibleForUser()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     boolean isDragResizing() {
         return mDragResizing;
     }
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index f2f85bf..2145e9b 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2908,12 +2908,11 @@
                     }
                     result |= RELAYOUT_RES_SURFACE_CHANGED;
                 }
-                final WindowSurfaceController surfaceController = winAnimator.mSurfaceController;
-                if (viewVisibility == View.VISIBLE && surfaceController != null) {
+                if (viewVisibility == View.VISIBLE && winAnimator.hasSurface()) {
                     // We already told the client to go invisible, but the message may not be
                     // handled yet, or it might want to draw a last frame. If we already have a
                     // surface, let the client use that, but don't create new surface at this point.
-                    surfaceController.getSurface(outSurface);
+                    winAnimator.mSurfaceController.getSurface(outSurface);
                 } else {
                     if (DEBUG_VISIBILITY) Slog.i(TAG_WM, "Releasing surface in: " + win);
 
@@ -4480,7 +4479,7 @@
     }
 
     @Override
-    public void notifyAppResumed(IBinder token, boolean wasStopped) {
+    public void notifyAppResumed(IBinder token, boolean wasStopped, boolean allowSavedSurface) {
         if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
                 "notifyAppResumed()")) {
             throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
@@ -4493,7 +4492,7 @@
                 Slog.w(TAG_WM, "Attempted to notify resumed of non-existing app token: " + token);
                 return;
             }
-            wtoken.notifyAppResumed(wasStopped);
+            wtoken.notifyAppResumed(wasStopped, allowSavedSurface);
         }
     }
 
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index e828650..a96cef0 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -3673,12 +3673,16 @@
 
     private boolean isActivePasswordSufficientForUserLocked(
             DevicePolicyData policy, int userHandle, boolean parent) {
-        if (policy.mActivePasswordQuality < getPasswordQuality(null, userHandle, parent)
-                || policy.mActivePasswordLength < getPasswordMinimumLength(
+        final int requiredPasswordQuality = getPasswordQuality(null, userHandle, parent);
+        if (policy.mActivePasswordQuality < requiredPasswordQuality) {
+            return false;
+        }
+        if (requiredPasswordQuality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC
+                && policy.mActivePasswordLength < getPasswordMinimumLength(
                         null, userHandle, parent)) {
             return false;
         }
-        if (policy.mActivePasswordQuality != DevicePolicyManager.PASSWORD_QUALITY_COMPLEX) {
+        if (requiredPasswordQuality != DevicePolicyManager.PASSWORD_QUALITY_COMPLEX) {
             return true;
         }
         return policy.mActivePasswordUpperCase >= getPasswordMinimumUpperCase(
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index a839373..97a829e 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -809,10 +809,8 @@
 
                 traceBeginAndSlog("StartNetworkPolicyManagerService");
                 try {
-                    networkPolicy = new NetworkPolicyManagerService(
-                            context, mActivityManagerService,
-                            (IPowerManager)ServiceManager.getService(Context.POWER_SERVICE),
-                            networkStats, networkManagement);
+                    networkPolicy = new NetworkPolicyManagerService(context,
+                            mActivityManagerService, networkStats, networkManagement);
                     ServiceManager.addService(Context.NETWORK_POLICY_SERVICE, networkPolicy);
                 } catch (Throwable e) {
                     reportWtf("starting NetworkPolicy Service", e);
diff --git a/services/net/Android.mk b/services/net/Android.mk
index 336bc45..920f7c0ab 100644
--- a/services/net/Android.mk
+++ b/services/net/Android.mk
@@ -5,6 +5,10 @@
 LOCAL_MODULE := services.net
 
 LOCAL_SRC_FILES += \
-    $(call all-java-files-under,java)
+    $(call all-java-files-under,java)  \
+    ../../../../system/netd/server/binder/android/net/INetd.aidl
+
+LOCAL_AIDL_INCLUDES += \
+    system/netd/server/binder
 
 include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java
index 654ef18..6d90203 100644
--- a/services/net/java/android/net/ip/IpManager.java
+++ b/services/net/java/android/net/ip/IpManager.java
@@ -382,6 +382,7 @@
     private final State mStoppedState = new StoppedState();
     private final State mStoppingState = new StoppingState();
     private final State mStartedState = new StartedState();
+    private final State mRunningState = new RunningState();
 
     private final String mTag;
     private final Context mContext;
@@ -476,6 +477,7 @@
         // Super simple StateMachine.
         addState(mStoppedState);
         addState(mStartedState);
+            addState(mRunningState, mStartedState);
         addState(mStoppingState);
 
         setInitialState(mStoppedState);
@@ -570,7 +572,7 @@
         pw.decreaseIndent();
 
         pw.println();
-        pw.println("StateMachine dump:");
+        pw.println(mTag + " StateMachine dump:");
         pw.increaseIndent();
         mLocalLog.readOnlyLocalLog().dump(fd, pw, args);
         pw.decreaseIndent();
@@ -768,6 +770,11 @@
         //         - IPv6 addresses
         //         - IPv6 routes
         //         - IPv6 DNS servers
+        //
+        // N.B.: this is fundamentally race-prone and should be fixed by
+        // changing NetlinkTracker from a hybrid edge/level model to an
+        // edge-only model, or by giving IpManager its own netlink socket(s)
+        // so as to track all required information directly.
         LinkProperties netlinkLinkProperties = mNetlinkTracker.getLinkProperties();
         newLp.setLinkAddresses(netlinkLinkProperties.getLinkAddresses());
         for (RouteInfo route : netlinkLinkProperties.getRoutes()) {
@@ -939,16 +946,30 @@
         return true;
     }
 
+    private void stopAllIP() {
+        // We don't need to worry about routes, just addresses, because:
+        //     - disableIpv6() will clear autoconf IPv6 routes as well, and
+        //     - we don't get IPv4 routes from netlink
+        // so we neither react to nor need to wait for changes in either.
+
+        try {
+            mNwService.disableIpv6(mInterfaceName);
+        } catch (Exception e) {
+            Log.e(mTag, "Failed to disable IPv6" + e);
+        }
+
+        try {
+            mNwService.clearInterfaceAddresses(mInterfaceName);
+        } catch (Exception e) {
+            Log.e(mTag, "Failed to clear addresses " + e);
+        }
+    }
+
 
     class StoppedState extends State {
         @Override
         public void enter() {
-            try {
-                mNwService.disableIpv6(mInterfaceName);
-                mNwService.clearInterfaceAddresses(mInterfaceName);
-            } catch (Exception e) {
-                Log.e(mTag, "Failed to clear addresses or disable IPv6" + e);
-            }
+            stopAllIP();
 
             resetLinkProperties();
             if (mStartTimeMillis > 0) {
@@ -1023,12 +1044,71 @@
     }
 
     class StartedState extends State {
-        private boolean mDhcpActionInFlight;
-
         @Override
         public void enter() {
             mStartTimeMillis = SystemClock.elapsedRealtime();
 
+            if (mConfiguration.mProvisioningTimeoutMs > 0) {
+                final long alarmTime = SystemClock.elapsedRealtime() +
+                        mConfiguration.mProvisioningTimeoutMs;
+                mProvisioningTimeoutAlarm.schedule(alarmTime);
+            }
+
+            if (readyToProceed()) {
+                transitionTo(mRunningState);
+            } else {
+                // Clear all IPv4 and IPv6 before proceeding to RunningState.
+                // Clean up any leftover state from an abnormal exit from
+                // tethering or during an IpManager restart.
+                stopAllIP();
+            }
+        }
+
+        @Override
+        public void exit() {
+            mProvisioningTimeoutAlarm.cancel();
+        }
+
+        @Override
+        public boolean processMessage(Message msg) {
+            switch (msg.what) {
+                case CMD_STOP:
+                    transitionTo(mStoppingState);
+                    break;
+
+                case EVENT_NETLINK_LINKPROPERTIES_CHANGED:
+                    handleLinkPropertiesUpdate(NO_CALLBACKS);
+                    if (readyToProceed()) {
+                        transitionTo(mRunningState);
+                    }
+                    break;
+
+                case EVENT_PROVISIONING_TIMEOUT:
+                    handleProvisioningFailure();
+                    break;
+
+                default:
+                    // It's safe to process messages out of order because the
+                    // only message that can both
+                    //     a) be received at this time and
+                    //     b) affect provisioning state
+                    // is EVENT_NETLINK_LINKPROPERTIES_CHANGED (handled above).
+                    deferMessage(msg);
+            }
+            return HANDLED;
+        }
+
+        boolean readyToProceed() {
+            return (!mLinkProperties.hasIPv4Address() &&
+                    !mLinkProperties.hasGlobalIPv6Address());
+        }
+    }
+
+    class RunningState extends State {
+        private boolean mDhcpActionInFlight;
+
+        @Override
+        public void enter() {
             mApfFilter = ApfFilter.maybeCreate(mConfiguration.mApfCapabilities, mNetworkInterface,
                     mCallback, mMulticastFiltering);
             // TODO: investigate the effects of any multicast filtering racing/interfering with the
@@ -1037,12 +1117,6 @@
                 mCallback.setFallbackMulticastFilter(mMulticastFiltering);
             }
 
-            if (mConfiguration.mProvisioningTimeoutMs > 0) {
-                final long alarmTime = SystemClock.elapsedRealtime() +
-                        mConfiguration.mProvisioningTimeoutMs;
-                mProvisioningTimeoutAlarm.schedule(alarmTime);
-            }
-
             if (mConfiguration.mEnableIPv6) {
                 // TODO: Consider transitionTo(mStoppingState) if this fails.
                 startIPv6();
@@ -1070,7 +1144,6 @@
 
         @Override
         public void exit() {
-            mProvisioningTimeoutAlarm.cancel();
             stopDhcpAction();
 
             if (mIpReachabilityMonitor != null) {
@@ -1167,10 +1240,6 @@
                     break;
                 }
 
-                case EVENT_PROVISIONING_TIMEOUT:
-                    handleProvisioningFailure();
-                    break;
-
                 case EVENT_DHCPACTION_TIMEOUT:
                     stopDhcpAction();
                     break;
diff --git a/services/net/java/android/net/util/NetdService.java b/services/net/java/android/net/util/NetdService.java
new file mode 100644
index 0000000..153cb50
--- /dev/null
+++ b/services/net/java/android/net/util/NetdService.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2016 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.net.util;
+
+import android.net.INetd;
+import android.os.ServiceManager;
+import android.util.Log;
+
+
+/**
+ * @hide
+ */
+public class NetdService {
+    private static final String TAG = NetdService.class.getSimpleName();
+    private static final String NETD_SERVICE_NAME = "netd";
+
+    /**
+     * It is the caller's responsibility to check for a null return value
+     * and to handle RemoteException errors from invocations on the returned
+     * interface if, for example, netd dies and is restarted.
+     *
+     * @return an INetd instance or null.
+     */
+    public static INetd getInstance() {
+        final INetd netdInstance = INetd.Stub.asInterface(
+                ServiceManager.getService(NETD_SERVICE_NAME));
+        if (netdInstance == null) {
+            Log.w(TAG, "WARNING: returning null INetd instance.");
+        }
+        return netdInstance;
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
index 979f160..541be3d 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
@@ -69,7 +69,6 @@
 import android.net.NetworkTemplate;
 import android.os.Binder;
 import android.os.INetworkManagementService;
-import android.os.IPowerManager;
 import android.os.MessageQueue.IdleHandler;
 import android.os.UserHandle;
 import android.test.AndroidTestCase;
@@ -115,7 +114,6 @@
     private File mPolicyDir;
 
     private IActivityManager mActivityManager;
-    private IPowerManager mPowerManager;
     private INetworkStatsService mStatsService;
     private INetworkManagementService mNetworkManager;
     private INetworkPolicyListener mPolicyListener;
@@ -187,7 +185,6 @@
         }
 
         mActivityManager = createMock(IActivityManager.class);
-        mPowerManager = createMock(IPowerManager.class);
         mStatsService = createMock(INetworkStatsService.class);
         mNetworkManager = createMock(INetworkManagementService.class);
         mPolicyListener = createMock(INetworkPolicyListener.class);
@@ -195,7 +192,7 @@
         mConnManager = createMock(IConnectivityManager.class);
         mNotifManager = createMock(INotificationManager.class);
 
-        mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager, mPowerManager,
+        mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager,
                 mStatsService, mNetworkManager, mTime, mPolicyDir, true);
         mService.bindConnectivityManager(mConnManager);
         mService.bindNotificationManager(mNotifManager);
@@ -217,8 +214,6 @@
         mNetworkManager.registerObserver(capture(networkObserver));
         expectLastCall().atLeastOnce();
 
-        // expect to answer screen status during systemReady()
-        expect(mPowerManager.isInteractive()).andReturn(true).atLeastOnce();
         expect(mNetworkManager.isBandwidthControlEnabled()).andReturn(true).atLeastOnce();
         expectCurrentTime();
 
@@ -240,7 +235,6 @@
         mPolicyDir = null;
 
         mActivityManager = null;
-        mPowerManager = null;
         mStatsService = null;
         mPolicyListener = null;
         mTime = null;
@@ -313,48 +307,6 @@
     }
 
     @Suppress
-    public void testScreenChangesRules() throws Exception {
-        Future<Void> future;
-
-        expectSetUidMeteredNetworkBlacklist(UID_A, false);
-        expectSetUidForeground(UID_A, true);
-        future = expectRulesChanged(UID_A, RULE_ALLOW_ALL);
-        replay();
-        mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true);
-        future.get();
-        verifyAndReset();
-
-        // push strict policy for foreground uid, verify ALLOW rule
-        expectSetUidMeteredNetworkBlacklist(UID_A, false);
-        expectSetUidForeground(UID_A, true);
-        future = expectRulesChanged(UID_A, RULE_ALLOW_ALL);
-        replay();
-        mService.setUidPolicy(APP_ID_A, POLICY_REJECT_METERED_BACKGROUND);
-        future.get();
-        verifyAndReset();
-
-        // now turn screen off and verify REJECT rule
-        expect(mPowerManager.isInteractive()).andReturn(false).atLeastOnce();
-        expectSetUidMeteredNetworkBlacklist(UID_A, true);
-        expectSetUidForeground(UID_A, false);
-        future = expectRulesChanged(UID_A, RULE_REJECT_METERED);
-        replay();
-        mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SCREEN_OFF));
-        future.get();
-        verifyAndReset();
-
-        // and turn screen back on, verify ALLOW rule restored
-        expect(mPowerManager.isInteractive()).andReturn(true).atLeastOnce();
-        expectSetUidMeteredNetworkBlacklist(UID_A, false);
-        expectSetUidForeground(UID_A, true);
-        future = expectRulesChanged(UID_A, RULE_ALLOW_ALL);
-        replay();
-        mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SCREEN_ON));
-        future.get();
-        verifyAndReset();
-    }
-
-    @Suppress
     public void testPolicyNone() throws Exception {
         Future<Void> future;
 
@@ -1049,14 +1001,14 @@
     }
 
     private void replay() {
-        EasyMock.replay(mActivityManager, mPowerManager, mStatsService, mPolicyListener,
-                mNetworkManager, mTime, mConnManager, mNotifManager);
+        EasyMock.replay(mActivityManager, mStatsService, mPolicyListener, mNetworkManager, mTime,
+                mConnManager, mNotifManager);
     }
 
     private void verifyAndReset() {
-        EasyMock.verify(mActivityManager, mPowerManager, mStatsService, mPolicyListener,
-                mNetworkManager, mTime, mConnManager, mNotifManager);
-        EasyMock.reset(mActivityManager, mPowerManager, mStatsService, mPolicyListener,
-                mNetworkManager, mTime, mConnManager, mNotifManager);
+        EasyMock.verify(mActivityManager, mStatsService, mPolicyListener, mNetworkManager, mTime,
+                mConnManager, mNotifManager);
+        EasyMock.reset(mActivityManager, mStatsService, mPolicyListener, mNetworkManager, mTime,
+                mConnManager, mNotifManager);
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java
index ef9739d..a3d0afa 100644
--- a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java
@@ -21,6 +21,7 @@
 import static org.mockito.Mockito.when;
 
 import android.accounts.Account;
+import android.accounts.AccountManagerInternal;
 import android.accounts.AuthenticatorDescription;
 import android.app.AppOpsManager;
 import android.app.Notification;
@@ -44,6 +45,8 @@
 import android.test.mock.MockPackageManager;
 import android.util.Log;
 
+import com.android.server.LocalServices;
+
 import java.io.File;
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -73,6 +76,7 @@
         SQLiteDatabase.deleteDatabase(new File(mAms.getCeDatabaseName(UserHandle.USER_SYSTEM)));
         SQLiteDatabase.deleteDatabase(new File(mAms.getDeDatabaseName(UserHandle.USER_SYSTEM)));
         SQLiteDatabase.deleteDatabase(new File(mAms.getPreNDatabaseName(UserHandle.USER_SYSTEM)));
+        LocalServices.removeServiceForTest(AccountManagerInternal.class);
         super.tearDown();
     }
 
@@ -282,6 +286,7 @@
 
     private AccountManagerService createAccountManagerService(Context mockContext,
             Context realContext) {
+        LocalServices.removeServiceForTest(AccountManagerInternal.class);
         return new MyAccountManagerService(mockContext,
                 new MyMockPackageManager(), new MockAccountAuthenticatorCache(), realContext);
     }
@@ -337,6 +342,10 @@
         @Override
         public void invalidateCache(int userId) {
         }
+
+        @Override
+        public void updateServices(int userId) {
+        }
     }
 
     static public class MyMockContext extends MockContext {
@@ -416,6 +425,11 @@
         public int checkSignatures(final int uid1, final int uid2) {
             return PackageManager.SIGNATURE_MATCH;
         }
+
+        @Override
+        public void addOnPermissionsChangeListener(
+                OnPermissionsChangedListener listener) {
+        }
     }
 
     static public class MyAccountManagerService extends AccountManagerService {
diff --git a/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java b/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java
index e440a0d..984a484 100644
--- a/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java
@@ -62,7 +62,7 @@
         for (int i = 0; i < 100; i++) {
             taskIdsOnFile.put(getRandomTaskIdForUser(testUserId), true);
         }
-        mTaskPersister.maybeWritePersistedTaskIdsForUser(taskIdsOnFile, testUserId);
+        mTaskPersister.writePersistedTaskIdsForUser(taskIdsOnFile, testUserId);
         SparseBooleanArray newTaskIdsOnFile = mTaskPersister
                 .loadPersistedTaskIdsForUser(testUserId);
         assertTrue("TaskIds written differ from TaskIds read back from file",
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index 1c7a138..792f300 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -390,6 +390,11 @@
         }
 
         @Override
+        void injectRunOnNewThread(Runnable r) {
+            runOnHandler(r);
+        }
+
+        @Override
         void injectEnforceCallingPermission(String permission, String message) {
             if (!mCallerPermissions.contains(permission)) {
                 throw new SecurityException("Missing permission: " + permission);
@@ -402,6 +407,11 @@
         }
 
         @Override
+        String injectBuildFingerprint() {
+            return mInjectedBuildFingerprint;
+        }
+
+        @Override
         void wtf(String message, Throwable th) {
             // During tests, WTF is fatal.
             fail(message + "  exception: " + th + "\n" + Log.getStackTraceString(th));
@@ -523,6 +533,7 @@
     protected Map<String, PackageInfo> mInjectedPackages;
 
     protected Set<PackageWithUser> mUninstalledPackages;
+    protected Set<String> mSystemPackages;
 
     protected PackageManager mMockPackageManager;
     protected PackageManagerInternal mMockPackageManagerInternal;
@@ -623,6 +634,8 @@
     protected static final String PACKAGE_FALLBACK_LAUNCHER_NAME = "fallback";
     protected static final int PACKAGE_FALLBACK_LAUNCHER_PRIORITY = -999;
 
+    protected String mInjectedBuildFingerprint = "build1";
+
     static {
         QUERY_ALL.setQueryFlags(
                 ShortcutQuery.FLAG_GET_ALL_KINDS);
@@ -672,6 +685,7 @@
                 pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
 
         mUninstalledPackages = new HashSet<>();
+        mSystemPackages = new HashSet<>();
 
         mInjectedFilePathRoot = new File(getTestContext().getCacheDir(), "test-files");
 
@@ -921,6 +935,12 @@
         });
     }
 
+    protected void setPackageLastUpdateTime(String packageName, long value) {
+        updatePackageInfo(packageName, pi -> {
+            pi.lastUpdateTime = value;
+        });
+    }
+
     protected void uninstallPackage(int userId, String packageName) {
         if (ENABLE_DUMP) {
             Log.v(TAG, "Unnstall package " + packageName + " / " + userId);
@@ -952,6 +972,9 @@
         if (mUninstalledPackages.contains(PackageWithUser.of(userId, packageName))) {
             ret.applicationInfo.flags &= ~ApplicationInfo.FLAG_INSTALLED;
         }
+        if (mSystemPackages.contains(packageName)) {
+            ret.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+        }
 
         if (getSignatures) {
             ret.signatures = pi.signatures;
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
index 253334e..46ac7ce 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
@@ -3945,11 +3945,11 @@
         mInjectedPackages.remove(CALLING_PACKAGE_1);
         mInjectedPackages.remove(CALLING_PACKAGE_3);
 
-        mService.handleUnlockUser(USER_0);
+        mService.checkPackageChanges(USER_0);
 
         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
-        assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
+        assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));  // ---------------
         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
@@ -3961,7 +3961,7 @@
         assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10));
         assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10));
 
-        mService.handleUnlockUser(USER_10);
+        mService.checkPackageChanges(USER_10);
 
         assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
         assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
@@ -4154,7 +4154,7 @@
         updatePackageVersion(CALLING_PACKAGE_1, 1);
 
         // Then send the broadcast, to only user-0.
-                mService.mPackageMonitor.onReceive(getTestContext(),
+        mService.mPackageMonitor.onReceive(getTestContext(),
                 genPackageUpdateIntent(CALLING_PACKAGE_1, USER_0));
 
         waitOnMainThread();
@@ -4186,10 +4186,13 @@
         mInjectedCurrentTimeMillis = START_TIME + 200;
 
         mRunningUsers.put(USER_10, true);
+        mUnlockedUsers.put(USER_10, true);
 
         reset(c0);
         reset(c10);
+        setPackageLastUpdateTime(CALLING_PACKAGE_1, mInjectedCurrentTimeMillis);
         mService.handleUnlockUser(USER_10);
+        mService.checkPackageChanges(USER_10);
 
         waitOnMainThread();
 
@@ -4221,7 +4224,7 @@
         // Then send the broadcast, to only user-0.
                 mService.mPackageMonitor.onReceive(getTestContext(),
                 genPackageUpdateIntent(CALLING_PACKAGE_2, USER_0));
-        mService.handleUnlockUser(USER_10);
+        mService.checkPackageChanges(USER_10);
 
         waitOnMainThread();
 
@@ -4243,9 +4246,9 @@
         updatePackageVersion(CALLING_PACKAGE_3, 100);
 
         // Then send the broadcast, to only user-0.
-                mService.mPackageMonitor.onReceive(getTestContext(),
+        mService.mPackageMonitor.onReceive(getTestContext(),
                 genPackageUpdateIntent(CALLING_PACKAGE_3, USER_0));
-        mService.handleUnlockUser(USER_10);
+        mService.checkPackageChanges(USER_10);
 
         waitOnMainThread();
 
@@ -4344,6 +4347,128 @@
         });
     }
 
+    public void testHandlePackageUpdate_systemAppUpdate() {
+
+        // Package1 is a system app.  Package 2 is not a system app, so it's not scanned
+        // in this test at all.
+        mSystemPackages.add(CALLING_PACKAGE_1);
+
+        // Initial state: no shortcuts.
+        mService.checkPackageChanges(USER_0);
+
+        assertEquals(mInjectedCurrentTimeMillis,
+                mService.getUserShortcutsLocked(USER_0).getLastAppScanTime());
+        assertEquals(mInjectedBuildFingerprint,
+                mService.getUserShortcutsLocked(USER_0).getLastAppScanOsFingerprint());
+
+        // They have no shortcuts.
+        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
+            assertWith(getCallerShortcuts())
+                    .isEmpty();
+        });
+
+        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
+            assertWith(getCallerShortcuts())
+                    .isEmpty();
+        });
+
+        // Next.
+        // Update the packages -- now they have 1 manifest shortcut.
+        // But checkPackageChanges() don't notice it, since their version code / timestamp haven't
+        // changed.
+        addManifestShortcutResource(
+                new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
+                R.xml.shortcut_1);
+        addManifestShortcutResource(
+                new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
+                R.xml.shortcut_1);
+        mInjectedCurrentTimeMillis += 1000;
+        mService.checkPackageChanges(USER_0);
+
+        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
+            assertWith(getCallerShortcuts())
+                    .isEmpty();
+        });
+        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
+            assertWith(getCallerShortcuts())
+                    .isEmpty();
+        });
+
+        // Next.
+        // Update the build finger print.  All system apps will be scanned now.
+        mInjectedBuildFingerprint = "update1";
+        mInjectedCurrentTimeMillis += 1000;
+        mService.checkPackageChanges(USER_0);
+
+        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
+            assertWith(getCallerShortcuts())
+                    .haveIds("ms1");
+        });
+        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
+            assertWith(getCallerShortcuts())
+                    .isEmpty();
+        });
+
+        // Next.
+        // Update manifest shortcuts.
+        mInjectedBuildFingerprint = "update2";
+        addManifestShortcutResource(
+                new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
+                R.xml.shortcut_2);
+        addManifestShortcutResource(
+                new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()),
+                R.xml.shortcut_2);
+        mInjectedCurrentTimeMillis += 1000;
+        mService.checkPackageChanges(USER_0);
+
+        // Fingerprint hasn't changed, so CALLING_PACKAGE_1 wasn't scanned.
+        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
+            assertWith(getCallerShortcuts())
+                    .haveIds("ms1");
+        });
+        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
+            assertWith(getCallerShortcuts())
+                    .isEmpty();
+        });
+
+        // Update the fingerprint, but CALLING_PACKAGE_1's version code hasn't changed, so
+        // still not scanned.
+        mInjectedBuildFingerprint = "update2";
+        mInjectedCurrentTimeMillis += 1000;
+        mService.checkPackageChanges(USER_0);
+
+        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
+            assertWith(getCallerShortcuts())
+                    .haveIds("ms1");
+        });
+        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
+            assertWith(getCallerShortcuts())
+                    .isEmpty();
+        });
+
+        // Now update the version code, so CALLING_PACKAGE_1 is scanned again.
+        mInjectedBuildFingerprint = "update3";
+        mInjectedCurrentTimeMillis += 1000;
+        updatePackageVersion(CALLING_PACKAGE_1, 1);
+        mService.checkPackageChanges(USER_0);
+
+        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
+            assertWith(getCallerShortcuts())
+                    .haveIds("ms1", "ms2");
+        });
+        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
+            assertWith(getCallerShortcuts())
+                    .isEmpty();
+        });
+
+        // Make sure getLastAppScanTime / getLastAppScanOsFingerprint are persisted.
+        initService();
+        assertEquals(mInjectedCurrentTimeMillis,
+                mService.getUserShortcutsLocked(USER_0).getLastAppScanTime());
+        assertEquals(mInjectedBuildFingerprint,
+                mService.getUserShortcutsLocked(USER_0).getLastAppScanOsFingerprint());
+    }
+
     public void testHandlePackageChanged() {
         final ComponentName ACTIVITY1 = new ComponentName(CALLING_PACKAGE_1, "act1");
         final ComponentName ACTIVITY2 = new ComponentName(CALLING_PACKAGE_1, "act2");
diff --git a/services/tests/shortcutmanagerutils/Android.mk b/services/tests/shortcutmanagerutils/Android.mk
index 701e058..2818457 100644
--- a/services/tests/shortcutmanagerutils/Android.mk
+++ b/services/tests/shortcutmanagerutils/Android.mk
@@ -26,6 +26,6 @@
 
 LOCAL_MODULE := ShortcutManagerTestUtils
 
-LOCAL_SDK_VERSION := current
+LOCAL_SDK_VERSION := test_current
 
 include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java b/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java
index 78f95c4..1fe5cb7 100644
--- a/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java
+++ b/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java
@@ -156,10 +156,10 @@
         return result;
     }
 
-    private static List<String> runCommand(Instrumentation instrumentation, String command) {
+    public static List<String> runCommand(Instrumentation instrumentation, String command) {
         return runCommand(instrumentation, command, null);
     }
-    private static List<String> runCommand(Instrumentation instrumentation, String command,
+    public static List<String> runCommand(Instrumentation instrumentation, String command,
             Predicate<List<String>> resultAsserter) {
         Log.d(TAG, "Running command: " + command);
         final List<String> result;
@@ -175,11 +175,11 @@
         return result;
     }
 
-    private static void runCommandForNoOutput(Instrumentation instrumentation, String command) {
+    public static void runCommandForNoOutput(Instrumentation instrumentation, String command) {
         runCommand(instrumentation, command, result -> result.size() == 0);
     }
 
-    private static List<String> runShortcutCommand(Instrumentation instrumentation, String command,
+    public static List<String> runShortcutCommand(Instrumentation instrumentation, String command,
             Predicate<List<String>> resultAsserter) {
         return runCommand(instrumentation, "cmd shortcut " + command, resultAsserter);
     }
@@ -204,7 +204,8 @@
     }
 
     public static void setDefaultLauncher(Instrumentation instrumentation, String component) {
-        runCommand(instrumentation, "cmd package set-home-activity " + component,
+        runCommand(instrumentation, "cmd package set-home-activity --user "
+                + instrumentation.getContext().getUserId() + " " + component,
                 result -> result.contains("Success"));
     }
 
@@ -1053,7 +1054,11 @@
     }
 
     public static void retryUntil(BooleanSupplier checker, String message) {
-        final long timeOut = System.currentTimeMillis() + 30 * 1000; // wait for 30 seconds.
+        retryUntil(checker, message, 30);
+    }
+
+    public static void retryUntil(BooleanSupplier checker, String message, long timeoutSeconds) {
+        final long timeOut = System.currentTimeMillis() + timeoutSeconds * 1000;
         while (!checker.getAsBoolean()) {
             if (System.currentTimeMillis() > timeOut) {
                 break;
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index 43d2a1f..a04034e 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -535,6 +535,18 @@
                     + " user=" + userHandle);
         }
 
+        ComponentName getCurAssistant(int userHandle) {
+            String curAssistant = Settings.Secure.getStringForUser(
+                    mContext.getContentResolver(),
+                    Settings.Secure.ASSISTANT, userHandle);
+            if (TextUtils.isEmpty(curAssistant)) {
+                return null;
+            }
+            if (DEBUG) Slog.d(TAG, "getCurAssistant curAssistant=" + curAssistant
+                    + " user=" + userHandle);
+            return ComponentName.unflattenFromString(curAssistant);
+        }
+
         void resetCurAssistant(int userHandle) {
             Settings.Secure.putStringForUser(mContext.getContentResolver(),
                     Settings.Secure.ASSISTANT, null, userHandle);
@@ -1178,6 +1190,7 @@
                 synchronized (VoiceInteractionManagerServiceStub.this) {
                     ComponentName curInteractor = getCurInteractor(userHandle);
                     ComponentName curRecognizer = getCurRecognizer(userHandle);
+                    ComponentName curAssistant = getCurAssistant(userHandle);
                     if (curRecognizer == null) {
                         // Could a new recognizer appear when we don't have one pre-installed?
                         if (anyPackagesAppearing()) {
@@ -1196,6 +1209,7 @@
                             // the default config.
                             setCurInteractor(null, userHandle);
                             setCurRecognizer(null, userHandle);
+                            resetCurAssistant(userHandle);
                             initForUser(userHandle);
                             return;
                         }
@@ -1212,6 +1226,20 @@
                         return;
                     }
 
+                    if (curAssistant != null) {
+                        int change = isPackageDisappearing(curAssistant.getPackageName());
+                        if (change == PACKAGE_PERMANENT_CHANGE) {
+                            // If the currently set assistant is being removed, then we should
+                            // reset back to the default state (which is probably that we prefer
+                            // to have the default full voice interactor enabled).
+                            setCurInteractor(null, userHandle);
+                            setCurRecognizer(null, userHandle);
+                            resetCurAssistant(userHandle);
+                            initForUser(userHandle);
+                            return;
+                        }
+                    }
+
                     // There is no interactor, so just deal with a simple recognizer.
                     int change = isPackageDisappearing(curRecognizer.getPackageName());
                     if (change == PACKAGE_PERMANENT_CHANGE
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 4da5ff2..a093d54 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -461,6 +461,32 @@
      */
     public static final String EVENT_CALL_MERGE_FAILED = "android.telecom.event.CALL_MERGE_FAILED";
 
+    /**
+     * Connection event used to inform {@link InCallService}s when a call has been put on hold by
+     * the remote party.
+     * <p>
+     * This is different than the {@link Connection#STATE_HOLDING} state which indicates that the
+     * call is being held locally on the device.  When a capable {@link ConnectionService} receives
+     * signalling to indicate that the remote party has put the call on hold, it can send this
+     * connection event.
+     * @hide
+     */
+    public static final String EVENT_CALL_REMOTELY_HELD =
+            "android.telecom.event.CALL_REMOTELY_HELD";
+
+    /**
+     * Connection event used to inform {@link InCallService}s when a call which was remotely held
+     * (see {@link #EVENT_CALL_REMOTELY_HELD}) has been un-held by the remote party.
+     * <p>
+     * This is different than the {@link Connection#STATE_HOLDING} state which indicates that the
+     * call is being held locally on the device.  When a capable {@link ConnectionService} receives
+     * signalling to indicate that the remote party has taken the call off hold, it can send this
+     * connection event.
+     * @hide
+     */
+    public static final String EVENT_CALL_REMOTELY_UNHELD =
+            "android.telecom.event.CALL_REMOTELY_UNHELD";
+
     // Flag controlling whether PII is emitted into the logs
     private static final boolean PII_DEBUG = Log.isLoggable(android.util.Log.DEBUG);
 
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index dc9767c..d6a2ee3 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -870,6 +870,11 @@
 
     /**
      * Flag indicating whether the carrier supports the Hold command while in an IMS call.
+     * <p>
+     * The device configuration value {@code config_device_respects_hold_carrier_config} ultimately
+     * controls whether this carrier configuration option is used.  Where
+     * {@code config_device_respects_hold_carrier_config} is false, the value of the
+     * {@link #KEY_ALLOW_HOLD_IN_IMS_CALL_BOOL} carrier configuration option is ignored.
      * @hide
      */
     public static final String KEY_ALLOW_HOLD_IN_IMS_CALL_BOOL = "allow_hold_in_ims_call";
diff --git a/telephony/java/android/telephony/Rlog.java b/telephony/java/android/telephony/Rlog.java
index b4f400f..cd0a012 100644
--- a/telephony/java/android/telephony/Rlog.java
+++ b/telephony/java/android/telephony/Rlog.java
@@ -16,8 +16,15 @@
 
 package android.telephony;
 
+import android.text.TextUtils;
 import android.util.Log;
 
+import android.util.Base64;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+
 /**
  * A class to log strings to the RADIO LOG.
  *
@@ -87,11 +94,52 @@
 
     /**
      * Redact personally identifiable information for production users.
-     * If log tag is loggable in verbose mode, return the original string, otherwise return XXX.
+     * @param tag used to identify the source of a log message
+     * @param pii the personally identifiable information we want to apply secure hash on.
+     * @return If tag is loggable in verbose mode or pii is null, return the original input.
+     * otherwise return a secure Hash of input pii
      */
     public static String pii(String tag, Object pii) {
-        return (isLoggable(tag, Log.VERBOSE) ? String.valueOf(pii) : "XXX");
+        String val = String.valueOf(pii);
+        if (pii == null || TextUtils.isEmpty(val) || isLoggable(tag, Log.VERBOSE)) {
+            return val;
+        }
+        return "[" + secureHash(val.getBytes()) + "]";
     }
 
+    /**
+     * Redact personally identifiable information for production users.
+     * @param enablePiiLogging set when caller explicitly want to enable sensitive logging.
+     * @param pii the personally identifiable information we want to apply secure hash on.
+     * @return If enablePiiLogging is set to true or pii is null, return the original input.
+     * otherwise return a secure Hash of input pii
+     */
+    public static String pii(boolean enablePiiLogging, Object pii) {
+        String val = String.valueOf(pii);
+        if (pii == null || TextUtils.isEmpty(val) || enablePiiLogging) {
+            return val;
+        }
+        return "[" + secureHash(val.getBytes()) + "]";
+    }
+
+    /**
+     * Returns a secure hash (using the SHA1 algorithm) of the provided input.
+     *
+     * @return the hash
+     * @param input the bytes for which the secure hash should be computed.
+     */
+    private static String secureHash(byte[] input) {
+        MessageDigest messageDigest;
+
+        try {
+            messageDigest = MessageDigest.getInstance("SHA-1");
+        } catch (NoSuchAlgorithmException e) {
+            return "####";
+        }
+
+        byte[] result = messageDigest.digest(input);
+        return Base64.encodeToString(
+                result, Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP);
+    }
 }
 
diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java
index 6229ed9..cf2d27e 100644
--- a/telephony/java/android/telephony/SubscriptionInfo.java
+++ b/telephony/java/android/telephony/SubscriptionInfo.java
@@ -340,7 +340,7 @@
         String iccIdToPrint = null;
         if (iccId != null) {
             if (iccId.length() > 9 && !Build.IS_DEBUGGABLE) {
-                iccIdToPrint = iccId.substring(0, 9) + "XXXXXXXXXXX";
+                iccIdToPrint = iccId.substring(0, 9) + Rlog.pii(false, iccId.substring(9));
             } else {
                 iccIdToPrint = iccId;
             }
diff --git a/tools/fonts/fontchain_lint.py b/tools/fonts/fontchain_lint.py
index 2956d87..7ec46a3e 100755
--- a/tools/fonts/fontchain_lint.py
+++ b/tools/fonts/fontchain_lint.py
@@ -256,8 +256,8 @@
 
 
 def check_emoji_coverage(all_emoji, equivalent_emoji):
-  emoji_font = get_emoji_font()
-  check_emoji_font_coverage(emoji_font, all_emoji, equivalent_emoji)
+    emoji_font = get_emoji_font()
+    check_emoji_font_coverage(emoji_font, all_emoji, equivalent_emoji)
 
 
 def get_emoji_font():
@@ -274,15 +274,12 @@
         assert sequence in coverage, (
             '%s is not supported in the emoji font.' % printable(sequence))
 
-    # disable temporarily - we cover more than this
-    """
     for sequence in coverage:
         if sequence in {0x0000, 0x000D, 0x0020}:
             # The font needs to support a few extra characters, which is OK
             continue
         assert sequence in all_emoji, (
             'Emoji font should not support %s.' % printable(sequence))
-    """
 
     for first, second in sorted(equivalent_emoji.items()):
         assert coverage[first] == coverage[second], (
@@ -290,8 +287,6 @@
                 printable(first),
                 printable(second)))
 
-    # disable temporarily - some equivalent sequences we don't even know about
-    """
     for glyph in set(coverage.values()):
         maps_to_glyph = [seq for seq in coverage if coverage[seq] == glyph]
         if len(maps_to_glyph) > 1:
@@ -307,7 +302,7 @@
                 'The sequences %s should not result in the same glyph %s' % (
                     printable(equivalent_seqs),
                     glyph))
-    """
+
 
 def check_emoji_defaults(default_emoji):
     missing_text_chars = _emoji_properties['Emoji'] - default_emoji
@@ -334,15 +329,9 @@
     # Noto does not have monochrome glyphs for Unicode 7.0 wingdings and
     # webdings yet.
     missing_text_chars -= _chars_by_age['7.0']
-    # TODO: Remove these after b/26113320 is fixed
-    missing_text_chars -= {
-        0x263A, # WHITE SMILING FACE
-        0x270C, # VICTORY HAND
-        0x2744, # SNOWFLAKE
-        0x2764, # HEAVY BLACK HEART
-    }
     assert missing_text_chars == set(), (
-        'Text style version of some emoji characters are missing: ' + repr(missing_text_chars))
+        'Text style version of some emoji characters are missing: ' +
+            repr(missing_text_chars))
 
 
 # Setting reverse to true returns a dictionary that maps the values to sets of
@@ -362,7 +351,7 @@
             if not line:
                 continue
 
-            chars, prop = line.split(';')
+            chars, prop = line.split(';')[:2]
             chars = chars.strip()
             prop = prop.strip()
 
@@ -423,26 +412,6 @@
     _emoji_zwj_sequences = parse_unicode_datafile(
         path.join(ucd_path, 'emoji-zwj-sequences.txt'))
 
-    # filter modern pentathlon, as it seems likely to be removed from final spec
-    # also filter rifle
-    def is_excluded(n):
-        return n in [0x1f93b, 0x1f946]
-
-    def contains_excluded(t):
-        if type(t) == int:
-            return is_excluded(t)
-        return any(is_excluded(cp) for cp in t)
-
-    # filter modern pentathlon, as it seems likely to be removed from final spec
-    _emoji_properties['Emoji'] = set(
-        t for t in _emoji_properties['Emoji'] if not contains_excluded(t))
-    _emoji_sequences = dict(
-        (t, v) for (t, v) in _emoji_sequences.items() if not contains_excluded(t))
-
-    # add in UN flag
-    UN_seq = flag_sequence('UN')
-    _emoji_sequences[UN_seq] = 'Emoji_Flag_Sequence'
-
 
 def flag_sequence(territory_code):
     return tuple(0x1F1E6 + ord(ch) - ord('A') for ch in territory_code)
@@ -454,7 +423,8 @@
     flag_sequence('GF'), flag_sequence('GP'), flag_sequence('GS'),
     flag_sequence('MF'), flag_sequence('MQ'), flag_sequence('NC'),
     flag_sequence('PM'), flag_sequence('RE'), flag_sequence('TF'),
-    flag_sequence('WF'), flag_sequence('XK'), flag_sequence('YT'),
+    flag_sequence('UN'), flag_sequence('WF'), flag_sequence('XK'),
+    flag_sequence('YT'),
 })
 
 EQUIVALENT_FLAGS = {
@@ -467,6 +437,22 @@
 
 COMBINING_KEYCAP = 0x20E3
 
+# Characters that Android defaults to emoji style, different from the recommendations in UTR #51
+ANDROID_DEFAULT_EMOJI = frozenset({
+    0x2600, # BLACK SUN WITH RAYS
+    0x2601, # CLOUD
+    0x260E, # BLACK TELEPHONE
+    0x261D, # WHITE UP POINTING INDEX
+    0x263A, # WHITE SMILING FACE
+    0x2660, # BLACK SPADE SUIT
+    0x2663, # BLACK CLUB SUIT
+    0x2665, # BLACK HEART SUIT
+    0x2666, # BLACK DIAMOND SUIT
+    0x270C, # VICTORY HAND
+    0x2744, # SNOWFLAKE
+    0x2764, # HEAVY BLACK HEART
+})
+
 LEGACY_ANDROID_EMOJI = {
     0xFE4E5: flag_sequence('JP'),
     0xFE4E6: flag_sequence('US'),
@@ -502,7 +488,17 @@
 
 
 def is_fitzpatrick_modifier(cp):
-  return 0x1f3fb <= cp <= 0x1f3ff
+    return 0x1F3FB <= cp <= 0x1F3FF
+
+
+def reverse_emoji(seq):
+    rev = list(reversed(seq))
+    # if there are fitzpatrick modifiers in the sequence, keep them after
+    # the emoji they modify
+    for i in xrange(1, len(rev)):
+        if is_fitzpatrick_modifier(rev[i-1]):
+            rev[i], rev[i-1] = rev[i-1], rev[i]
+    return tuple(rev)
 
 
 def compute_expected_emoji():
@@ -511,26 +507,52 @@
     all_sequences = set()
     all_sequences.update(_emoji_variation_sequences)
 
+    # add zwj sequences not in the current emoji-zwj-sequences.txt
+    adjusted_emoji_zwj_sequences = dict(_emoji_zwj_sequences)
+    adjusted_emoji_zwj_sequences.update(_emoji_zwj_sequences)
+    # single parent families
+    additional_emoji_zwj = (
+        (0x1F468, 0x200D, 0x1F466),
+        (0x1F468, 0x200D, 0x1F467),
+        (0x1F468, 0x200D, 0x1F466, 0x200D, 0x1F466),
+        (0x1F468, 0x200D, 0x1F467, 0x200D, 0x1F466),
+        (0x1F468, 0x200D, 0x1F467, 0x200D, 0x1F467),
+        (0x1F469, 0x200D, 0x1F466),
+        (0x1F469, 0x200D, 0x1F467),
+        (0x1F469, 0x200D, 0x1F466, 0x200D, 0x1F466),
+        (0x1F469, 0x200D, 0x1F467, 0x200D, 0x1F466),
+        (0x1F469, 0x200D, 0x1F467, 0x200D, 0x1F467),
+    )
+    # sequences formed from man and woman and optional fitzpatrick modifier
+    modified_extensions = (
+        0x2696,
+        0x2708,
+        0x1F3A8,
+        0x1F680,
+        0x1F692,
+    )
+    for seq in additional_emoji_zwj:
+        adjusted_emoji_zwj_sequences[seq] = 'Emoji_ZWJ_Sequence'
+    for ext in modified_extensions:
+        for base in (0x1F468, 0x1F469):
+            seq = (base, 0x200D, ext)
+            adjusted_emoji_zwj_sequences[seq] = 'Emoji_ZWJ_Sequence'
+            for modifier in range(0x1F3FB, 0x1F400):
+                seq = (base, modifier, 0x200D, ext)
+                adjusted_emoji_zwj_sequences[seq] = 'Emoji_ZWJ_Sequence'
+
     for sequence in _emoji_sequences.keys():
         sequence = tuple(ch for ch in sequence if ch != EMOJI_VS)
         all_sequences.add(sequence)
         sequence_pieces.update(sequence)
 
-    for sequence in _emoji_zwj_sequences.keys():
+    for sequence in adjusted_emoji_zwj_sequences.keys():
         sequence = tuple(ch for ch in sequence if ch != EMOJI_VS)
         all_sequences.add(sequence)
         sequence_pieces.update(sequence)
         # Add reverse of all emoji ZWJ sequences, which are added to the fonts
         # as a workaround to get the sequences work in RTL text.
-        reversed_seq = list(reversed(sequence))
-        # if there are fitzpatrick modifiers in the sequence, keep them after
-        # the emoji they modify
-        for i in xrange(1, len(reversed_seq)):
-          if is_fitzpatrick_modifier(reversed_seq[i - 1]):
-            tmp = reversed_seq[i]
-            reversed_seq[i] = reversed_seq[i-1]
-            reversed_seq[i-1] = tmp
-        reversed_seq = tuple(reversed_seq)
+        reversed_seq = reverse_emoji(sequence)
         all_sequences.add(reversed_seq)
         equivalent_emoji[reversed_seq] = sequence
 
@@ -549,6 +571,7 @@
         set(LEGACY_ANDROID_EMOJI.keys()))
     default_emoji = (
         _emoji_properties['Emoji_Presentation'] |
+        ANDROID_DEFAULT_EMOJI |
         all_sequences |
         set(LEGACY_ANDROID_EMOJI.keys()))
 
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index 5a9860d..58df301 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -351,7 +351,8 @@
     }
 
     @Override
-    public void notifyAppResumed(IBinder token, boolean wasStopped) throws RemoteException {
+    public void notifyAppResumed(IBinder token, boolean wasStopped, boolean allowSavedSurface)
+            throws RemoteException {
         // TODO Auto-generated method stub
     }
 
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 9d0c20c..d3d5ea0 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -817,6 +817,7 @@
          */
         public static final int NETWORK_SELECTION_ENABLE = 0;
         /**
+         * @deprecated it is not used any more.
          * This network is disabled because higher layer (>2) network is bad
          */
         public static final int DISABLED_BAD_LINK = 1;
@@ -862,7 +863,7 @@
          */
         private static final String[] QUALITY_NETWORK_SELECTION_DISABLE_REASON = {
                 "NETWORK_SELECTION_ENABLE",
-                "NETWORK_SELECTION_DISABLED_BAD_LINK",
+                "NETWORK_SELECTION_DISABLED_BAD_LINK", // deprecated
                 "NETWORK_SELECTION_DISABLED_ASSOCIATION_REJECTION ",
                 "NETWORK_SELECTION_DISABLED_AUTHENTICATION_FAILURE",
                 "NETWORK_SELECTION_DISABLED_DHCP_FAILURE",
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index bbc3d2f..1633bd9c9 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -49,6 +49,8 @@
  * This class provides the primary API for managing all aspects of Wi-Fi
  * connectivity. Get an instance of this class by calling
  * {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.WIFI_SERVICE)}.
+ * On releases before NYC, it should only be obtained from an application context, and not from
+ * any other derived context to avoid memory leaks within the calling process.
 
  * It deals with several categories of items:
  * <ul>