Merge "Import translations. DO NOT MERGE"
diff --git a/cmds/bootanimation/Android.mk b/cmds/bootanimation/Android.mk
index 3cf13d9..3a92b9e 100644
--- a/cmds/bootanimation/Android.mk
+++ b/cmds/bootanimation/Android.mk
@@ -36,8 +36,4 @@
 LOCAL_32_BIT_ONLY := true
 endif
 
-# get asserts to work
-APP_OPTIM := debug
-LOCAL_CFLAGS += -UNDEBUG
-
 include $(BUILD_EXECUTABLE)
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index 4098772..ebcc9ff 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -588,7 +588,7 @@
         return false;
     }
 
-    bool hasAudio = false;
+    Animation::Part* partWithAudio = NULL;
     ZipEntryRO entry;
     char name[ANIM_ENTRY_NAME_MAX];
     while ((entry = zip->nextEntry(cookie)) != NULL) {
@@ -612,10 +612,10 @@
                             if (map) {
                                 Animation::Part& part(animation.parts.editItemAt(j));
                                 if (leaf == "audio.wav") {
-                                    hasAudio = true;
                                     // a part may have at most one audio file
                                     part.audioData = (uint8_t *)map->getDataPtr();
                                     part.audioLength = map->getDataLength();
+                                    partWithAudio = ∂
                                 } else if (leaf == "trim.txt") {
                                     part.trimData.setTo((char const*)map->getDataPtr(),
                                                         map->getDataLength());
@@ -666,9 +666,11 @@
     }
 
     // Create and initialize audioplay if there is a wav file in any of the animations.
-    if (hasAudio) {
+    if (partWithAudio != NULL) {
         ALOGD("found audio.wav, creating playback engine");
-        audioplay::create();
+        if (!audioplay::create(partWithAudio->audioData, partWithAudio->audioLength)) {
+            return false;
+        }
     }
 
     zip->endIteration(cookie);
@@ -904,7 +906,10 @@
     mLoadedFiles.add(animation->fileName);
 
     parseAnimationDesc(*animation);
-    preloadZip(*animation);
+    if (!preloadZip(*animation)) {
+        return NULL;
+    }
+
 
     mLoadedFiles.remove(fn);
     return animation;
diff --git a/cmds/bootanimation/audioplay.cpp b/cmds/bootanimation/audioplay.cpp
index e20ef0c..8a5c2c6 100644
--- a/cmds/bootanimation/audioplay.cpp
+++ b/cmds/bootanimation/audioplay.cpp
@@ -21,7 +21,6 @@
 
 #define CHATTY ALOGD
 
-#include <assert.h>
 #include <string.h>
 
 #include <utils/Log.h>
@@ -80,8 +79,6 @@
 void bqPlayerCallback(SLAndroidSimpleBufferQueueItf bq, void *context) {
     (void)bq;
     (void)context;
-    assert(bq == bqPlayerBufferQueue);
-    assert(NULL == context);
     audioplay::setPlaying(false);
 }
 
@@ -90,39 +87,56 @@
 }
 
 // create the engine and output mix objects
-void createEngine() {
+bool createEngine() {
     SLresult result;
 
     // create engine
     result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
-    assert(SL_RESULT_SUCCESS == result);
+    if (result != SL_RESULT_SUCCESS) {
+        ALOGE("slCreateEngine failed with result %d", result);
+        return false;
+    }
     (void)result;
 
     // realize the engine
     result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
-    assert(SL_RESULT_SUCCESS == result);
+    if (result != SL_RESULT_SUCCESS) {
+        ALOGE("sl engine Realize failed with result %d", result);
+        return false;
+    }
     (void)result;
 
     // get the engine interface, which is needed in order to create other objects
     result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);
-    assert(SL_RESULT_SUCCESS == result);
+    if (result != SL_RESULT_SUCCESS) {
+        ALOGE("sl engine GetInterface failed with result %d", result);
+        return false;
+    }
     (void)result;
 
     // create output mix, with environmental reverb specified as a non-required interface
     const SLInterfaceID ids[1] = {SL_IID_ENVIRONMENTALREVERB};
     const SLboolean req[1] = {SL_BOOLEAN_FALSE};
     result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 1, ids, req);
-    assert(SL_RESULT_SUCCESS == result);
+    if (result != SL_RESULT_SUCCESS) {
+        ALOGE("sl engine CreateOutputMix failed with result %d", result);
+        return false;
+    }
     (void)result;
 
     // realize the output mix
     result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE);
-    assert(SL_RESULT_SUCCESS == result);
+    if (result != SL_RESULT_SUCCESS) {
+        ALOGE("sl outputMix Realize failed with result %d", result);
+        return false;
+    }
     (void)result;
+
+    return true;
 }
 
 // create buffer queue audio player
-void createBufferQueueAudioPlayer(const ChunkFormat* chunkFormat) {
+bool createBufferQueueAudioPlayer(const ChunkFormat* chunkFormat) {
     SLresult result;
 
     // configure audio source
@@ -148,83 +162,89 @@
     const SLboolean req[2] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE};
     result = (*engineEngine)->CreateAudioPlayer(engineEngine, &bqPlayerObject, &audioSrc, &audioSnk,
             2, ids, req);
-    assert(SL_RESULT_SUCCESS == result);
+    if (result != SL_RESULT_SUCCESS) {
+        ALOGE("sl CreateAudioPlayer failed with result %d", result);
+        return false;
+    }
     (void)result;
 
     // realize the player
     result = (*bqPlayerObject)->Realize(bqPlayerObject, SL_BOOLEAN_FALSE);
-    assert(SL_RESULT_SUCCESS == result);
+    if (result != SL_RESULT_SUCCESS) {
+        ALOGE("sl player Realize failed with result %d", result);
+        return false;
+    }
     (void)result;
 
     // get the play interface
     result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_PLAY, &bqPlayerPlay);
-    assert(SL_RESULT_SUCCESS == result);
+    if (result != SL_RESULT_SUCCESS) {
+        ALOGE("sl player GetInterface failed with result %d", result);
+        return false;
+    }
     (void)result;
 
     // get the buffer queue interface
     result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_BUFFERQUEUE,
             &bqPlayerBufferQueue);
-    assert(SL_RESULT_SUCCESS == result);
+    if (result != SL_RESULT_SUCCESS) {
+        ALOGE("sl playberBufferQueue GetInterface failed with result %d", result);
+        return false;
+    }
     (void)result;
 
     // register callback on the buffer queue
     result = (*bqPlayerBufferQueue)->RegisterCallback(bqPlayerBufferQueue, bqPlayerCallback, NULL);
-    assert(SL_RESULT_SUCCESS == result);
+    if (result != SL_RESULT_SUCCESS) {
+        ALOGE("sl bqPlayerBufferQueue RegisterCallback failed with result %d", result);
+        return false;
+    }
     (void)result;
 
-#if 0   // mute/solo is not supported for sources that are known to be mono, as this is
-    // get the mute/solo interface
-    result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_MUTESOLO, &bqPlayerMuteSolo);
-    assert(SL_RESULT_SUCCESS == result);
-    (void)result;
-#endif
-
     // get the volume interface
     result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_VOLUME, &bqPlayerVolume);
-    assert(SL_RESULT_SUCCESS == result);
+    if (result != SL_RESULT_SUCCESS) {
+        ALOGE("sl volume GetInterface failed with result %d", result);
+        return false;
+    }
     (void)result;
 
     // set the player's state to playing
     audioplay::setPlaying(true);
     CHATTY("Created buffer queue player: %p", bqPlayerBufferQueue);
+    return true;
 }
 
-} // namespace
-
-void create() {
-    createEngine();
-}
-
-bool playClip(const uint8_t* buf, int size) {
-    // Parse the WAV header
-    nextBuffer = buf;
-    nextSize = size;
-    const RiffWaveHeader* wavHeader = (const RiffWaveHeader*)buf;
-    if (nextSize < sizeof(*wavHeader) || (wavHeader->riff_id != ID_RIFF) ||
+bool parseClipBuf(const uint8_t* clipBuf, int clipBufSize, const ChunkFormat** oChunkFormat,
+                  const uint8_t** oSoundBuf, unsigned* oSoundBufSize) {
+    *oSoundBuf = clipBuf;
+    *oSoundBufSize = clipBufSize;
+    *oChunkFormat = NULL;
+    const RiffWaveHeader* wavHeader = (const RiffWaveHeader*)*oSoundBuf;
+    if (*oSoundBufSize < sizeof(*wavHeader) || (wavHeader->riff_id != ID_RIFF) ||
         (wavHeader->wave_id != ID_WAVE)) {
         ALOGE("Error: audio file is not a riff/wave file\n");
         return false;
     }
-    nextBuffer += sizeof(*wavHeader);
-    nextSize -= sizeof(*wavHeader);
+    *oSoundBuf += sizeof(*wavHeader);
+    *oSoundBufSize -= sizeof(*wavHeader);
 
-    const ChunkFormat* chunkFormat = nullptr;
     while (true) {
-        const ChunkHeader* chunkHeader = (const ChunkHeader*)nextBuffer;
-        if (nextSize < sizeof(*chunkHeader)) {
+        const ChunkHeader* chunkHeader = (const ChunkHeader*)*oSoundBuf;
+        if (*oSoundBufSize < sizeof(*chunkHeader)) {
             ALOGE("EOF reading chunk headers");
             return false;
         }
 
-        nextBuffer += sizeof(*chunkHeader);
-        nextSize -= sizeof(*chunkHeader);
+        *oSoundBuf += sizeof(*chunkHeader);
+        *oSoundBufSize -= sizeof(*chunkHeader);
 
         bool endLoop = false;
         switch (chunkHeader->id) {
             case ID_FMT:
-                chunkFormat = (const ChunkFormat*)nextBuffer;
-                nextBuffer += chunkHeader->sz;
-                nextSize -= chunkHeader->sz;
+                *oChunkFormat = (const ChunkFormat*)*oSoundBuf;
+                *oSoundBuf += chunkHeader->sz;
+                *oSoundBufSize -= chunkHeader->sz;
                 break;
             case ID_DATA:
                 /* Stop looking for chunks */
@@ -232,27 +252,49 @@
                 break;
             default:
                 /* Unknown chunk, skip bytes */
-                nextBuffer += chunkHeader->sz;
-                nextSize -= chunkHeader->sz;
+                *oSoundBuf += chunkHeader->sz;
+                *oSoundBufSize -= chunkHeader->sz;
         }
         if (endLoop) {
             break;
         }
     }
 
-    if (!chunkFormat) {
+    if (*oChunkFormat == NULL) {
         ALOGE("format not found in WAV file");
         return false;
     }
+    return true;
+}
 
-    // If this is the first clip, create the buffer based on this WAV's header.
-    // We assume all future clips with be in the same format.
-    if (bqPlayerBufferQueue == nullptr) {
-        createBufferQueueAudioPlayer(chunkFormat);
+} // namespace
+
+bool create(const uint8_t* exampleClipBuf, int exampleClipBufSize) {
+    if (!createEngine()) {
+        return false;
     }
 
-    assert(bqPlayerBufferQueue != nullptr);
-    assert(buf != nullptr);
+    // Parse the example clip.
+    const ChunkFormat* chunkFormat;
+    const uint8_t* soundBuf;
+    unsigned soundBufSize;
+    if (!parseClipBuf(exampleClipBuf, exampleClipBufSize, &chunkFormat, &soundBuf, &soundBufSize)) {
+        return false;
+    }
+
+    // Initialize the BufferQueue based on this clip's format.
+    if (!createBufferQueueAudioPlayer(chunkFormat)) {
+        return false;
+    }
+    return true;
+}
+
+bool playClip(const uint8_t* buf, int size) {
+    // Parse the WAV header
+    const ChunkFormat* chunkFormat;
+    if (!parseClipBuf(buf, size, &chunkFormat, &nextBuffer, &nextSize)) {
+        return false;
+    }
 
     if (!hasPlayer()) {
         ALOGD("cannot play clip %p without a player", buf);
@@ -285,8 +327,6 @@
         // set the player's state
         result = (*bqPlayerPlay)->SetPlayState(bqPlayerPlay,
             isPlaying ? SL_PLAYSTATE_PLAYING : SL_PLAYSTATE_STOPPED);
-        assert(SL_RESULT_SUCCESS == result);
-        (void)result;
     }
 
 }
diff --git a/cmds/bootanimation/audioplay.h b/cmds/bootanimation/audioplay.h
index bdc0a1c..0e5705a 100644
--- a/cmds/bootanimation/audioplay.h
+++ b/cmds/bootanimation/audioplay.h
@@ -22,10 +22,12 @@
 
 namespace audioplay {
 
-void create();
+// Initializes the engine with an example of the type of WAV clip to play.
+// All buffers passed to playClip are assumed to be in the same format.
+bool create(const uint8_t* exampleClipBuf, int exampleClipBufSize);
 
-// Play a WAV pointed to by buf.  All clips are assumed to be in the same format.
-// playClip should not be called while a clip is still playing.
+// Plays a WAV contained in buf.
+// Should not be called while a clip is still playing.
 bool playClip(const uint8_t* buf, int size);
 void setPlaying(bool isPlaying);
 void destroy();
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 0d2fd2e..082e136 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -3523,6 +3523,8 @@
             boolean validRemoteInput = false;
 
             int N = mActions.size();
+            boolean emphazisedMode = mN.fullScreenIntent != null;
+            big.setBoolean(R.id.actions, "setEmphasizedMode", emphazisedMode);
             if (N > 0) {
                 big.setViewVisibility(R.id.actions_container, View.VISIBLE);
                 big.setViewVisibility(R.id.actions, View.VISIBLE);
@@ -3533,7 +3535,8 @@
                     Action action = mActions.get(i);
                     validRemoteInput |= hasValidRemoteInput(action);
 
-                    final RemoteViews button = generateActionButton(action);
+                    final RemoteViews button = generateActionButton(action, emphazisedMode,
+                            i % 2 != 0);
                     big.addView(R.id.actions, button);
                 }
             } else {
@@ -3698,11 +3701,13 @@
 
 
 
-        private RemoteViews generateActionButton(Action action) {
+        private RemoteViews generateActionButton(Action action, boolean emphazisedMode,
+                boolean oddAction) {
             final boolean tombstone = (action.actionIntent == null);
             RemoteViews button = new BuilderRemoteViews(mContext.getApplicationInfo(),
-                    tombstone ? getActionTombstoneLayoutResource()
-                              : getActionLayoutResource());
+                    emphazisedMode ? getEmphasizedActionLayoutResource()
+                            : tombstone ? getActionTombstoneLayoutResource()
+                                    : getActionLayoutResource());
             final Icon ai = action.getIcon();
             button.setTextViewText(R.id.action0, processLegacyText(action.title));
             if (!tombstone) {
@@ -3712,8 +3717,18 @@
             if (action.mRemoteInputs != null) {
                 button.setRemoteInputs(R.id.action0, action.mRemoteInputs);
             }
-            if (mN.color != COLOR_DEFAULT) {
-                button.setTextColor(R.id.action0, resolveContrastColor());
+            if (emphazisedMode) {
+                // change the background color
+                int color = resolveContrastColor();
+                if (oddAction) {
+                    color = NotificationColorUtil.lightenColor(color, 10);
+                }
+                button.setDrawableParameters(R.id.button_holder, true, -1, color,
+                        PorterDuff.Mode.SRC_ATOP, -1);
+            } else {
+                if (mN.color != COLOR_DEFAULT) {
+                    button.setTextColor(R.id.action0, resolveContrastColor());
+                }
             }
             return button;
         }
@@ -3983,6 +3998,10 @@
             return R.layout.notification_material_action;
         }
 
+        private int getEmphasizedActionLayoutResource() {
+            return R.layout.notification_material_action_emphasized;
+        }
+
         private int getActionTombstoneLayoutResource() {
             return R.layout.notification_material_action_tombstone;
         }
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index fbd78e9..6e58f09 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -1315,7 +1315,7 @@
 
     /**
      * Retrieve the current minimum password quality for a particular admin or all admins that set
-     * retrictions on this user and its participating profiles. Restrictions on profiles that have
+     * restrictions on this user and its participating profiles. Restrictions on profiles that have
      * a separate challenge are not taken into account.
      *
      * <p>This method can be called on the {@link DevicePolicyManager} instance
@@ -1379,7 +1379,7 @@
 
     /**
      * Retrieve the current minimum password length for a particular admin or all admins that set
-     * retrictions on this user and its participating profiles. Restrictions on profiles that have
+     * restrictions on this user and its participating profiles. Restrictions on profiles that have
      * a separate challenge are not taken into account.
      *
      * <p>This method can be called on the {@link DevicePolicyManager} instance
@@ -1442,7 +1442,7 @@
 
     /**
      * Retrieve the current number of upper case letters required in the password
-     * for a particular admin or all admins that set retrictions on this user and
+     * for a particular admin or all admins that set restrictions on this user and
      * its participating profiles. Restrictions on profiles that have a separate challenge
      * are not taken into account.
      * This is the same value as set by
@@ -1511,7 +1511,7 @@
 
     /**
      * Retrieve the current number of lower case letters required in the password
-     * for a particular admin or all admins that set retrictions on this user
+     * for a particular admin or all admins that set restrictions on this user
      * and its participating profiles. Restrictions on profiles that have
      * a separate challenge are not taken into account.
      * This is the same value as set by
@@ -1580,7 +1580,7 @@
 
     /**
      * Retrieve the current number of letters required in the password
-     * for a particular admin or all admins that set retrictions on this user
+     * for a particular admin or all admins that set restrictions on this user
      * and its participating profiles. Restrictions on profiles that have
      * a separate challenge are not taken into account.
      * This is the same value as set by
@@ -1648,7 +1648,7 @@
 
     /**
      * Retrieve the current number of numerical digits required in the password
-     * for a particular admin or all admins that set retrictions on this user
+     * for a particular admin or all admins that set restrictions on this user
      * and its participating profiles. Restrictions on profiles that have
      * a separate challenge are not taken into account.
      * This is the same value as set by
@@ -1716,7 +1716,7 @@
 
     /**
      * Retrieve the current number of symbols required in the password
-     * for a particular admin or all admins that set retrictions on this user
+     * for a particular admin or all admins that set restrictions on this user
      * and its participating profiles. Restrictions on profiles that have
      * a separate challenge are not taken into account. This is the same value as
      * set by {@link #setPasswordMinimumSymbols(ComponentName, int)}
@@ -1783,7 +1783,7 @@
 
     /**
      * Retrieve the current number of non-letter characters required in the password
-     * for a particular admin or all admins that set retrictions on this user
+     * for a particular admin or all admins that set restrictions on this user
      * and its participating profiles. Restrictions on profiles that have
      * a separate challenge are not taken into account.
      * This is the same value as set by
@@ -1915,7 +1915,7 @@
 
     /**
      * Get the current password expiration time for a particular admin or all admins that set
-     * retrictions on this user and its participating profiles. Restrictions on profiles that have
+     * restrictions on this user and its participating profiles. Restrictions on profiles that have
      * a separate challenge are not taken into account. If admin is {@code null}, then a composite
      * of all expiration times is returned - which will be the minimum of all of them.
      *
@@ -1939,7 +1939,7 @@
 
     /**
      * Retrieve the current password history length for a particular admin or all admins that
-     * set retrictions on this user and its participating profiles. Restrictions on profiles that
+     * set restrictions on this user and its participating profiles. Restrictions on profiles that
      * have a separate challenge are not taken into account.
      *
      * <p>This method can be called on the {@link DevicePolicyManager} instance
@@ -2121,7 +2121,7 @@
 
     /**
      * Retrieve the current maximum number of login attempts that are allowed before the device
-     * or profile is wiped, for a particular admin or all admins that set retrictions on this user
+     * or profile is wiped, for a particular admin or all admins that set restrictions on this user
      * and its participating profiles. Restrictions on profiles that have a separate challenge are
      * not taken into account.
      *
@@ -2262,7 +2262,7 @@
 
     /**
      * Retrieve the current maximum time to unlock for a particular admin or all admins that set
-     * retrictions on this user and its participating profiles. Restrictions on profiles that have
+     * restrictions on this user and its participating profiles. Restrictions on profiles that have
      * a separate challenge are not taken into account.
      *
      * <p>This method can be called on the {@link DevicePolicyManager} instance
@@ -3349,7 +3349,7 @@
 
     /**
      * Determine whether or not features have been disabled in keyguard either by the calling
-     * admin, if specified, or all admins that set retrictions on this user and its participating
+     * admin, if specified, or all admins that set restrictions on this user and its participating
      * profiles. Restrictions on profiles that have a separate challenge are not taken into account.
      *
      * <p>This method can be called on the {@link DevicePolicyManager} instance
diff --git a/core/java/android/app/job/JobInfo.java b/core/java/android/app/job/JobInfo.java
index 49f32ab..2d6b45d 100644
--- a/core/java/android/app/job/JobInfo.java
+++ b/core/java/android/app/job/JobInfo.java
@@ -166,6 +166,9 @@
      * network restrictions for the requesting app. Note that this flag alone
      * doesn't actually place your {@link JobService} in the foreground; you
      * still need to post the notification yourself.
+     * <p>
+     * To use this flag, the caller must hold the
+     * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL} permission.
      *
      * @hide
      */
diff --git a/core/java/android/content/res/TypedArray.java b/core/java/android/content/res/TypedArray.java
index 92134ee..1e44a5c 100644
--- a/core/java/android/content/res/TypedArray.java
+++ b/core/java/android/content/res/TypedArray.java
@@ -49,6 +49,10 @@
             attrs.mLength = len;
             attrs.mRecycled = false;
 
+            // Reset the assets, which may have changed due to configuration changes
+            // or further resource loading.
+            attrs.mAssets = res.getAssets();
+
             final int fullLen = len * AssetManager.STYLE_NUM_ENTRIES;
             if (attrs.mData.length >= fullLen) {
                 return attrs;
@@ -66,7 +70,7 @@
 
     private final Resources mResources;
     private final DisplayMetrics mMetrics;
-    private final AssetManager mAssets;
+    private AssetManager mAssets;
 
     private boolean mRecycled;
 
@@ -1086,6 +1090,7 @@
         // These may have been set by the client.
         mXml = null;
         mTheme = null;
+        mAssets = null;
 
         mResources.mTypedArrayPool.release(this);
     }
diff --git a/core/java/android/net/network-policy-restrictions.md b/core/java/android/net/network-policy-restrictions.md
index fe13f7a..63ce1a2 100644
--- a/core/java/android/net/network-policy-restrictions.md
+++ b/core/java/android/net/network-policy-restrictions.md
@@ -29,8 +29,8 @@
 | **DS**  |  *WL* |  ok  | blk   |  ok  |  ok   |
 | **ON**  | *!WL* | blk  | blk   | blk  | blk   |
 |         |  *BL* | blk  | blk   | blk  | blk   |
-| **DS**  |  *WL* | blk  |  ok   |  ok  |  ok   |
-| **OFF** | *!WL* | blk  |  ok   |  ok  |  ok   |
+| **DS**  |  *WL* | blk  | blk   |  ok  |  ok   |
+| **OFF** | *!WL* | blk  | blk   |  ok  |  ok   |
 |         |  *BL* | blk  | blk   | blk  | blk   |
 
 
diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
index 80927f3..8d6d9ed 100644
--- a/core/java/android/os/Environment.java
+++ b/core/java/android/os/Environment.java
@@ -286,6 +286,11 @@
     }
 
     /** {@hide} */
+    public static File getReferenceProfile(String packageName) {
+        return buildPath(getDataDirectory(), "misc", "profiles", "ref", packageName);
+    }
+
+    /** {@hide} */
     public static File getDataProfilesDePackageDirectory(int userId, String packageName) {
         return buildPath(getDataProfilesDeDirectory(userId), packageName);
     }
diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java
index b0ea99c..c51a613 100644
--- a/core/java/android/provider/DocumentsContract.java
+++ b/core/java/android/provider/DocumentsContract.java
@@ -235,7 +235,6 @@
          * @see #FLAG_DIR_PREFERS_GRID
          * @see #FLAG_DIR_PREFERS_LAST_MODIFIED
          * @see #FLAG_VIRTUAL_DOCUMENT
-         * @see #FLAG_ARCHIVE
          * @see #FLAG_SUPPORTS_COPY
          * @see #FLAG_SUPPORTS_MOVE
          * @see #FLAG_SUPPORTS_REMOVE
@@ -326,7 +325,7 @@
          * Flag indicating that a document can be renamed.
          *
          * @see #COLUMN_FLAGS
-         * @see DocumentsContract#renameDocument(ContentProviderClient, Uri,
+         * @see DocumentsContract#renameDocument(ContentResolver, Uri,
          *      String)
          * @see DocumentsProvider#renameDocument(String, String)
          */
@@ -337,7 +336,7 @@
          * within the same document provider.
          *
          * @see #COLUMN_FLAGS
-         * @see DocumentsContract#copyDocument(ContentProviderClient, Uri, Uri)
+         * @see DocumentsContract#copyDocument(ContentResolver, Uri, Uri)
          * @see DocumentsProvider#copyDocument(String, String)
          */
         public static final int FLAG_SUPPORTS_COPY = 1 << 7;
@@ -347,7 +346,7 @@
          * within the same document provider.
          *
          * @see #COLUMN_FLAGS
-         * @see DocumentsContract#moveDocument(ContentProviderClient, Uri, Uri, Uri)
+         * @see DocumentsContract#moveDocument(ContentResolver, Uri, Uri, Uri)
          * @see DocumentsProvider#moveDocument(String, String, String)
          */
         public static final int FLAG_SUPPORTS_MOVE = 1 << 8;
@@ -368,7 +367,7 @@
          * Flag indicating that a document can be removed from a parent.
          *
          * @see #COLUMN_FLAGS
-         * @see DocumentsContract#removeDocument(ContentProviderClient, Uri, Uri)
+         * @see DocumentsContract#removeDocument(ContentResolver, Uri, Uri)
          * @see DocumentsProvider#removeDocument(String, String)
          */
         public static final int FLAG_SUPPORTS_REMOVE = 1 << 10;
@@ -875,7 +874,7 @@
      * Test if the given URI represents a {@link Document} tree.
      *
      * @see #buildTreeDocumentUri(String, String)
-     * @see #getTreeDocumentId(Uri, String)
+     * @see #getTreeDocumentId(Uri)
      */
     public static boolean isTreeUri(Uri uri) {
         final List<String> paths = uri.getPathSegments();
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 7d3fb64..73b5c63 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -5298,15 +5298,6 @@
                 "accessibility_display_daltonizer";
 
         /**
-         * Float list that specifies the color matrix to apply to
-         * the display. Valid values are defined in AccessibilityManager.
-         *
-         * @hide
-         */
-        public static final String ACCESSIBILITY_DISPLAY_COLOR_MATRIX =
-                "accessibility_display_color_matrix";
-
-        /**
          * Setting that specifies whether automatic click when the mouse pointer stops moving is
          * enabled.
          *
@@ -6343,7 +6334,6 @@
             USB_MASS_STORAGE_ENABLED,                           // moved to global
             ACCESSIBILITY_DISPLAY_INVERSION_ENABLED,
             ACCESSIBILITY_DISPLAY_DALTONIZER,
-            ACCESSIBILITY_DISPLAY_COLOR_MATRIX,
             ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
             ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
             ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE,
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 7d23978..397bd07 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -4217,25 +4217,25 @@
                     setAlpha(a.getFloat(attr, 1f));
                     break;
                 case com.android.internal.R.styleable.View_transformPivotX:
-                    setPivotX(a.getDimensionPixelOffset(attr, 0));
+                    setPivotX(a.getDimension(attr, 0));
                     break;
                 case com.android.internal.R.styleable.View_transformPivotY:
-                    setPivotY(a.getDimensionPixelOffset(attr, 0));
+                    setPivotY(a.getDimension(attr, 0));
                     break;
                 case com.android.internal.R.styleable.View_translationX:
-                    tx = a.getDimensionPixelOffset(attr, 0);
+                    tx = a.getDimension(attr, 0);
                     transformSet = true;
                     break;
                 case com.android.internal.R.styleable.View_translationY:
-                    ty = a.getDimensionPixelOffset(attr, 0);
+                    ty = a.getDimension(attr, 0);
                     transformSet = true;
                     break;
                 case com.android.internal.R.styleable.View_translationZ:
-                    tz = a.getDimensionPixelOffset(attr, 0);
+                    tz = a.getDimension(attr, 0);
                     transformSet = true;
                     break;
                 case com.android.internal.R.styleable.View_elevation:
-                    elevation = a.getDimensionPixelOffset(attr, 0);
+                    elevation = a.getDimension(attr, 0);
                     transformSet = true;
                     break;
                 case com.android.internal.R.styleable.View_rotation:
diff --git a/core/java/com/android/internal/util/NotificationColorUtil.java b/core/java/com/android/internal/util/NotificationColorUtil.java
index 48bcc09..77452ca 100644
--- a/core/java/com/android/internal/util/NotificationColorUtil.java
+++ b/core/java/com/android/internal/util/NotificationColorUtil.java
@@ -341,6 +341,20 @@
     }
 
     /**
+     * Lighten a color by a specified value
+     * @param baseColor the base color to lighten
+     * @param amount the amount to lighten the color from 0 to 100. This corresponds to the L
+     *               increase in the LAB color space.
+     * @return the lightened color
+     */
+    public static int lightenColor(int baseColor, int amount) {
+        final double[] result = ColorUtilsFromCompat.getTempDouble3Array();
+        ColorUtilsFromCompat.colorToLAB(baseColor, result);
+        result[0] = Math.min(100, result[0] + amount);
+        return ColorUtilsFromCompat.LABToColor(result[0], result[1], result[2]);
+    }
+
+    /**
      * Framework copy of functions needed from android.support.v4.graphics.ColorUtils.
      */
     private static class ColorUtilsFromCompat {
@@ -434,7 +448,7 @@
          * Convert RGB components to its CIE Lab representative components.
          *
          * <ul>
-         * <li>outLab[0] is L [0 ...1)</li>
+         * <li>outLab[0] is L [0 ...100)</li>
          * <li>outLab[1] is a [-128...127)</li>
          * <li>outLab[2] is b [-128...127)</li>
          * </ul>
@@ -516,7 +530,7 @@
          * 2° Standard Observer (1931).</p>
          *
          * <ul>
-         * <li>outLab[0] is L [0 ...1)</li>
+         * <li>outLab[0] is L [0 ...100)</li>
          * <li>outLab[1] is a [-128...127)</li>
          * <li>outLab[2] is b [-128...127)</li>
          * </ul>
@@ -634,7 +648,7 @@
                     : (XYZ_KAPPA * component + 16) / 116;
         }
 
-        private static double[] getTempDouble3Array() {
+        public static double[] getTempDouble3Array() {
             double[] result = TEMP_ARRAY.get();
             if (result == null) {
                 result = new double[3];
diff --git a/core/java/com/android/internal/widget/NotificationActionListLayout.java b/core/java/com/android/internal/widget/NotificationActionListLayout.java
index 9dd118c..073aac5 100644
--- a/core/java/com/android/internal/widget/NotificationActionListLayout.java
+++ b/core/java/com/android/internal/widget/NotificationActionListLayout.java
@@ -17,11 +17,13 @@
 package com.android.internal.widget;
 
 import android.content.Context;
+import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.util.Pair;
 import android.view.Gravity;
+import android.view.RemotableViewMethod;
 import android.view.View;
-import android.view.ViewGroup;
+import android.widget.LinearLayout;
 import android.widget.RemoteViews;
 import android.widget.TextView;
 
@@ -33,11 +35,14 @@
  * the remaining available width, and the last action consumes the remaining space.
  */
 @RemoteViews.RemoteView
-public class NotificationActionListLayout extends ViewGroup {
+public class NotificationActionListLayout extends LinearLayout {
 
     private int mTotalWidth = 0;
     private ArrayList<Pair<Integer, TextView>> mMeasureOrderTextViews = new ArrayList<>();
     private ArrayList<View> mMeasureOrderOther = new ArrayList<>();
+    private boolean mMeasureLinearly;
+    private int mDefaultPaddingEnd;
+    private Drawable mDefaultBackground;
 
     public NotificationActionListLayout(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -45,6 +50,10 @@
 
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        if (mMeasureLinearly) {
+            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+            return;
+        }
         final int N = getChildCount();
         int textViews = 0;
         int otherViews = 0;
@@ -186,6 +195,10 @@
 
     @Override
     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        if (mMeasureLinearly) {
+            super.onLayout(changed, left, top, right, bottom);
+            return;
+        }
         final boolean isLayoutRtl = isLayoutRtl();
         final int paddingTop = mPaddingTop;
 
@@ -241,26 +254,24 @@
     }
 
     @Override
-    public LayoutParams generateLayoutParams(AttributeSet attrs) {
-        return new MarginLayoutParams(getContext(), attrs);
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+        mDefaultPaddingEnd = getPaddingEnd();
+        mDefaultBackground = getBackground();
     }
 
-    @Override
-    protected LayoutParams generateDefaultLayoutParams() {
-        return new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
-    }
-
-    @Override
-    protected LayoutParams generateLayoutParams(LayoutParams p) {
-        if (p instanceof MarginLayoutParams) {
-            return new MarginLayoutParams((MarginLayoutParams)p);
-        }
-        return new MarginLayoutParams(p);
-    }
-
-    @Override
-    protected boolean checkLayoutParams(LayoutParams p) {
-        return p instanceof MarginLayoutParams;
+    /**
+     * Set whether the list is in a mode where some actions are emphasized. This will trigger an
+     * equal measuring where all actions are full height and change a few parameters like
+     * the padding.
+     */
+    @RemotableViewMethod
+    public void setEmphasizedMode(boolean emphasizedMode) {
+        mMeasureLinearly = emphasizedMode;
+        setPaddingRelative(getPaddingStart(), getPaddingTop(),
+                emphasizedMode ? 0 : mDefaultPaddingEnd, getPaddingBottom());
+        setBackground(emphasizedMode ? null : mDefaultBackground);
+        requestLayout();
     }
 
     public static final Comparator<Pair<Integer, TextView>> MEASURE_ORDER_COMPARATOR
diff --git a/core/res/res/drawable/notification_material_action_background_emphasized.xml b/core/res/res/drawable/notification_material_action_background_emphasized.xml
new file mode 100644
index 0000000..b7153ba
--- /dev/null
+++ b/core/res/res/drawable/notification_material_action_background_emphasized.xml
@@ -0,0 +1,24 @@
+<?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
+  -->
+
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+        android:color="@color/ripple_material_dark">
+    <item android:id="@id/mask">
+        <color android:color="@color/white" />
+    </item>
+</ripple>
+
diff --git a/core/res/res/layout/notification_material_action_emphasized.xml b/core/res/res/layout/notification_material_action_emphasized.xml
new file mode 100644
index 0000000..992e43e
--- /dev/null
+++ b/core/res/res/layout/notification_material_action_emphasized.xml
@@ -0,0 +1,34 @@
+<?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
+  -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/button_holder"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_weight="1"
+    android:background="#ff000000">
+    <Button
+        style="@android:style/Widget.Material.Light.Button.Borderless.Small"
+        android:id="@+id/action0"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center"
+        android:textColor="#ffffffff"
+        android:singleLine="true"
+        android:ellipsize="end"
+        android:background="@drawable/notification_material_action_background_emphasized"
+        />
+</FrameLayout>
diff --git a/core/res/res/values-watch/colors_material.xml b/core/res/res/values-watch/colors_material.xml
index 91eee7d..45eb981 100644
--- a/core/res/res/values-watch/colors_material.xml
+++ b/core/res/res/values-watch/colors_material.xml
@@ -20,5 +20,7 @@
     <color name="accent_material_dark">#ff5e97f6</color>
     <color name="accent_material_light">#ff4285f4</color>
 
+    <color name="primary_material_dark">#4D4D4D</color>
+
     <color name="button_material_dark">#ff999999</color>
 </resources>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 778b434..a0f1dc4 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -764,7 +764,7 @@
              1 - AUTO_MODE_CUSTOM
              2 - AUTO_MODE_TWILIGHT
     -->
-    <integer name="config_defaultNightDisplayAutoMode">1</integer>
+    <integer name="config_defaultNightDisplayAutoMode">0</integer>
 
     <!-- Default time when Night display is automatically activated.
          Represented as milliseconds from midnight (e.g. 79200000 == 10pm). -->
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 7144ef0..23bbed6 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -2796,6 +2796,9 @@
     <!-- [CHAR LIMIT=200] Body of notification that is shown when performing a system upgrade. -->
     <string name="android_upgrading_notification_body">Some apps may not work properly until the upgrade finishes</string>
 
+    <!-- [CHAR LIMIT=40] Toast that is shown when an app is still upgrading. -->
+    <string name="app_upgrading_toast"><xliff:g id="application">%1$s</xliff:g> is upgrading\u2026</string>
+
     <!-- [CHAR LIMIT=NONE] Message shown in upgrading dialog for each .apk that is optimized. -->
     <string name="android_upgrading_apk">Optimizing app
         <xliff:g id="number" example="123">%1$d</xliff:g> of
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index f0b2451..bd3d5cb 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2630,6 +2630,8 @@
   <!-- Used internally for assistant to launch activity transitions -->
   <java-symbol type="id" name="cross_task_transition" />
 
+  <java-symbol type="id" name="button_holder" />
+
   <java-symbol type="bool" name="config_useRoundIcon" />
 
   <!-- For System navigation keys -->
@@ -2638,6 +2640,8 @@
   <java-symbol type="layout" name="unsupported_display_size_dialog_content" />
   <java-symbol type="string" name="unsupported_display_size_message" />
 
+  <java-symbol type="layout" name="notification_material_action_emphasized" />
+
   <!-- Package name for the device provisioning package -->
   <java-symbol type="string" name="config_deviceProvisioningPackage" />
 
diff --git a/docs/html/_redirects.yaml b/docs/html/_redirects.yaml
index 48aca28..4a9cab6 100644
--- a/docs/html/_redirects.yaml
+++ b/docs/html/_redirects.yaml
@@ -361,6 +361,8 @@
   to: /about/dashboards/index.html
 - from: /resources/community-groups.html
   to: /support.html
+- from: /community/index.html
+  to: /support.html
 - from: /guide/tutorials/
   to: /resources/tutorials/
 - from: /resources/tutorials/views/hello-linearlayout.html
diff --git a/docs/html/community/index.html b/docs/html/community/index.html
deleted file mode 100644
index e3834ba..0000000
--- a/docs/html/community/index.html
+++ /dev/null
@@ -1,320 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="viewport" content="width=device-width" />
-
-<meta name="google-site-verification" content="sa-bIAI6GKvct3f61-WpRguHq-aNjtF7xJjMTSi79as" />
-<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
-<title>Android Developers Community</title>
-
-<!-- STYLESHEETS -->
-<link rel="stylesheet"
-href="//fonts.googleapis.com/css?family=Roboto:regular,medium,thin,italic,mediumitalic,bold" title="roboto">
-<link href="/assets/css/default.css" rel="stylesheet" type="text/css">
-
-<!-- JAVASCRIPT -->
-<script src="//www.google.com/jsapi" type="text/javascript"></script>
-<script src="/assets/js/android_3p-bundle.js" type="text/javascript"></script>
-<script type="text/javascript">
-  var toRoot = "/";
-  var devsite = false;
-</script>
-
-<script type="text/javascript">
-  var _gaq = _gaq || [];
-  _gaq.push(['_setAccount', 'UA-5831155-1']);
-  _gaq.push(['_trackPageview']);
-
-  (function() {
-    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
-    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
-    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
-  })();
-</script>
-
-<style>
-#header {
-  padding: 2.2em 0 0.2em 0;
-}
-#header-wrap h1 {
-  margin:0;
-  padding:0;
-  line-height:16px;
-}
-#body-content {
-  margin-top:20px;
-}
-#nav-x.wrap {
-  overflow:auto;
-}
-h2 {
-  border-bottom:1px solid #CCC;
-}
-</style>
-</head>
-
-
-
-
-
-
-<body>
-
-
-<!-- Header -->
-<div id="header">
-  <div class="wrap" id="header-wrap">
-    <div class="col-3 logo">
-      <a href="/index.html">
-        <img src="http://developer.android.com/assets/images/dac_logo.png" width="123" height="25" alt="Android Developers" />
-      </a>
-    </div>
-    <div class="col-8">
-      <h1>Community Outreach</h1>
-    </div>
-
-    <div class="menu-container">
-    <div class="moremenu">
-      <div id="more-btn"></div>
-    </div>
-    <div class="morehover" id="moremenu">
-      <div class="top"></div>
-      <div class="mid">
-        <div class="header">Links</div>
-        <ul style="margin-bottom:0">
-          <li><a href="https://www.youtube.com/user/androiddevelopers">Android Developers Live</a></li>
-          <li><a href="http://android-developers.blogspot.com/">Android Developers Blog</a></li>
-          <li><a href="http://developer.android.com/training/">Android Developer Training</a></li>
-          <li><a href="http://developer.android.com/samples/">Samples</a></li>
-        </ul>
-        <br class="clear-fix">
-    </div>
-      <div class="bottom"></div>
-    </div><!-- end morehover -->
-  </div><!-- end menu-container -->
-  </div><!-- end header-wrap -->
-</div>
-<!-- /Header -->
-
-<div id="nav-x" class="wrap">
-    <ul class="nav-x col-9 develop">
-  <li><a href="#News">News</a></li>
-  <li><a href="#Community">Community</a></li>
-  <li><a href="#Content">Content</a></li>
-  <li><a href="#Social">Social</a></li>
-  </ul>
-</div>
-
-
-<!-- MAIN CONTENT -->
-
-
-<div class="wrap" id="body-content">
-
-<img src="/images/community/aco1small.png" alt="" style="float:right;margin:20px 0 0 40px">
-
-<p style="clear:left">
-  Android is working with communities to 
-<ul>
-<li>Create a cooperative relationship between highly impactful communities and high performing developers</li>
-<li>Strengthen relationships between Android and coding communities so that developers have a motivation to interact with those communities</li>
-<li>Reward communities for attracting developers by providing them with resources and direct access to the Android team</li></ul>
-<p>Our IMPACT is measured by <strong>good apps</strong> and a <strong>thriving community</strong></p>
-
-<h2 id="News" style="clear:left">News</h2>
-<p>Our current theme is on the <b><em>Android 4.4 KitKat and Updated Developer Tools</em></b> release, with new ways to create beautiful apps, printing and storage frameworks, low-power sensors, new media capabilities and RenderScript in the NDK.</p>
-
-<div class="col-8" style="margin-left:0">
-<img src="/images/community/kk-hero2.jpg" alt="" height="277">
-</div>
-
-<div class="col-8" style="margin-right:0">
-<h3 style="margin-top:0"><a href="http://developer.android.com/about/versions/kitkat.html">Android 4.4 Platform Highlights</a></h3>
-<p>Android KitKat brings all of Android's most innovative, most beautiful, and most useful features to more devices everywhere.</p>
-
-<h3><a href="http://developer.android.com/about/versions/android-4.4.html">Android 4.4 APIs</a></h3>
-<p>Android 4.4 (KITKAT) is a new release for the Android platform that offers new features for users and app developers. This document provides an introduction to the most notable new APIs.</p>
-
-<h3><a href="https://play.google.com/store/devices/details?id=nexus_5_white_32gb">New Nexus 5</a></h3>
-<p>Nexus 5 helps you capture the everyday and the epic in fresh new ways. It's the slimmest and fastest Nexus phone ever made, powered by Android 4.4, KitKat.</p>
-</div>
-<p></p>
-
-<h2 id="Community" style="clear:left">Community Spotlight</h2>
-
-<div class="col-8" style="margin-left:0">
-<h3>Android Community Groups</h3>
-<h4>July 2013</h4>
-<p><a href="mailto:gtugam@gmail.com">GDG Armenia</a> held <a href="http://eca.hackathon.am/">ecaHack Yerevan</a>, an Android hackathon featuring &quot;Angry Designers vs Android Developers&quot;, where the designers had a look into developers apps and gave them some advices regarding to design. The hackathon was sponsored by Alcatel One Touch and each member of the winner team got one Alcatel One Touch Idol. Check out the <a href="https://plus.google.com/u/0/events/gallery/cgj9d39gphiephlq0e2899dv6j4?cfem=1">photos.</a></p>
-<h4>September 2013</h4>
-<p><a href="mailto:soham.mondal@gmail.com">GDG Blrdroid</a> held a <a href="http://www.meetup.com/blrdroid/events/140665852/">meetup</a> on performance optimisation.</p>
-<p><a href="mailto:baileye@gmail.com">GDG Dublin</a> held their meetup with a talk on AdMob for Android and iOS, entitled &ldquo;Admob for Android and iOS developers&rdquo;. </p>
-<p>GDG Mbale&rsquo;s <a href="mailto:nsubugahassan@gmail.com">Hassan Nsubuga</a> has been managing a university <a href="https://plus.google.com/103735976334615631393/posts/gQMWCGUhMBn">course session</a> since September. They are now through with the basics and have a firm foundation, so this month they will be doing a lot of advanced stuff including exploring the latest API enhancements with KitKat. </p>
-<p><a href="mailto:wojtek.kalicinski@gmail.com">GDG Warsaw</a> held an Android Barcamp focused on App Quality. The discussion was moderated by GDG organisers, but the talks were given by the community members, including some top Android companies and developers in Poland.</p>
-<h4>October 2013</h4>
-<p><a href="mailto:benjamin.r.m.weiss@gmail.com">GDG Berlin Android</a> held their <a href="https://berlin.ticketbud.com/devfest-berlin-2013">DevFest</a>.</p>
-<p><a href="mailto:soham.mondal@gmail.com">GDG Blrdroid</a> held their <a href="http://www.meetup.com/blrdroid/events/144457162/">meetup</a> in collaboration with GDG Bangalore, where they talked about a wider range of things from incorporating user feedback to effectively using the cell radio. David McLaughlin from the Developer Relations team also visited during the meetup and delivered the keynote. They also hit a milestone with its 4th anniversary on the 9th of October and crossed 4300 members in the past few days so its been a memorable couple of months for them.</p>
-<p><a href="mailto:hir3npatel@gmail.com">GDG Cape Town</a> held an <a href="https://plus.google.com/108309780217630451504/posts/9BTCEqnBHoQ">Android Workshop</a> where they gave away lots of branded KitKats.</p>
-<p><a href="mailto:baileye@gmail.com">GDG Dublin</a> held its DevFest, which featured a codeLab on Android titled &ldquo;Codelab: Intro to Android Development.&rdquo;</p>
-<p><a href="mailto:hugo@dutchaug.org">GDG Dutch Android User Group</a> held their <a href="http://www.devfest.nl/program">DevFest</a>. They had a bunch of Android sessions, mostly by local speakers. In addition to the Android sessions, they also ran a workshop on writing custom views.</p>
-<p><a href="mailto:hugo@dutchaug.org">Hugo Visser</a> from the Dutch Android User Group spoke at <a href="https://bitbucket.org/qbusict/cupboard">DroidCon UK barcamp</a>, where he delivered a talk on Cupboard, a simple and lightweight persistence framework, specifically for Android.</p> 
-<p><a href="mailto:prajyotmainkar@gmail.com">GDG GAUG</a> held the <a href="https://plus.google.com/110448195989468248957/posts/8doJuCpySWS">Google Devfest 2013</a>, where they had two tracks and more than 200 delegates attending. They also had a <a href="https://plus.google.com/110448195989468248957/posts/6rxLzj2Rpde">Hackathon</a> and they hit the <a href="https://plus.google.com/110448195989468248957">1000 member</a> mark this month, which makes them the second largest android community in India after GDG Blrdroid. </p>
-<p><a href="mailto:cyrilleguipie@gmail.com">GDG Miage</a> held their DevFest where they gave a talk about Intents and Services. The also held a startup Weekend Bootcamp where they talked about Activites and Layouts. They will also hold an Android Workshop in December.</p>
-<p><a href="mailto:gabriel.kb@gmail.com">GDG Uruguay</a> had their <a href="http://gdg.uy/devfest2013">DevFest</a>, where they held an Android workshop for beginners as an Android vs iOS comparison, a session on best practices using YouTube APIs in Android, and &nbsp;What's new in Google for developers (with a special section about Android). You can see pictures on <a href="https://plus.google.com/114520966453242230657/posts/dqZAuMqc12Z">the G+ page</a>. </p>
-
-<h4>November 2013</h4>
-<p><a href="mailto:yorogoule@gmail.com">Abidjandroid/GDG Côte d'Ivoire</a> held an Android Launch Party featuring the KitKat release.</p>
-<p>The <a href="mailto:hugo@dutchaug.org">Dutch Android User Group</a> had a very interactive presentation on Android Code Puzzlers and Tips &amp; tricks, where they rewarded participation by giving out books, tshirts, jelly beans and kitkats. The presentation was at the <a href="http://www.nljug.org/jfall">Dutch JFall conference</a>, organized by the NLJUG. It's a large yearly Java conference and the DAUG had the only Android session there.</p>
-<p>The <a href="mailto:benjamin.r.m.weiss@gmail.com">GDG Berlin Android</a> meetup this month  featured the KitKat release.</p>
-<p><a href="mailto:soham.mondal@gmail.com">The GDG Blrdroid</a> <a href="http://www.meetup.com/blrdroid/events/148210762/%20">meetup</a> was another focused on KitKat.</p>
-<p>At the <a href="mailto:amahdy7@gmail.com">GDG Cairo</a> <a href="https://plus.google.com/events/co59j0870in5a4kh8n5navifnm8">DevFest</a> there was a &quot;What's new in Android SDK&quot; session on day 1, and an Android workshop on day 2. Kitkat also provided interest in the sessions and the snacks bar. The KitKat <a href="http://buff.ly/HNE7yq">presentation</a>, the track organization, and everything related to it were all organized by women.</p>
-<p><a href="mailto:hir3npatel@gmail.com">GDG Cape Town</a> held an Android Workshop.</p>
-<p><a href="mailto:alessandro.gbridge@gmail.com">GDG Udine</a>  organized a talk after the release of KitKat for a school in Pordenone.</p>
-<p><a href="mailto:hugo@dutchaug.org">Hugo Visser</a> from Droidcon Netherlands  organized an Android hackathon themed &quot;Location, Location, Location&quot;. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
-<p><a href="mailto:eyal.lezmy@gmail.com">Paris Android User Group</a> welcomed <a href="https://plus.google.com/+RomainGuy">Romain Guy</a> and <a href="https://plus.google.com/+ChetHaase">Chet Haase</a> to their meetup this month. They&rsquo;ll be meeting up with other GDG leads and UG managers meet at <a href="https://plus.google.com/events/cupo201fjreo9g9t2e596gv8nd4">Devoxx</a> next Thursday.</p>
-<p><a href="mailto:wojtek.kalicinski@gmail.com">GDG Warsaw</a> had over 250 attendees at their DevFest, which featured session tracks on Android and Web and a whole day of Code Labs in Android, AngularJS and Arduino.</p>
-<h4>December 2013</h4>
-<p><a href="mailto:prajyotmainkar@gmail.com">GDG GAUG</a> are planning a codelab and hackathon.</p>
-<p><a href="mailto:psvensson@gmail.com">Peter Svensson</a> spoke at <a href="http://swdc.se/droidcon/events/stockholm-2013/">DroidCon Stockholm</a></p>
-The unstoppable <a href="mailto:bonbhel@gmail.com">Max Bonbhel</a> from the African GDG Android is hosting AAC 2014 and Android GDG Barcamp events in December. Also, in order to encourage African Java developers to move to the Android platform, he created the <a href="https://docs.google.com/spreadsheet/ccc?key=0AtFPan-z2ps-dHBtX1luY2pRQjdtRjliUGcxMVBNeVE&usp=sharing#gid=0">Africa Android Training (AAT) program</a>. The training material targets developers with different levels of experience in Java development. More than 60 developers have been taking part in the weekly sessions. The next 10 sessions will start Saturday, November 9, 2013. 260 GDG and Java User Group members have already registered from 12 Countries.
-<p>&nbsp;</p>
-</div>
-
-<div class="col-8" style="margin-right:0">
-<h3>Android Community Experts</h3>
-
-<h4>October 2013</h4>
-<p><a href="mailto:eyal.lezmy@gmail.com">Eyal Lezmy</a> presented two sessions. &ldquo;<a href="http://bit.ly/andbigfail">Play Store bashing, learn from the biggest fails</a>&rdquo; looked at several applications, mainly developed by huge companies, and analyzed why they failed to satisfy the users or the Android guidelines. &ldquo;<a href="http://bit.ly/lifeofapp">Android, the life of your app</a>&rdquo; tells a story, living the life of a user, identify the frustrations he can encounter and present ways to avoid it, as a developer.</p>
-<p><a href="mailto:mariux01@gmail.com">Mario Viviani</a> presented and recorded the next <a href="http://www.youtube.com/watch?v=jaT0bYhhaGY">Android App Clinic - Italia</a>. This episode was regarding the Cards UI and SMS app support in Android 4.4. They experimented with a short form of the video (10 minutes instead of 20) and in less than day it got almost 400+ views -- which is great considering it's in Italian! The previous episode reached 1300 views all-time and was the most successful video of GDL Italia in Q2.</p>
-<p><a href="mailto:m.kaeppler@gmail.com">Matthias Käppler</a> contributed the <a href="https://github.com/Netflix/RxJava/tree/master/rxjava-contrib/rxjava-android">first Android specific component</a> to the RxJava project, and spoke about <a href="http://uk.droidcon.com/2013/sessions/conquering-concurrency-bringing-the-reactive-extensions-to-the-android-platform/">RxJava and reactive programming on Android</a> at DroidCon UK. He has also open sourced <a href="https://github.com/mttkay/memento">Memento</a>, an Android annotation processor to replace the deprecated onRetainNonConfigurationInstance.</p>
-<p><a href="mailto:wojtek.kalicinski@gmail.com">Wojtek Kaliciński</a>&rsquo;s talk, &quot;Android - is it time for a break yet?&quot; highlights not only what's new in Android 4.4 KitKat, but also how to take your app to the next level by making sure you provide the best app experience possible to all 4.0+ users.</p>
-<a href="https://plus.sandbox.google.com/110448195989468248957/posts"><img src="/images/community/hackathon-gdgaug.jpg" alt=""  align="right"></a>
-
-</div>
-
-<h2 id="Content" style="clear:left">New Content</h2>
-<div class="col-8" style="margin-left:0">
-<p><h4>Android 4.4 What's New</h4>
-KitKat has been optimized to run on a much broader range of devices, with special focus on the millions of entry-level devices that have as little as 512MB RAM. To help, we've created new APIs, better tools, and better documentation to let you create apps that perform well on all devices.<br>
-Check out this video summary of some of the most significant developer features in the latest Android release, including  new ways to make your apps beautiful, NFC Host Card Emulation, a printing framework, the storage access framework, low-power step detector and step counter sensors, and more!<br>
-<h5><a href="http://www.youtube.com/watch?v=sONcojECWXs&list=PLWz5rJ2EKKc-2quE-o0enpILZF3nBZg_K">Video</a></h5>
-<h5><a href="https://drive.google.com/a/google.com/folderview?id=0BwhAiXVwzMoFc28wWEpyeE9qYTQ&usp=sharing">Presentation</a></h5>
-<i>Be sure to get the <a href="http://developer.android.com/about/versions/android-4.4.html">full Android 4.4 API Overview</a>, and take a look at our <a href="https://www.youtube.com/playlist?list=PLWz5rJ2EKKc-2quE-o0enpILZF3nBZg_K">related DevBytes videos</a></i></p>
-
-<p><h4>WebView in Android 4.4</h4>
-Android 4.4 (API level 19) introduces a new version of WebView that is based on Chromium. This change upgrades WebView performance and standards support for HTML5, CSS3, and JavaScript to match the latest web browsers. Any apps using WebView will inherit these upgrades when running on Android 4.4 and higher.
-<h5><a href="http://developer.android.com/guide/webapps/migrating.html">API Guide</a></h5>
-</p>
-
-<p><h4>Android 4.4 Immersive Mode</h4>
-With Android 4.4 KitKat, your apps can now truly go full-screen with a new Immersive Mode. Immersive Mode lets your apps hide the system's status and navigation bars while capturing all touch events—ideal for rich interactive content such as books and games. This video demonstrates how to use the new API, in addition to recapping earlier full-screen APIs on Android.
-<h5><a href="http://www.youtube.com/watch?v=cBi8fjv90E4&list=PLWz5rJ2EKKc-2quE-o0enpILZF3nBZg_K">Video</a></h5>
-<h5><a href="https://drive.google.com/a/google.com/folderview?id=0BwhAiXVwzMoFc28wWEpyeE9qYTQ&usp=sharing">Presentation</a></h5>
-<h5><a href="http://developer.android.com/samples/ImmersiveMode/index.html">Sample</a></h5>
-</p>
-
-<p>
-<h4>Android 4.4 Storage Access Framework - Provider</h4>
-Get up to speed on the new document storage API in Android 4.4 KitKat. This video gets you up and running with your own DocumentProvider by stepping you through the making of a simple cloud storage app.
-<h5><a href="http://www.youtube.com/watch?v=zxHVeXbK1P4&list=PLWz5rJ2EKKc-2quE-o0enpILZF3nBZg_K">Video</a></h5>
-<h5><a href="https://drive.google.com/a/google.com/folderview?id=0BwhAiXVwzMoFc28wWEpyeE9qYTQ&usp=sharing">Presentation</a></h5>
-<h5><a href="http://developer.android.com/guide/topics/providers/document-provider.html">Training</a></h5>
-<h5><a href="http://developer.android.com/samples/StorageProvider/index.html">Sample</a>, <a href="https://play.google.com/store/apps/details?id=com.box.android">Box Application</a></h5>
-</blockquote>
-
-</p>
-
-
-<p><h4>Android 4.4 Storage Access Framework - Client</h4>
-Get up to speed on the new storage access framework in Android 4.4 KitKat. This video teaches you how to quickly create, edit, save and delete documents provided by other apps as a client of the storage access framework.
-<h5><a href="http://www.youtube.com/watch?v=UFj9AEz0DHQ&list=PLWz5rJ2EKKc-2quE-o0enpILZF3nBZg_K">Video</a></h5>
-<h5><a href="https://drive.google.com/a/google.com/folderview?id=0BwhAiXVwzMoFc28wWEpyeE9qYTQ&usp=sharing">Presentation</a></h5>
-<h5><a href="http://developer.android.com/samples/StorageClient/index.html">Sample</a></h5>
-</p>
-
-<p><h4>Android 4.4 Closed Captioning</h4>
-Displaying closed captions in your app's videos can be quick and simple in Android 4.4 KitKat,. Learn how to attach timed text tracks to VideoView and allow users to customize how captions are displayed.
-<h5><a href="http://www.youtube.com/watch?v=hCRGc2PcmB8&list=PLWz5rJ2EKKc-2quE-o0enpILZF3nBZg_K">Video</a></h5>
-<h5><a href="https://drive.google.com/a/google.com/folderview?id=0BwhAiXVwzMoFc28wWEpyeE9qYTQ&usp=sharing">Presentation</a>
-</p>
-</h5>
-</div>
-
-<div class="col-8" style="margin-right:0">
-
-<p>
-<h4>Android 4.4 Transitions</h4>
-In this episode, we introduce the new Transitions API in Android 4.4 Kitkat. This API provides a simple way for developers to provide animated segues to different scenes of their application, helping users to understand the application flow with very little code. The general approach is to tell the system that you'd like to run a transition animation, then make the necessary changes to your UI. The system figures out the differences and animates the changes.
-<h5><a href="http://www.youtube.com/watch?v=S3H7nJ4QaD8&list=PLWz5rJ2EKKc-2quE-o0enpILZF3nBZg_K&index=3">Video</a></h5>
-<h5><a href="https://drive.google.com/a/google.com/folderview?id=0BwhAiXVwzMoFc28wWEpyeE9qYTQ&usp=sharing">Presentation</a></p>
-</h5>
-<p><h4>Android 4.4: SMS APIs</h4>
-Android 4.4 KitKat introduces the new SMS APIs as well as the new concept of a default SMS app. This video discusses these new APIs and how your app should use them to send and receive SMS and MMS messages.<br>
-<h5><a href="http://www.youtube.com/watch?v=mdq0R2WQssQ&list=PLWz5rJ2EKKc-2quE-o0enpILZF3nBZg_K">Video</a></h5>
-<h5><a href="https://drive.google.com/a/google.com/folderview?id=0BwhAiXVwzMoFc28wWEpyeE9qYTQ&usp=sharing">Presentation</a></h5>
-<i>See also -<br>
-<a href="http://goo.gl/sw5NdH">Android Developer Blog post on Android 4.4 KitKat SMS APIs</a><br>
-<a href="http://goo.gl/7vTx3s">Android Protip on using booleans in your AndroidManifest.xml</a></i></p>
-
-
-<p><h4>Android 4.4 Printing API</h4>
-In this video, we introduce the new Printing API in Android 4.4 KitKat. This API provides a simple way for developers to print to cloud-connected printers using Google Cloud Print. It's really easy to print bitmaps, and HTML (that you generate on the device, or just web content).<br>
-<h5><a href="http://www.youtube.com/watch?v=Iub67ic87KI&list=PLWz5rJ2EKKc-2quE-o0enpILZF3nBZg_K">Video</a></h5>
-<h5><a href="https://drive.google.com/a/google.com/folderview?id=0BwhAiXVwzMoFc28wWEpyeE9qYTQ&usp=sharing">Presentation</a></h5>
-<h5><a href="http://developer.android.com/training/printing/index.html">Training</a></h5>
-<i>Some pro-tips:</i>
-<ul>
-  <li>For Webview/HTML printing, printing from javascript is not supported yet (window.print() for example). Also we are planning to address the limitations around WebView/HTML printing in future releases (eg: headers/footers, and specifying print ranges).</li>
-<li>We encourage developers to open Android Open Source bugs for features that they feel important as a feedback.</li>
-</ul>
-
-<p><h4>App Indexing</h4>
-In this episode we discuss the new App Indexing feature that we recently announced for Google Search for Android.<br>
-Currently, when you do a google search on the web, you get results that are links to websites. With App Indexing, you will be able to point Google Search users on Android directly to content within your app!
-If you’re an Android app developer who has a web presence and you want more control over how your content is accessed from search, via your website or Android app, App Indexing is a great feature for you to explore.
-Also, enabling your website and app for indexing is a way to increase engagement with your app by making the content more discoverable, and more accessible to users directly from the search results page.
-For information on App Indexing, please visit <a href="http://g.co/appindexing">http://g.co/appindexing</a>
-<h5><a href="http://www.youtube.com/watch?v=Xh_W82JgOms&list=PLWz5rJ2EKKc-2quE-o0enpILZF3nBZg_K">Video</a></h5>
-<h5><a href="https://drive.google.com/a/google.com/folderview?id=0BwhAiXVwzMoFc28wWEpyeE9qYTQ&usp=sharing">Presentation</a>
-</p>
-</h5>
-</div>
-
-<h2 id="Social" style="clear:left">Social</h2>
-<div class="col-8" style="margin-left:0">
-
-<h3 >G+</h3>
-
-<ul>
-<li><a href="https://plus.google.com/u/1/108967384991768947849/posts/1iVvwyfTM8y">What's New in Android 4.4</a>
-  <ul>
-    <li><a href="http://www.youtube.com/watch?v=HrFRY32i_sE">What's New in Android 4.4 [JAPANESE!]</a></li>
-    <li><a href="https://www.youtube.com/watch?v=U9jAcwaETD4">What's New in Android 4.4 [KOREAN!]</a></li>
-    <li><a href="https://plus.google.com/u/1/108967384991768947849/posts/WfqdvDG2Cyr">Quer saber das novidades do Android 4.4? [PORTUGUESE!]</a></li>
-  </ul>
-</li>
-<li><a href="https://plus.google.com/u/1/+AndroidDevelopers/posts/femjRbay18f">Android 4.4 and Updated Developer Tools 
-</a></li>
-<li><a href="https://plus.google.com/u/1/108967384991768947849/posts/P2q82aYN7do">Google Play Services 4.0 
-</a></li>
-</ul>
-</div>
-
-<div class="col-8" style="margin-right:0">
-<h3>Blog</h3>
-
-<ul>
-  <li><a href="http://android-developers.blogspot.hk/2013/10/android-44-kitkat-and-updated-developer.html">Android 4.4 KitKat and Updated Developer Tools</a></li>
-  <li><a href="http://android-developers.blogspot.hk/2013/10/google-play-services-40.html">Google Play Services 4.0</a></li>
-  <li><a href="http://android-developers.blogspot.hk/2013/10/making-your-app-content-more-accessible.html">Making your App Content more Accessible from Googl...</a></li>
-  <li><a href="http://android-developers.blogspot.hk/2013/10/getting-your-sms-apps-ready-for-kitkat.html">Getting Your SMS Apps Ready for KitKat</a></li>
-</ul>
-</div>
-
-</div><!-- /MAIN CONTENT 'wrap' -->
-</body>
-</html>
-
-
-
diff --git a/docs/html/preview/setup-sdk.jd b/docs/html/preview/setup-sdk.jd
index 3e95f3e..ff11e8e 100644
--- a/docs/html/preview/setup-sdk.jd
+++ b/docs/html/preview/setup-sdk.jd
@@ -77,32 +77,10 @@
 <h3 id="docs-dl">Get the N Preview reference documentation</h3>
 
 <p>Beginning with the Preview 4 release, the API reference for the
-N platform (API level 24) is now available online at <a href=
-  "{@docRoot}reference/">developer.android.com/reference/</a>.
-</p>
-
-<p>If you'd like an offline copy of the API reference, you can download it
-from the following table. The download also includes an incremental diff report
-for API changes between the Preview 3 and Preview 4 release, which is not
-available online.</p>
-
-<table>
-  <tr>
-    <th scope="col">Documentation</th>
-    <th scope="col">Checksums</th>
-  </tr>
-  <tr>
-    <td style="white-space: nowrap">
-    <a href="{@docRoot}shareables/preview/n-preview-4-docs.zip"
-      >n-preview-4-docs.zip</a></td>
-    <td width="100%">
-      MD5: f853e3ba0707083336dfa780b8fed9a7<br>
-      SHA-1: 36fcbc497cc2e63b1bc1d629c304b0ba43a88946
-    </td>
-  </tr>
-</table>
-
-
+  N platform (API level 24) is now available online at <a href=
+  "{@docRoot}reference/">developer.android.com/reference/</a>. There is also
+  an incremental diff report for <a href="{@docRoot}sdk/api_diff/24/changes.html"
+  >API changes between API levels 23 and 24</a>.</p>
 
 <h2 id="java8">Get the Java 8 JDK</h2>
 
diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp
index d0ae1d4..93b2e15 100644
--- a/libs/hwui/Properties.cpp
+++ b/libs/hwui/Properties.cpp
@@ -214,8 +214,8 @@
     property_get(PROPERTY_DEFAULT_RENDERER, prop, "opengl");
     if (!strcmp(prop, "skiagl") ) {
         sRenderPipelineType = RenderPipelineType::SkiaGL;
-    } else if (!strcmp(prop, "vulkan") ) {
-        sRenderPipelineType = RenderPipelineType::Vulkan;
+    } else if (!strcmp(prop, "skiavulkan") ) {
+        sRenderPipelineType = RenderPipelineType::SkiaVulkan;
     } else { //"opengl"
         sRenderPipelineType = RenderPipelineType::OpenGL;
     }
diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h
index 5d892fd..133ae80 100644
--- a/libs/hwui/Properties.h
+++ b/libs/hwui/Properties.h
@@ -253,7 +253,7 @@
 enum class RenderPipelineType {
     OpenGL = 0,
     SkiaGL,
-    Vulkan,
+    SkiaVulkan,
     NotInitialized = 128
 };
 
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 0028aec..2eccca9 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -75,7 +75,7 @@
             //TODO: implement SKIA GL
             LOG_ALWAYS_FATAL("skiaGL canvas type not implemented.");
             break;
-        case RenderPipelineType::Vulkan:
+        case RenderPipelineType::SkiaVulkan:
             //TODO: implement Vulkan
             LOG_ALWAYS_FATAL("Vulkan canvas type not implemented.");
             break;
@@ -607,11 +607,6 @@
     return mFrameNumber;
 }
 
-bool CanvasContext::isSkiaEnabled() {
-    auto renderType = Properties::getRenderPipelineType();
-    return RenderPipelineType::SkiaGL == renderType || RenderPipelineType::Vulkan == renderType;
-}
-
 SkRect CanvasContext::computeDirtyRect(const Frame& frame, SkRect* dirty) {
     if (frame.width() != mLastFrameWidth || frame.height() != mLastFrameHeight) {
         // can't rely on prior content of window if viewport size changes
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index de4cc48..42e9be3 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -99,7 +99,6 @@
     static void trimMemory(RenderThread& thread, int level);
 
     static void invokeFunctor(RenderThread& thread, Functor* functor);
-    static bool isSkiaEnabled();
 
     Layer* createTextureLayer();
 
diff --git a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java
index 1622f64..d8d8d3e 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java
@@ -60,6 +60,8 @@
 import com.android.documentsui.model.DocumentInfo;
 import com.android.documentsui.model.DocumentStack;
 import com.android.documentsui.model.RootInfo;
+import com.android.documentsui.services.FileOperationService;
+import com.android.documentsui.services.FileOperations;
 
 import java.io.FileNotFoundException;
 import java.util.ArrayList;
@@ -71,6 +73,32 @@
 public abstract class BaseActivity extends Activity
         implements SearchManagerListener, NavigationViewManager.Environment {
 
+    public final FileOperations.Callback fileOpCallback = (status, opType, docCount) -> {
+        if (status == FileOperations.Callback.STATUS_REJECTED) {
+            Snackbars.showPasteFailed(this);
+            return;
+        }
+
+        if (docCount == 0) {
+            // Nothing has been pasted, so there is no need to show a snackbar.
+            return;
+        }
+
+        switch (opType) {
+            case FileOperationService.OPERATION_MOVE:
+                Snackbars.showMove(this, docCount);
+                break;
+            case FileOperationService.OPERATION_COPY:
+                Snackbars.showCopy(this, docCount);
+                break;
+            case FileOperationService.OPERATION_DELETE:
+                // We don't show anything for deletion.
+                break;
+            default:
+                throw new UnsupportedOperationException("Unsupported Operation: " + opType);
+        }
+    };
+
     private static final String BENCHMARK_TESTING_PACKAGE = "com.android.documentsui.appperftests";
 
     State mState;
@@ -706,17 +734,6 @@
         mNavDrawerHasFocus = !mNavDrawerHasFocus;
     }
 
-    DocumentInfo getRootDocumentBlocking(RootInfo root) {
-        try {
-            final Uri uri = DocumentsContract.buildDocumentUri(
-                    root.authority, root.documentId);
-            return DocumentInfo.fromUri(getContentResolver(), uri);
-        } catch (FileNotFoundException e) {
-            Log.w(mTag, "Failed to find root", e);
-            return null;
-        }
-    }
-
     /**
      * Pops the top entry off the directory stack, and returns the user to the previous directory.
      * If the directory stack only contains one item, this method does nothing.
@@ -780,7 +797,7 @@
 
         @Override
         protected DocumentInfo run(Void... params) {
-            return mOwner.getRootDocumentBlocking(mRoot);
+            return mRoot.getRootDocumentBlocking(mOwner);
         }
 
         @Override
@@ -816,7 +833,7 @@
             final RootInfo defaultRoot = mOwner.mRoots.getDefaultRootBlocking(mOwner.mState);
             assert(defaultRoot != null);
             if (!defaultRoot.isRecents()) {
-                mDefaultRootDocument = mOwner.getRootDocumentBlocking(defaultRoot);
+                mDefaultRootDocument = defaultRoot.getRootDocumentBlocking(mOwner);
             }
             return defaultRoot;
         }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/CheckedTask.java b/packages/DocumentsUI/src/com/android/documentsui/CheckedTask.java
index ecd57cc..747eb9c 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/CheckedTask.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/CheckedTask.java
@@ -73,6 +73,7 @@
         finish(result);
     }
 
+    @FunctionalInterface
     interface Check {
         boolean stop();
     }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java
index 41f5d24..54f3e61 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java
@@ -519,7 +519,7 @@
             } catch (FileNotFoundException e) {
                 Log.e(TAG, "Failed to resolve DocumentInfo from Uri: " + uri);
             }
-            mState.stack.add(mOwner.getRootDocumentBlocking(root));
+            mState.stack.add(root.getRootDocumentBlocking(mOwner));
             return null;
         }
 
diff --git a/packages/DocumentsUI/src/com/android/documentsui/ItemDragListener.java b/packages/DocumentsUI/src/com/android/documentsui/ItemDragListener.java
index 66b94fc..152d3a0 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/ItemDragListener.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/ItemDragListener.java
@@ -22,7 +22,6 @@
 import android.view.DragEvent;
 import android.view.View;
 import android.view.View.OnDragListener;
-import android.view.ViewConfiguration;
 
 import com.android.documentsui.ItemDragListener.DragHost;
 import com.android.internal.annotations.VisibleForTesting;
@@ -39,7 +38,7 @@
     private static final String TAG = "ItemDragListener";
 
     @VisibleForTesting
-    static final int SPRING_TIMEOUT = ViewConfiguration.getLongPressTimeout();
+    static final int SPRING_TIMEOUT = 1000;
 
     protected final H mDragHost;
     private final Timer mHoverTimer;
@@ -82,7 +81,7 @@
         TimerTask task = createOpenTask(v);
         assert (task != null);
         v.setTag(R.id.drag_hovering_tag, task);
-        mHoverTimer.schedule(task, ViewConfiguration.getLongPressTimeout());
+        mHoverTimer.schedule(task, SPRING_TIMEOUT);
     }
 
     private void handleLocationEvent(View v, float x, float y) {
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
index ac33288..f381bb2 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
@@ -24,6 +24,7 @@
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
 import android.app.LoaderManager.LoaderCallbacks;
+import android.content.ClipData;
 import android.content.Context;
 import android.content.Intent;
 import android.content.Loader;
@@ -33,16 +34,14 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Looper;
-import android.provider.DocumentsContract.Root;
-import android.provider.DocumentsContract;
 import android.provider.Settings;
 import android.support.annotation.Nullable;
 import android.text.TextUtils;
 import android.text.format.Formatter;
 import android.util.Log;
 import android.view.ContextMenu;
+import android.view.DragEvent;
 import android.view.LayoutInflater;
-import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.MotionEvent;
@@ -60,7 +59,11 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
+import com.android.documentsui.CheckedTask.Check;
+import com.android.documentsui.clipping.DocumentClipper;
+import com.android.documentsui.model.DocumentInfo;
 import com.android.documentsui.model.RootInfo;
+import com.android.documentsui.services.FileOperations;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -81,6 +84,20 @@
     private static final String TAG = "RootsFragment";
     private static final String EXTRA_INCLUDE_APPS = "includeApps";
 
+    private final OnDragListener mDragListener = new ItemDragListener<RootsFragment>(this) {
+        @Override
+        public boolean handleDropEventChecked(View v, DragEvent event) {
+            final int position = (Integer) v.getTag(R.id.item_position_tag);
+            final Item item = mAdapter.getItem(position);
+
+            assert(item.isDropTarget());
+
+            BaseActivity activity = getBaseActivity();
+            return item.dropOn(event.getClipData(), activity, RootsFragment.this::isDetached,
+                    activity.fileOpCallback);
+        }
+    };
+
     private ListView mList;
     private RootsAdapter mAdapter;
     private LoaderCallbacks<Collection<RootInfo>> mCallbacks;
@@ -165,8 +182,8 @@
 
                 Intent handlerAppIntent = getArguments().getParcelable(EXTRA_INCLUDE_APPS);
 
-                mAdapter = new RootsAdapter(context, result, handlerAppIntent, state,
-                        new ItemDragListener<>(RootsFragment.this));
+                mAdapter =
+                        new RootsAdapter(context, result, handlerAppIntent, state, mDragListener);
                 mList.setAdapter(mAdapter);
 
                 onCurrentRootChanged();
@@ -247,12 +264,12 @@
      * In RootsFragment we open the hovered root.
      */
     @Override
-    public void onViewHovered(View view) {
+    public void onViewHovered(View v) {
         // SpacerView doesn't have DragListener so this view is guaranteed to be a RootItemView.
-        RootItemView itemView = (RootItemView) view;
+        RootItemView itemView = (RootItemView) v;
         itemView.drawRipple();
 
-        final int position = (Integer) view.getTag(R.id.item_position_tag);
+        final int position = (Integer) v.getTag(R.id.item_position_tag);
         final Item item = mAdapter.getItem(position);
         item.open(this);
     }
@@ -374,6 +391,11 @@
         abstract boolean isDropTarget();
 
         abstract void open(RootsFragment fragment);
+
+        boolean dropOn(ClipData data, Context context, Check check,
+                FileOperations.Callback callback) {
+            return false;
+        }
     }
 
     private static class RootItem extends Item {
@@ -440,6 +462,14 @@
             Metrics.logRootVisited(fragment.getActivity(), root);
             activity.onRootPicked(root);
         }
+
+        @Override
+        boolean dropOn(
+                ClipData data, Context context, Check check, FileOperations.Callback callback) {
+            ProviderExecutor executor = ProviderExecutor.forAuthority(root.authority);
+            new DropOnRootTask(data, root, context, check, callback).executeOnExecutor(executor);
+            return true;
+        }
     }
 
     private static class SpacerItem extends Item {
@@ -518,6 +548,38 @@
         }
     }
 
+    private static class DropOnRootTask extends CheckedTask<Void, DocumentInfo> {
+        private ClipData mData;
+        private RootInfo mDstRoot;
+        private Context mContext;
+        private FileOperations.Callback mCallback;
+
+        private DropOnRootTask(ClipData data, RootInfo dstRoot, Context context, Check check,
+                FileOperations.Callback callback) {
+            super(check);
+            mData = data;
+            mDstRoot = dstRoot;
+            mContext = context;
+            mCallback = callback;
+        }
+
+        @Override
+        public DocumentInfo run(Void... args) {
+            return mDstRoot.getRootDocumentBlocking(mContext);
+        }
+
+        @Override
+        public void finish(DocumentInfo doc) {
+            if (doc != null) {
+                DocumentClipper clipper =
+                        DocumentsApplication.getDocumentClipper(mContext);
+                clipper.copyFromClipData(mDstRoot, doc, mData, mCallback);
+            } else {
+                Log.e(TAG, "Failed to get doc.");
+            }
+        }
+    }
+
     private static class RootsAdapter extends ArrayAdapter<Item> {
         private static final Map<String, Long> sIdMap = new HashMap<String, Long>();
         // the next available id to associate with a new string id
diff --git a/packages/DocumentsUI/src/com/android/documentsui/Shared.java b/packages/DocumentsUI/src/com/android/documentsui/Shared.java
index c1db87d..0cd568a 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/Shared.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/Shared.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Configuration;
+import android.net.Uri;
 import android.os.Looper;
 import android.provider.DocumentsContract;
 import android.text.TextUtils;
@@ -29,6 +30,10 @@
 import android.util.Log;
 import android.view.WindowManager;
 
+import com.android.documentsui.model.DocumentInfo;
+import com.android.documentsui.model.RootInfo;
+
+import java.io.FileNotFoundException;
 import java.text.Collator;
 import java.util.ArrayList;
 import java.util.List;
diff --git a/packages/DocumentsUI/src/com/android/documentsui/clipping/DocumentClipper.java b/packages/DocumentsUI/src/com/android/documentsui/clipping/DocumentClipper.java
index 0b6355a..bdc1836 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/clipping/DocumentClipper.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/clipping/DocumentClipper.java
@@ -31,6 +31,7 @@
 import com.android.documentsui.dirlist.MultiSelectManager.Selection;
 import com.android.documentsui.model.DocumentInfo;
 import com.android.documentsui.model.DocumentStack;
+import com.android.documentsui.model.RootInfo;
 import com.android.documentsui.services.FileOperation;
 import com.android.documentsui.services.FileOperationService;
 import com.android.documentsui.services.FileOperationService.OpType;
@@ -233,16 +234,42 @@
     }
 
     /**
-     * Copies documents from given clip data.
+     * Copied documents from given clip data to a root directory.
+     * @param root the root which root directory to copy to
+     * @param destination the root directory
+     * @param clipData the clipData to copy from
+     * @param callback callback to notify when operation finishes
+     */
+    public void copyFromClipData(
+            final RootInfo root,
+            final DocumentInfo destination,
+            final @Nullable ClipData clipData,
+            final FileOperations.Callback callback) {
+        DocumentStack dstStack = new DocumentStack(root, destination);
+        copyFromClipData(dstStack, clipData, callback);
+    }
+
+    /**
+     * Copies documents from given clip data to a folder.
      *
-     * @param destination destination document
-     * @param docStack the document stack to the destination folder
-     * @param clipData the clipData to copy from, or null to copy from clipboard
+     * @param destination destination folder
+     * @param docStack the document stack to the destination folder (not including the destination
+     *                 folder)
+     * @param clipData the clipData to copy from
      * @param callback callback to notify when operation finishes
      */
     public void copyFromClipData(
             final DocumentInfo destination,
-            DocumentStack docStack,
+            final DocumentStack docStack,
+            final @Nullable ClipData clipData,
+            final FileOperations.Callback callback) {
+
+        DocumentStack dstStack = new DocumentStack(docStack, destination);
+        copyFromClipData(dstStack, clipData, callback);
+    }
+
+    private void copyFromClipData(
+            final DocumentStack dstStack,
             final @Nullable ClipData clipData,
             final FileOperations.Callback callback) {
 
@@ -254,21 +281,19 @@
         PersistableBundle bundle = clipData.getDescription().getExtras();
         @OpType int opType = getOpType(bundle);
         try {
-            UrisSupplier uris = UrisSupplier.create(clipData, mContext);
-            if (!canCopy(destination)) {
+            if (!canCopy(dstStack.peek())) {
                 callback.onOperationResult(
-                        FileOperations.Callback.STATUS_REJECTED, opType, 0);
+                        FileOperations.Callback.STATUS_REJECTED, getOpType(clipData), 0);
                 return;
             }
 
+            UrisSupplier uris = UrisSupplier.create(clipData, mContext);
             if (uris.getItemCount() == 0) {
                 callback.onOperationResult(
                         FileOperations.Callback.STATUS_ACCEPTED, opType, 0);
                 return;
             }
 
-            DocumentStack dstStack = new DocumentStack(docStack, destination);
-
             String srcParentString = bundle.getString(SRC_PARENT_KEY);
             Uri srcParent = srcParentString == null ? null : Uri.parse(srcParentString);
 
diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java
index 32e16f2..9c57e17 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java
@@ -184,35 +184,6 @@
     private DirectoryDragListener mOnDragListener;
     private MenuManager mMenuManager;
 
-    /**
-     * A callback to show snackbar at the beginning of moving and copying.
-     */
-    private final FileOperations.Callback mFileOpCallback = (status, opType, docCount) -> {
-        if (status == FileOperations.Callback.STATUS_REJECTED) {
-            Snackbars.showPasteFailed(getActivity());
-            return;
-        }
-
-        if (docCount == 0) {
-            // Nothing has been pasted, so there is no need to show a snackbar.
-            return;
-        }
-
-        switch (opType) {
-            case FileOperationService.OPERATION_MOVE:
-                Snackbars.showMove(getActivity(), docCount);
-                break;
-            case FileOperationService.OPERATION_COPY:
-                Snackbars.showCopy(getActivity(), docCount);
-                break;
-            case FileOperationService.OPERATION_DELETE:
-                // We don't show anything for deletion.
-                break;
-            default:
-                throw new UnsupportedOperationException("Unsupported Operation: " + opType);
-        }
-    };
-
     @Override
     public View onCreateView(
             LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@@ -423,7 +394,8 @@
 
         operation.setDestination(data.getParcelableExtra(Shared.EXTRA_STACK));
 
-        FileOperations.start(getContext(), operation, mFileOpCallback);
+        BaseActivity activity = getBaseActivity();
+        FileOperations.start(activity, operation, activity.fileOpCallback);
     }
 
     protected boolean onRightClick(InputEvent e) {
@@ -1021,7 +993,8 @@
                                         .withSrcParent(srcParent.derivedUri)
                                         .build();
 
-                                FileOperations.start(getActivity(), operation, mFileOpCallback);
+                                BaseActivity activity = getBaseActivity();
+                                FileOperations.start(activity, operation, activity.fileOpCallback);
                             }
                         })
                     .setNegativeButton(android.R.string.cancel, null)
@@ -1234,7 +1207,8 @@
 
         BaseActivity activity = (BaseActivity) getActivity();
         DocumentInfo destination = activity.getCurrentDirectory();
-        mClipper.copyFromClipboard(destination, activity.getDisplayState().stack, mFileOpCallback);
+        mClipper.copyFromClipboard(
+                destination, activity.getDisplayState().stack, activity.fileOpCallback);
         getActivity().invalidateOptionsMenu();
     }
 
@@ -1347,7 +1321,7 @@
                 src == null ? Metrics.USER_ACTION_DRAG_N_DROP_MULTI_WINDOW
                         : Metrics.USER_ACTION_DRAG_N_DROP);
 
-        mClipper.copyFromClipData(dst, getDisplayState().stack, clipData, mFileOpCallback);
+        mClipper.copyFromClipData(dst, getDisplayState().stack, clipData, activity.fileOpCallback);
         return true;
     }
 
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java
index c4f4dc1..ae7e820 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java
@@ -42,11 +42,20 @@
     public DocumentStack() {};
 
     /**
+     * Creates an instance, and pushes all docs to it in the same order as they're passed as
+     * parameters, i.e. the last document will be at the top of the stack.
+     */
+    public DocumentStack(RootInfo root, DocumentInfo... docs) {
+        for (DocumentInfo doc : docs) {
+            push(doc);
+        }
+
+        this.root = root;
+    }
+
+    /**
      * Makes a new copy, and pushes all docs to the new copy in the same order as they're passed
      * as parameters, i.e. the last document will be at the top of the stack.
-     *
-     * @param src
-     * @param docs
      */
     public DocumentStack(DocumentStack src, DocumentInfo... docs) {
         super(src);
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java
index 92eea5e..e062dfb 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java
@@ -23,6 +23,7 @@
 import static com.android.documentsui.model.DocumentInfo.getCursorString;
 
 import android.annotation.IntDef;
+import android.annotation.Nullable;
 import android.content.Context;
 import android.database.Cursor;
 import android.graphics.drawable.Drawable;
@@ -39,6 +40,7 @@
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -346,6 +348,19 @@
         return IconUtils.applyTintColor(context, R.drawable.ic_eject, R.color.item_eject_icon);
     }
 
+    /**
+     * Gets the {@link DocumentInfo} of the root folder of this root.
+     */
+    public @Nullable DocumentInfo getRootDocumentBlocking(Context context) {
+        try {
+            final Uri uri = DocumentsContract.buildDocumentUri(authority, documentId);
+            return DocumentInfo.fromUri(context.getContentResolver(), uri);
+        } catch (FileNotFoundException e) {
+            Log.w(TAG, "Failed to find root", e);
+            return null;
+        }
+    }
+
     @Override
     public boolean equals(Object o) {
         if (o == null) {
diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java b/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java
index 5b9b169..6e1385a 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java
@@ -94,6 +94,7 @@
                     // but the content has changed.
                     if (mNextCommand == null) {
                         if (mUpdateSpec.pages != null && (mDocumentInfo.changed
+                                || mDocumentInfo.writtenPages == null
                                 || (mDocumentInfo.info.getPageCount()
                                         != PrintDocumentInfo.PAGE_COUNT_UNKNOWN
                                 && !PageRangeUtils.contains(mDocumentInfo.writtenPages,
diff --git a/packages/SettingsLib/res/values-af/arrays.xml b/packages/SettingsLib/res/values-af/arrays.xml
index 96cae5c..13c22c4 100644
--- a/packages/SettingsLib/res/values-af/arrays.xml
+++ b/packages/SettingsLib/res/values-af/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M per logbuffer"</item>
     <item msgid="5431354956856655120">"16 M per logbuffer"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Af"</item>
+    <item msgid="3054662377365844197">"Alles"</item>
+    <item msgid="688870735111627832">"Alles behalwe radio"</item>
+    <item msgid="2850427388488887328">"net kern"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Af"</item>
+    <item msgid="172978079776521897">"Alle loglêerbuffers"</item>
+    <item msgid="3873873912383879240">"Alles behalwe radiologlêerbuffers"</item>
+    <item msgid="8489661142527693381">"net kernloglêerbuffer"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animasie af"</item>
     <item msgid="6624864048416710414">"Animasieskaal .5x"</item>
diff --git a/packages/SettingsLib/res/values-am/arrays.xml b/packages/SettingsLib/res/values-am/arrays.xml
index 839ea32..5767829 100644
--- a/packages/SettingsLib/res/values-am/arrays.xml
+++ b/packages/SettingsLib/res/values-am/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 ሜ በምዝግብ ማስታወሻ ቋጥ"</item>
     <item msgid="5431354956856655120">"16 ሜ በምዝግብ ማስታወሻ ቋጥ"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"ጠፍቷል"</item>
+    <item msgid="3054662377365844197">"ሁሉም"</item>
+    <item msgid="688870735111627832">"ከሬዲዮ በስተቀር ሁሉም"</item>
+    <item msgid="2850427388488887328">"አውራ ከዋኝ ብቻ"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"ጠፍቷል"</item>
+    <item msgid="172978079776521897">"የሁሉም ምዝግብ ማስታወሻ ቋቶች"</item>
+    <item msgid="3873873912383879240">"ከሬዲዮ ምዝግብ ማስታወሻ ቋቶች በስተቀር ሁሉም"</item>
+    <item msgid="8489661142527693381">"የአውራ ከዋኝ ምዝግብ ማስታወሻ ቋት ብቻ"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"እነማ ጠፍቷል"</item>
     <item msgid="6624864048416710414">"የእነማ ልኬት ለውጥ.5x"</item>
diff --git a/packages/SettingsLib/res/values-ar/arrays.xml b/packages/SettingsLib/res/values-ar/arrays.xml
index 4c422d8..e3d70fe 100644
--- a/packages/SettingsLib/res/values-ar/arrays.xml
+++ b/packages/SettingsLib/res/values-ar/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"٤ ميغابايت لكل ذاكرة تخزين مؤقت للتسجيل"</item>
     <item msgid="5431354956856655120">"١٦ ميغابايت لكل ذاكرة تخزين مؤقت للتسجيل"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"إيقاف"</item>
+    <item msgid="3054662377365844197">"الكل"</item>
+    <item msgid="688870735111627832">"الكل دون اللاسلكي"</item>
+    <item msgid="2850427388488887328">"‏kernel فقط"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"إيقاف"</item>
+    <item msgid="172978079776521897">"كل المخازن المؤقتة للسجلات"</item>
+    <item msgid="3873873912383879240">"كل المخازن المؤقتة باستثناء مخازن سجلات اللاسلكي"</item>
+    <item msgid="8489661142527693381">"‏التخزين المؤقت لسجل kernel فقط"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"إيقاف الرسوم المتحركة"</item>
     <item msgid="6624864048416710414">"‏حجم الرسوم المتحركة 0.5x"</item>
diff --git a/packages/SettingsLib/res/values-az-rAZ/arrays.xml b/packages/SettingsLib/res/values-az-rAZ/arrays.xml
index 46795a5..396dfa1 100644
--- a/packages/SettingsLib/res/values-az-rAZ/arrays.xml
+++ b/packages/SettingsLib/res/values-az-rAZ/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"hər jurnal buferinə 4M"</item>
     <item msgid="5431354956856655120">"hər jurnal buferinə 16M"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Deaktiv"</item>
+    <item msgid="3054662377365844197">"Bütün"</item>
+    <item msgid="688870735111627832">"Radiodan başqa hamısı"</item>
+    <item msgid="2850427388488887328">"yalnız kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Qeyri-aktiv"</item>
+    <item msgid="172978079776521897">"Bütün loq buferləri"</item>
+    <item msgid="3873873912383879240">"Radio loq buferlərindən başqa hamısı"</item>
+    <item msgid="8489661142527693381">"yalnız kernel loq bufferi"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animasiya deaktiv"</item>
     <item msgid="6624864048416710414">"Animasiya miqyası .5 x"</item>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
index 5afb3c4..3e9f904 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 MB po međumemoriji evidencije"</item>
     <item msgid="5431354956856655120">"16 MB po međumemoriji evidencije"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Isključeno"</item>
+    <item msgid="3054662377365844197">"Sve"</item>
+    <item msgid="688870735111627832">"Sve sem radija"</item>
+    <item msgid="2850427388488887328">"samo jezgro"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Isključeno"</item>
+    <item msgid="172978079776521897">"Sve međumemorije evidencija"</item>
+    <item msgid="3873873912383879240">"Sve osim međumemorija evidencija za radio"</item>
+    <item msgid="8489661142527693381">"samo međumemorija evidencije jezgra"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animacija je isključena"</item>
     <item msgid="6624864048416710414">"Razmera animacije 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-be-rBY/arrays.xml b/packages/SettingsLib/res/values-be-rBY/arrays.xml
index e1c8257..20106ef 100644
--- a/packages/SettingsLib/res/values-be-rBY/arrays.xml
+++ b/packages/SettingsLib/res/values-be-rBY/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4M на буфер журнала"</item>
     <item msgid="5431354956856655120">"16M на буфер журнала"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Адключана"</item>
+    <item msgid="3054662377365844197">"Усе"</item>
+    <item msgid="688870735111627832">"Усе, акрамя радыё"</item>
+    <item msgid="2850427388488887328">"толькі ядро"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Адключана"</item>
+    <item msgid="172978079776521897">"Усе буферы журналаў"</item>
+    <item msgid="3873873912383879240">"Усе, акрамя буфераў журналаў радыё"</item>
+    <item msgid="8489661142527693381">"толькі буфер журнала ядра"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Анімацыя выключаная"</item>
     <item msgid="6624864048416710414">"Маштаб анімацыі 0.5x"</item>
diff --git a/packages/SettingsLib/res/values-bg/arrays.xml b/packages/SettingsLib/res/values-bg/arrays.xml
index ba4bd0f..8e803f5 100644
--- a/packages/SettingsLib/res/values-bg/arrays.xml
+++ b/packages/SettingsLib/res/values-bg/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"Рег. буфер – 4 МБ"</item>
     <item msgid="5431354956856655120">"Рег. буфер – 16 МБ"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Изкл."</item>
+    <item msgid="3054662377365844197">"Всички"</item>
+    <item msgid="688870735111627832">"Вс. без радио"</item>
+    <item msgid="2850427388488887328">"само ядрото"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Изкл."</item>
+    <item msgid="172978079776521897">"Всички регистрационни буфери"</item>
+    <item msgid="3873873912383879240">"Всички регистрационни буфери освен тези за радиото"</item>
+    <item msgid="8489661142527693381">"само регистрационния буфер на ядрото"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Анимацията е изключена"</item>
     <item msgid="6624864048416710414">"Скала на анимацията .5x"</item>
diff --git a/packages/SettingsLib/res/values-bn-rBD/arrays.xml b/packages/SettingsLib/res/values-bn-rBD/arrays.xml
index 0931492..d653a97 100644
--- a/packages/SettingsLib/res/values-bn-rBD/arrays.xml
+++ b/packages/SettingsLib/res/values-bn-rBD/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"লগ বাফার প্রতি ৪M"</item>
     <item msgid="5431354956856655120">"লগ বাফার প্রতি ১৬M"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"বন্ধ আছে"</item>
+    <item msgid="3054662377365844197">"সমস্ত"</item>
+    <item msgid="688870735111627832">"সমস্ত কিন্তু রেডিও"</item>
+    <item msgid="2850427388488887328">"শুধুমাত্র কার্নেল"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"বন্ধ আছে"</item>
+    <item msgid="172978079776521897">"সমস্ত লগ বাফার"</item>
+    <item msgid="3873873912383879240">"সমস্ত কিন্তু রেডিও লগ বাফারগুলি"</item>
+    <item msgid="8489661142527693381">"শুধুমাত্র কার্নেল লগ বাফার"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"অ্যানিমেশন বন্ধ করুন"</item>
     <item msgid="6624864048416710414">"অ্যানিমেশন স্কেল .৫x"</item>
diff --git a/packages/SettingsLib/res/values-bs-rBA/arrays.xml b/packages/SettingsLib/res/values-bs-rBA/arrays.xml
index c1cf9ea..8452696 100644
--- a/packages/SettingsLib/res/values-bs-rBA/arrays.xml
+++ b/packages/SettingsLib/res/values-bs-rBA/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4M po međumemoriji dnevnika"</item>
     <item msgid="5431354956856655120">"16M po međumemoriji dnevnika"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Isključeno"</item>
+    <item msgid="3054662377365844197">"Svi"</item>
+    <item msgid="688870735111627832">"Svi osim radija"</item>
+    <item msgid="2850427388488887328">"samo kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Isključeno"</item>
+    <item msgid="172978079776521897">"Međuspremnici svih zapisnika"</item>
+    <item msgid="3873873912383879240">"Međuspremnici svih zapisnika osim radija"</item>
+    <item msgid="8489661142527693381">"samo međuspremnik zapisnika kernela"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animacija isključena"</item>
     <item msgid="6624864048416710414">"Animacija razmjera .5x"</item>
diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml
index 3f22fae..e4f618e 100644
--- a/packages/SettingsLib/res/values-ca/arrays.xml
+++ b/packages/SettingsLib/res/values-ca/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M / memòria intermèdia reg."</item>
     <item msgid="5431354956856655120">"16 M / memòria intermèdia reg."</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Desactivat"</item>
+    <item msgid="3054662377365844197">"Tot"</item>
+    <item msgid="688870735111627832">"Tot menys mòbil"</item>
+    <item msgid="2850427388488887328">"només kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Desactivat"</item>
+    <item msgid="172978079776521897">"Totes les memòries intermèdies de registre"</item>
+    <item msgid="3873873912383879240">"Tot menys mem. interm. de registre de senyal mòbil"</item>
+    <item msgid="8489661142527693381">"només memòria intermèdia del registre de kernel"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animació desactivada"</item>
     <item msgid="6624864048416710414">"Escala d\'animació 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml
index e00f9ee..b0185e8 100644
--- a/packages/SettingsLib/res/values-cs/arrays.xml
+++ b/packages/SettingsLib/res/values-cs/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 MB na vyrovnávací paměť protokolů"</item>
     <item msgid="5431354956856655120">"16 MB na vyrovnávací paměť protokolů"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Vypnuto"</item>
+    <item msgid="3054662377365844197">"Vše"</item>
+    <item msgid="688870735111627832">"Bezdrát. ne"</item>
+    <item msgid="2850427388488887328">"pouze jádro"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Vypnuto"</item>
+    <item msgid="172978079776521897">"Všechny vyrovnávací paměti protokolů"</item>
+    <item msgid="3873873912383879240">"Všechny kromě protokolu bezdrátových modulů"</item>
+    <item msgid="8489661142527693381">"pouze protokol vyrovnávací paměti jádra"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animace je vypnuta"</item>
     <item msgid="6624864048416710414">"Měřítko animace 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml
index d930cfe..d06f39f 100644
--- a/packages/SettingsLib/res/values-da/arrays.xml
+++ b/packages/SettingsLib/res/values-da/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 MB pr. logbuffer"</item>
     <item msgid="5431354956856655120">"16 MB pr. logbuffer"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Slået fra"</item>
+    <item msgid="3054662377365844197">"Alle"</item>
+    <item msgid="688870735111627832">"Radio undtaget"</item>
+    <item msgid="2850427388488887328">"kun kerne"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Slået fra"</item>
+    <item msgid="172978079776521897">"Alle logbuffere"</item>
+    <item msgid="3873873912383879240">"Alle undtagen radiologbuffere"</item>
+    <item msgid="8489661142527693381">"kun logbuffer for kerne"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animation fra"</item>
     <item msgid="6624864048416710414">"Animationsskala 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-de/arrays.xml b/packages/SettingsLib/res/values-de/arrays.xml
index 6a83617..9a81e8f 100644
--- a/packages/SettingsLib/res/values-de/arrays.xml
+++ b/packages/SettingsLib/res/values-de/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 Mio. pro Puffer"</item>
     <item msgid="5431354956856655120">"16 Mio. pro Puffer"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Aus"</item>
+    <item msgid="3054662377365844197">"Alle"</item>
+    <item msgid="688870735111627832">"Alle außer Funkschnittstelle"</item>
+    <item msgid="2850427388488887328">"Nur Kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Aus"</item>
+    <item msgid="172978079776521897">"Alle Protokollzwischenspeicher"</item>
+    <item msgid="3873873912383879240">"Alle Protokollzwischenspeicher außer Funkschnittstelle"</item>
+    <item msgid="8489661142527693381">"Nur Kernelprotokoll-Zwischenspeicher"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animation aus"</item>
     <item msgid="6624864048416710414">"Animationsmaßstab: 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-el/arrays.xml b/packages/SettingsLib/res/values-el/arrays.xml
index 73707ac..a6ce80a 100644
--- a/packages/SettingsLib/res/values-el/arrays.xml
+++ b/packages/SettingsLib/res/values-el/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M ανά προσ. μν. αρχ. καταγρ."</item>
     <item msgid="5431354956856655120">"16 M ανά πρ. μν. αρχ. καταγρ."</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Ανενεργό"</item>
+    <item msgid="3054662377365844197">"Όλα"</item>
+    <item msgid="688870735111627832">"Όλοι εκτός από του αποστολέα"</item>
+    <item msgid="2850427388488887328">"μόνο πυρήνας"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Ανενεργό"</item>
+    <item msgid="172978079776521897">"Όλα τα αρχεία καταγραφής προσωρινής μνήμης"</item>
+    <item msgid="3873873912383879240">"Όλα εκτός από τα αρχεία κατ.προσ.μνήμης αποστολέα"</item>
+    <item msgid="8489661142527693381">"μόνο προσωρινή μνήμη αρχείου καταγραφής πυρήνα"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Κινούμ.εικόνες απενεργοποιημένες"</item>
     <item msgid="6624864048416710414">"Κλίμ. κινούμ. εικ. 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-en-rAU/arrays.xml b/packages/SettingsLib/res/values-en-rAU/arrays.xml
index ca5065a..2ee613f 100644
--- a/packages/SettingsLib/res/values-en-rAU/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rAU/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M per log buffer"</item>
     <item msgid="5431354956856655120">"16 M per log buffer"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Off"</item>
+    <item msgid="3054662377365844197">"All"</item>
+    <item msgid="688870735111627832">"All but radio"</item>
+    <item msgid="2850427388488887328">"kernel only"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Off"</item>
+    <item msgid="172978079776521897">"All log buffers"</item>
+    <item msgid="3873873912383879240">"All but radio log buffers"</item>
+    <item msgid="8489661142527693381">"kernel log buffer only"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animation off"</item>
     <item msgid="6624864048416710414">"Animation scale .5x"</item>
diff --git a/packages/SettingsLib/res/values-en-rGB/arrays.xml b/packages/SettingsLib/res/values-en-rGB/arrays.xml
index ca5065a..2ee613f 100644
--- a/packages/SettingsLib/res/values-en-rGB/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rGB/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M per log buffer"</item>
     <item msgid="5431354956856655120">"16 M per log buffer"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Off"</item>
+    <item msgid="3054662377365844197">"All"</item>
+    <item msgid="688870735111627832">"All but radio"</item>
+    <item msgid="2850427388488887328">"kernel only"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Off"</item>
+    <item msgid="172978079776521897">"All log buffers"</item>
+    <item msgid="3873873912383879240">"All but radio log buffers"</item>
+    <item msgid="8489661142527693381">"kernel log buffer only"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animation off"</item>
     <item msgid="6624864048416710414">"Animation scale .5x"</item>
diff --git a/packages/SettingsLib/res/values-en-rIN/arrays.xml b/packages/SettingsLib/res/values-en-rIN/arrays.xml
index ca5065a..2ee613f 100644
--- a/packages/SettingsLib/res/values-en-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rIN/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M per log buffer"</item>
     <item msgid="5431354956856655120">"16 M per log buffer"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Off"</item>
+    <item msgid="3054662377365844197">"All"</item>
+    <item msgid="688870735111627832">"All but radio"</item>
+    <item msgid="2850427388488887328">"kernel only"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Off"</item>
+    <item msgid="172978079776521897">"All log buffers"</item>
+    <item msgid="3873873912383879240">"All but radio log buffers"</item>
+    <item msgid="8489661142527693381">"kernel log buffer only"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animation off"</item>
     <item msgid="6624864048416710414">"Animation scale .5x"</item>
diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml
index fa48fbc..eae9b1b 100644
--- a/packages/SettingsLib/res/values-es-rUS/arrays.xml
+++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M/búfer registro"</item>
     <item msgid="5431354956856655120">"16 M/búfer registro"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Desactivado"</item>
+    <item msgid="3054662377365844197">"Todo"</item>
+    <item msgid="688870735111627832">"Excepto radio"</item>
+    <item msgid="2850427388488887328">"solo kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Desactivado"</item>
+    <item msgid="172978079776521897">"Todos los búferes de registro"</item>
+    <item msgid="3873873912383879240">"Todos los búferes de registro, excepto radio"</item>
+    <item msgid="8489661142527693381">"solo búfer de registro de kernel"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animación desactivada"</item>
     <item msgid="6624864048416710414">"Escala de animación 0.5x"</item>
diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml
index 4b6bbbb..168f378 100644
--- a/packages/SettingsLib/res/values-es/arrays.xml
+++ b/packages/SettingsLib/res/values-es/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M/búfer registro"</item>
     <item msgid="5431354956856655120">"16 M/búfer registro"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"No"</item>
+    <item msgid="3054662377365844197">"Todo"</item>
+    <item msgid="688870735111627832">"Todo menos señal móvil"</item>
+    <item msgid="2850427388488887328">"solo kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"No"</item>
+    <item msgid="172978079776521897">"Todos los búferes de registro"</item>
+    <item msgid="3873873912383879240">"Todo excepto búferes de registro de señal móvil"</item>
+    <item msgid="8489661142527693381">"solo búfer de registro del kernel"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animación desactivada"</item>
     <item msgid="6624864048416710414">"Escala de animación 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-et-rEE/arrays.xml b/packages/SettingsLib/res/values-et-rEE/arrays.xml
index b29b20f..019bf50 100644
--- a/packages/SettingsLib/res/values-et-rEE/arrays.xml
+++ b/packages/SettingsLib/res/values-et-rEE/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 000 000 / logipuhver"</item>
     <item msgid="5431354956856655120">"16 000 000 / logipuhver"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Väljas"</item>
+    <item msgid="3054662377365844197">"Kõik"</item>
+    <item msgid="688870735111627832">"Kõik, v.a raadio"</item>
+    <item msgid="2850427388488887328">"ainult tuum"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Väljas"</item>
+    <item msgid="172978079776521897">"Kõik logi puhvrid"</item>
+    <item msgid="3873873912383879240">"Kõik, v.a raadiologi puhvrid"</item>
+    <item msgid="8489661142527693381">"ainult tuuma logi puhver"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animatsioon väljas"</item>
     <item msgid="6624864048416710414">"Animatsiooni skaala 0,5 korda"</item>
diff --git a/packages/SettingsLib/res/values-eu-rES/arrays.xml b/packages/SettingsLib/res/values-eu-rES/arrays.xml
index 3e0906b..c617445 100644
--- a/packages/SettingsLib/res/values-eu-rES/arrays.xml
+++ b/packages/SettingsLib/res/values-eu-rES/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M erregistroen bufferreko"</item>
     <item msgid="5431354956856655120">"16 M erregistroen bufferreko"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Desaktibatuta"</item>
+    <item msgid="3054662377365844197">"Guztiak"</item>
+    <item msgid="688870735111627832">"Guztiak, irratiarenak izan ezik"</item>
+    <item msgid="2850427388488887328">"kernela soilik"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Desaktibatuta"</item>
+    <item msgid="172978079776521897">"Erregistroen buffer guztiak"</item>
+    <item msgid="3873873912383879240">"Erregistroen buffer guztiak, irratiarenak izan ezik"</item>
+    <item msgid="8489661142527693381">"kernelaren erregistroaren bufferra soilik"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animazioa desaktibatuta"</item>
     <item msgid="6624864048416710414">"Animazio-eskala: 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml
index 97e301f..6dc8491 100644
--- a/packages/SettingsLib/res/values-fa/arrays.xml
+++ b/packages/SettingsLib/res/values-fa/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"۴ میلیون در هر بافر گزارش"</item>
     <item msgid="5431354956856655120">"۱۶ میلیون در هر بافر گزارش"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"خاموش"</item>
+    <item msgid="3054662377365844197">"همه"</item>
+    <item msgid="688870735111627832">"همه به‌جز رادیو"</item>
+    <item msgid="2850427388488887328">"فقط هسته اصلی"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"خاموش"</item>
+    <item msgid="172978079776521897">"همه بافرهای گزارش"</item>
+    <item msgid="3873873912383879240">"همه به‌جز بافرهای گزارش رادیو"</item>
+    <item msgid="8489661142527693381">"فقط بافر گزارش هسته اصلی"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"پویانمایی خاموش"</item>
     <item msgid="6624864048416710414">"‏مقیاس پویانمایی 0.5x"</item>
diff --git a/packages/SettingsLib/res/values-fi/arrays.xml b/packages/SettingsLib/res/values-fi/arrays.xml
index 4d67954..3c2fe61 100644
--- a/packages/SettingsLib/res/values-fi/arrays.xml
+++ b/packages/SettingsLib/res/values-fi/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 Mt / lokipuskuri"</item>
     <item msgid="5431354956856655120">"16 Mt / lokipuskuri"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Ei käytössä"</item>
+    <item msgid="3054662377365844197">"Kaikki"</item>
+    <item msgid="688870735111627832">"Kaikki paitsi radio"</item>
+    <item msgid="2850427388488887328">"vain kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Ei käytössä"</item>
+    <item msgid="172978079776521897">"Kaikki lokipuskurit"</item>
+    <item msgid="3873873912383879240">"Kaikki paitsi radiolokipuskurit"</item>
+    <item msgid="8489661142527693381">"vain kernel-lokipuskuri"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animaatio pois käytöstä"</item>
     <item msgid="6624864048416710414">"Animaatioasteikko 0,5-kertainen"</item>
diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
index 8936e34..ba25d27 100644
--- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 Mo/tampon journal"</item>
     <item msgid="5431354956856655120">"16 Mo/tampon journal"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Désactivé"</item>
+    <item msgid="3054662377365844197">"Tous"</item>
+    <item msgid="688870735111627832">"Tous sauf radio"</item>
+    <item msgid="2850427388488887328">"noyau uniquement"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Désactivé"</item>
+    <item msgid="172978079776521897">"Tous les tampons de journal"</item>
+    <item msgid="3873873912383879240">"Tous les tampons de journal sauf celui de la radio"</item>
+    <item msgid="8489661142527693381">"tampon journal du noyau uniquement"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animation désactivée"</item>
     <item msgid="6624864048416710414">"Échelle d\'animation 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-fr/arrays.xml b/packages/SettingsLib/res/values-fr/arrays.xml
index 99f5e30..3340afb 100644
--- a/packages/SettingsLib/res/values-fr/arrays.xml
+++ b/packages/SettingsLib/res/values-fr/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 Mo par tampon journal"</item>
     <item msgid="5431354956856655120">"16 Mo par tampon journal"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Désactivé"</item>
+    <item msgid="3054662377365844197">"Tous"</item>
+    <item msgid="688870735111627832">"Tous sauf radio"</item>
+    <item msgid="2850427388488887328">"noyau uniquement"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Désactivé"</item>
+    <item msgid="172978079776521897">"Toutes les mémoires tampon journal"</item>
+    <item msgid="3873873912383879240">"Toutes sauf les mémoires tampon journal radio"</item>
+    <item msgid="8489661142527693381">"tampon journal du noyau uniquement"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animation désactivée"</item>
     <item msgid="6624864048416710414">"Échelle d\'animation x 0,5"</item>
diff --git a/packages/SettingsLib/res/values-gl-rES/arrays.xml b/packages/SettingsLib/res/values-gl-rES/arrays.xml
index 5723173..201cda2 100644
--- a/packages/SettingsLib/res/values-gl-rES/arrays.xml
+++ b/packages/SettingsLib/res/values-gl-rES/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M por búfer de rexistro"</item>
     <item msgid="5431354956856655120">"16 M por búfer de rexistro"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Desactivado"</item>
+    <item msgid="3054662377365844197">"Todo"</item>
+    <item msgid="688870735111627832">"Agás radio"</item>
+    <item msgid="2850427388488887328">"só kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Desactivado"</item>
+    <item msgid="172978079776521897">"Todos os búfers de rexistro"</item>
+    <item msgid="3873873912383879240">"Todo agás os búfers de rexistro de radio"</item>
+    <item msgid="8489661142527693381">"só búfer do rexistro do kernel"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animación desactivada"</item>
     <item msgid="6624864048416710414">"Escala de animación 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-gu-rIN/arrays.xml b/packages/SettingsLib/res/values-gu-rIN/arrays.xml
index 16a3471..c746188 100644
--- a/packages/SettingsLib/res/values-gu-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-gu-rIN/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"લૉગ બફર દીઠ 4M"</item>
     <item msgid="5431354956856655120">"લૉગ બફર દીઠ 16M"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"બંધ"</item>
+    <item msgid="3054662377365844197">"તમામ"</item>
+    <item msgid="688870735111627832">"તમામ પરંતુ રેડિઓ"</item>
+    <item msgid="2850427388488887328">"ફક્ત કર્નલ"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"બંધ"</item>
+    <item msgid="172978079776521897">"તમામ લૉગ બફર્સ"</item>
+    <item msgid="3873873912383879240">"તમામ પરંતુ રેડિઓ લૉગ બફર્સ"</item>
+    <item msgid="8489661142527693381">"ફક્ત કર્નલ લૉગ બફર"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"એનિમેશન બંધ"</item>
     <item msgid="6624864048416710414">"એનિમેશન સ્કેલ .5x"</item>
diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml
index 6756245..29b6bef 100644
--- a/packages/SettingsLib/res/values-hi/arrays.xml
+++ b/packages/SettingsLib/res/values-hi/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4M प्रति लॉग बफ़र"</item>
     <item msgid="5431354956856655120">"16M प्रति लॉग बफ़र"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"बंद"</item>
+    <item msgid="3054662377365844197">"सभी"</item>
+    <item msgid="688870735111627832">"रेडियो छोड़कर सभी"</item>
+    <item msgid="2850427388488887328">"केवल कर्नल"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"बंद"</item>
+    <item msgid="172978079776521897">"सभी लॉग बफ़र"</item>
+    <item msgid="3873873912383879240">"रेडियो लॉग बफ़र को छोड़कर सभी"</item>
+    <item msgid="8489661142527693381">"केवल कर्नल लॉग बफ़र"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"एनिमेशन बंद"</item>
     <item msgid="6624864048416710414">"एनिमेशन स्‍केल .5x"</item>
diff --git a/packages/SettingsLib/res/values-hr/arrays.xml b/packages/SettingsLib/res/values-hr/arrays.xml
index 792d45c..a2d253c 100644
--- a/packages/SettingsLib/res/values-hr/arrays.xml
+++ b/packages/SettingsLib/res/values-hr/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 MB po međusprem. zapisnika"</item>
     <item msgid="5431354956856655120">"16 MB po međusprem. zapisnika"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Isključeno"</item>
+    <item msgid="3054662377365844197">"Sve"</item>
+    <item msgid="688870735111627832">"Sve osim radija"</item>
+    <item msgid="2850427388488887328">"samo jezgra"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Isključeno"</item>
+    <item msgid="172978079776521897">"Svi međuspremnici zapisa"</item>
+    <item msgid="3873873912383879240">"Sve osim međuspremnika zapisnika radija"</item>
+    <item msgid="8489661142527693381">"samo međuspremnik zapisnika jezgre"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animacija isključena"</item>
     <item msgid="6624864048416710414">"Brzina animacije 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-hu/arrays.xml b/packages/SettingsLib/res/values-hu/arrays.xml
index 36cf322..41ce4b0 100644
--- a/packages/SettingsLib/res/values-hu/arrays.xml
+++ b/packages/SettingsLib/res/values-hu/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 MB/naplópuffer"</item>
     <item msgid="5431354956856655120">"16 MB/naplópuffer"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Kikapcsolva"</item>
+    <item msgid="3054662377365844197">"Összes"</item>
+    <item msgid="688870735111627832">"Rádiót kivéve"</item>
+    <item msgid="2850427388488887328">"csak kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Kikapcsolva"</item>
+    <item msgid="172978079776521897">"Minden naplópuffer"</item>
+    <item msgid="3873873912383879240">"A rádiónapló-pufferen kívül mindegyik"</item>
+    <item msgid="8489661142527693381">"csak kernelnaplópuffer"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animáció ki"</item>
     <item msgid="6624864048416710414">"Animáció tempója: 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-hy-rAM/arrays.xml b/packages/SettingsLib/res/values-hy-rAM/arrays.xml
index da7362b..e93cbfc 100644
--- a/packages/SettingsLib/res/values-hy-rAM/arrays.xml
+++ b/packages/SettingsLib/res/values-hy-rAM/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"Պահնակ՝ առավ. 4ՄԲ"</item>
     <item msgid="5431354956856655120">"Պահնակ՝ առավ. 16ՄԲ"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Անջատված է"</item>
+    <item msgid="3054662377365844197">"Բոլորը"</item>
+    <item msgid="688870735111627832">"Բոլորը, ռադիոյից բացի"</item>
+    <item msgid="2850427388488887328">"միայն միջուկը"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Անջատված է"</item>
+    <item msgid="172978079776521897">"Մատյանի բոլոր բուֆերները"</item>
+    <item msgid="3873873912383879240">"Մատյանի բոլոր բուֆերները, ռադիո բուֆերներից բացի"</item>
+    <item msgid="8489661142527693381">"միայն միջուկի մատյանի պահնակը"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Անջատել շարժապատկերը"</item>
     <item msgid="6624864048416710414">"Շարժապատկերի սանդղակը` .5x"</item>
diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml
index 8c8ae11..a612639 100644
--- a/packages/SettingsLib/res/values-in/arrays.xml
+++ b/packages/SettingsLib/res/values-in/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M/penyangga log"</item>
     <item msgid="5431354956856655120">"16 M/penyangga log"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Nonaktif"</item>
+    <item msgid="3054662377365844197">"Semua"</item>
+    <item msgid="688870735111627832">"Selain radio"</item>
+    <item msgid="2850427388488887328">"khusus kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Nonaktif"</item>
+    <item msgid="172978079776521897">"Semua penyangga log"</item>
+    <item msgid="3873873912383879240">"Semua kecuali penyangga log radio"</item>
+    <item msgid="8489661142527693381">"khusus penyangga log kernel"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animasi mati"</item>
     <item msgid="6624864048416710414">"Skala animasi 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-is-rIS/arrays.xml b/packages/SettingsLib/res/values-is-rIS/arrays.xml
index b6f9243..64d4da2 100644
--- a/packages/SettingsLib/res/values-is-rIS/arrays.xml
+++ b/packages/SettingsLib/res/values-is-rIS/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M/biðminni"</item>
     <item msgid="5431354956856655120">"16 M/biðminni"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Slökkt"</item>
+    <item msgid="3054662377365844197">"Allt"</item>
+    <item msgid="688870735111627832">"Allt n. útvarp"</item>
+    <item msgid="2850427388488887328">"einungis kjarni"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Slökkt"</item>
+    <item msgid="172978079776521897">"Allt biðminni"</item>
+    <item msgid="3873873912383879240">"Allt nema útvarpsbiðminni"</item>
+    <item msgid="8489661142527693381">"einungis kjarnaannálabiðminni"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Slökkt á hreyfiáhrifum"</item>
     <item msgid="6624864048416710414">"Lengd hreyfiáhrifa 5x"</item>
diff --git a/packages/SettingsLib/res/values-it/arrays.xml b/packages/SettingsLib/res/values-it/arrays.xml
index 09e2231..e6938e0 100644
--- a/packages/SettingsLib/res/values-it/arrays.xml
+++ b/packages/SettingsLib/res/values-it/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 MB/buffer log"</item>
     <item msgid="5431354956856655120">"16 MB/buffer log"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Off"</item>
+    <item msgid="3054662377365844197">"Tutti"</item>
+    <item msgid="688870735111627832">"Tutti tranne il segnale radio"</item>
+    <item msgid="2850427388488887328">"solo kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Off"</item>
+    <item msgid="172978079776521897">"Tutti i buffer log"</item>
+    <item msgid="3873873912383879240">"Tutti tranne i buffer log del segnale radio"</item>
+    <item msgid="8489661142527693381">"solo buffer log kernel"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animazione disattivata"</item>
     <item msgid="6624864048416710414">"Scala animazione 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml
index 151d16e..7bd46ad 100644
--- a/packages/SettingsLib/res/values-iw/arrays.xml
+++ b/packages/SettingsLib/res/values-iw/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"‏4M לכל מאגר יומן"</item>
     <item msgid="5431354956856655120">"‏16M לכל מאגר יומן"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"כבוי"</item>
+    <item msgid="3054662377365844197">"הכול"</item>
+    <item msgid="688870735111627832">"הכול מלבד רדיו"</item>
+    <item msgid="2850427388488887328">"ליבה בלבד"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"כבוי"</item>
+    <item msgid="172978079776521897">"כל מאגרי הנתונים הזמניים של היומן"</item>
+    <item msgid="3873873912383879240">"הכול מלבד מאגרי הנתונים הזמניים של יומן הרדיו"</item>
+    <item msgid="8489661142527693381">"מאגר נתונים זמני של היומן השמור בליבה בלבד"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"אנימציה כבויה"</item>
     <item msgid="6624864048416710414">"‏קנה מידה לאנימציה 5x."</item>
diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml
index d8a8a0a..5b9b41c 100644
--- a/packages/SettingsLib/res/values-ja/arrays.xml
+++ b/packages/SettingsLib/res/values-ja/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M / ログバッファ"</item>
     <item msgid="5431354956856655120">"16 M / ログバッファ"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"OFF"</item>
+    <item msgid="3054662377365844197">"すべて"</item>
+    <item msgid="688870735111627832">"ラジオ以外すべて"</item>
+    <item msgid="2850427388488887328">"カーネルのみ"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"OFF"</item>
+    <item msgid="172978079776521897">"すべてのログバッファ"</item>
+    <item msgid="3873873912383879240">"ラジオ ログバッファ以外すべて"</item>
+    <item msgid="8489661142527693381">"カーネル ログ バッファのみ"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"アニメーションオフ"</item>
     <item msgid="6624864048416710414">"アニメーションスケール.5x"</item>
diff --git a/packages/SettingsLib/res/values-ka-rGE/arrays.xml b/packages/SettingsLib/res/values-ka-rGE/arrays.xml
index d6213c1..5e63ddd 100644
--- a/packages/SettingsLib/res/values-ka-rGE/arrays.xml
+++ b/packages/SettingsLib/res/values-ka-rGE/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 მბაიტი / ჟურნალის ბუფერი"</item>
     <item msgid="5431354956856655120">"16 მბაიტი / ჟურნალის ბუფერი"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"გამორთული"</item>
+    <item msgid="3054662377365844197">"ყველა"</item>
+    <item msgid="688870735111627832">"რადიოს გარდა ყველა"</item>
+    <item msgid="2850427388488887328">"მხოლოდ ბირთვი"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"გამორთული"</item>
+    <item msgid="172978079776521897">"ჟურნალების ყველა ბუფერი"</item>
+    <item msgid="3873873912383879240">"რადიოჟურნალების ბუფერების გარდა ყველა"</item>
+    <item msgid="8489661142527693381">"მხოლოდ ბირთვის ჟურნალის ბუფერი"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"ანიმაციის გამორთვა"</item>
     <item msgid="6624864048416710414">"ანიმაციის სიჩქარე .5x"</item>
diff --git a/packages/SettingsLib/res/values-kk-rKZ/arrays.xml b/packages/SettingsLib/res/values-kk-rKZ/arrays.xml
index e876a3d..d1dae87 100644
--- a/packages/SettingsLib/res/values-kk-rKZ/arrays.xml
+++ b/packages/SettingsLib/res/values-kk-rKZ/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"Әр журнал буферіне 4 МБ"</item>
     <item msgid="5431354956856655120">"Әр журнал буферіне 16 МБ"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Өшірулі"</item>
+    <item msgid="3054662377365844197">"Барлығы"</item>
+    <item msgid="688870735111627832">"Радиодан басқасының барлығы"</item>
+    <item msgid="2850427388488887328">"тек ядро"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Өшірулі"</item>
+    <item msgid="172978079776521897">"Барлық журнал буфері"</item>
+    <item msgid="3873873912383879240">"Радио журналының буферлерінен басқасының барлығы"</item>
+    <item msgid="8489661142527693381">"тек ядро журналының буфері"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Aнимация өшірілген"</item>
     <item msgid="6624864048416710414">"Aнимация өлшемі .5x"</item>
diff --git a/packages/SettingsLib/res/values-km-rKH/arrays.xml b/packages/SettingsLib/res/values-km-rKH/arrays.xml
index 000f3c0..17371f6 100644
--- a/packages/SettingsLib/res/values-km-rKH/arrays.xml
+++ b/packages/SettingsLib/res/values-km-rKH/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4M per log buffer"</item>
     <item msgid="5431354956856655120">"16M per log buffer"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"បិទ"</item>
+    <item msgid="3054662377365844197">"ទាំង​អស់"</item>
+    <item msgid="688870735111627832">"ទាំងអស់ក្រៅពីវិទ្យុ"</item>
+    <item msgid="2850427388488887328">"kernel តែប៉ុណ្ណោះ"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"បិទ"</item>
+    <item msgid="172978079776521897">"អង្គចងចាំកំណត់ហេតុបណ្តោះអាសន្នទាំងអស់"</item>
+    <item msgid="3873873912383879240">"ទាំងអស់ក្រៅពីអង្គចងចាំកំណត់ហេតុវិទ្យុបណ្តោះអាសន្ន"</item>
+    <item msgid="8489661142527693381">"អង្គចងចាំបណ្ដោះអាសន្នកំណត់ហេតុ kernel តែប៉ុណ្ណោះ"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"បិទ​ចលនា"</item>
     <item msgid="6624864048416710414">"មាត្រដ្ឋាន​ចលនា .5x"</item>
diff --git a/packages/SettingsLib/res/values-kn-rIN/arrays.xml b/packages/SettingsLib/res/values-kn-rIN/arrays.xml
index 5c38077..5f6d699 100644
--- a/packages/SettingsLib/res/values-kn-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-kn-rIN/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"ಪ್ರತಿ ಲಾಗ್ ಬಫರ್‌ಗೆ 4M"</item>
     <item msgid="5431354956856655120">"ಪ್ರತಿ ಲಾಗ್ ಬಫರ್‌ಗೆ 16M"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"ಆಫ್"</item>
+    <item msgid="3054662377365844197">"ಎಲ್ಲಾ"</item>
+    <item msgid="688870735111627832">"ಎಲ್ಲಾ ಆದರೆ ರೇಡಿಯೊ"</item>
+    <item msgid="2850427388488887328">"ಕೆರ್ನಲ್ ಮಾತ್ರ"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"ಆಫ್ ಆಗಿದೆ"</item>
+    <item msgid="172978079776521897">"ಎಲ್ಲಾ ಲಾಗ್ ಬಫರ್‌ಗಳು"</item>
+    <item msgid="3873873912383879240">"ಎಲ್ಲಾ ಆದರೆ ರೇಡಿಯೊ ಲಾಗ್ ಬಫರ್‌ಗಳು"</item>
+    <item msgid="8489661142527693381">"ಕೆರ್ನಲ್ ಲಾಗ್ ಬಫರ್ ಮಾತ್ರ"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"ಆನಿಮೇಶನ್ ಆಫ್"</item>
     <item msgid="6624864048416710414">"ಅನಿಮೇಶನ್‌‌ ಮಾಪಕ .5x"</item>
diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml
index c3f4a02..596f93e 100644
--- a/packages/SettingsLib/res/values-ko/arrays.xml
+++ b/packages/SettingsLib/res/values-ko/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"로그 버퍼당 4M"</item>
     <item msgid="5431354956856655120">"로그 버퍼당 16M"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"사용 안함"</item>
+    <item msgid="3054662377365844197">"전체"</item>
+    <item msgid="688870735111627832">"라디오 외 모두"</item>
+    <item msgid="2850427388488887328">"커널만"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"사용 안함"</item>
+    <item msgid="172978079776521897">"모든 로그 버퍼"</item>
+    <item msgid="3873873912383879240">"라디오 로그 버퍼를 제외한 모든 버퍼"</item>
+    <item msgid="8489661142527693381">"커널 로그 버퍼만"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"애니메이션 사용 안함"</item>
     <item msgid="6624864048416710414">"애니메이션 배율 .5x"</item>
diff --git a/packages/SettingsLib/res/values-ky-rKG/arrays.xml b/packages/SettingsLib/res/values-ky-rKG/arrays.xml
index 0676414..33a0b5d 100644
--- a/packages/SettingsLib/res/values-ky-rKG/arrays.xml
+++ b/packages/SettingsLib/res/values-ky-rKG/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"Буфер: 4М ашпашы керек"</item>
     <item msgid="5431354956856655120">"Буфер: 16М ашпашы керек"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Өчүк"</item>
+    <item msgid="3054662377365844197">"Бардыгы"</item>
+    <item msgid="688870735111627832">"Радиодон башка"</item>
+    <item msgid="2850427388488887328">"өзөк гана"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Өчүк"</item>
+    <item msgid="172978079776521897">"Бардык таржымал буферлери"</item>
+    <item msgid="3873873912383879240">"Радио таржымал буферлеринен башкаларынын баары"</item>
+    <item msgid="8489661142527693381">"өзөктүк журнал буфери гана"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Анимацияны өчүрүү"</item>
     <item msgid="6624864048416710414">"Анимация масштабы .5x"</item>
diff --git a/packages/SettingsLib/res/values-lo-rLA/arrays.xml b/packages/SettingsLib/res/values-lo-rLA/arrays.xml
index 46911c7..7a6b77a 100644
--- a/packages/SettingsLib/res/values-lo-rLA/arrays.xml
+++ b/packages/SettingsLib/res/values-lo-rLA/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"ບັບ​ເຟີ 4M ​ຕໍ່​ບັນທຶກ"</item>
     <item msgid="5431354956856655120">"ບັບ​ເຟີ 16M ​ຕໍ່​ບັນທຶກ"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"ປິດ"</item>
+    <item msgid="3054662377365844197">"ທັງໝົດ"</item>
+    <item msgid="688870735111627832">"ທັງໝົດຍົກເວັ້ນວິທະຍຸ"</item>
+    <item msgid="2850427388488887328">"ເຄີນເນວເທົ່ານັ້ນ"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"ປິດ"</item>
+    <item msgid="172978079776521897">"ບັບເຟີບັນທຶກທັງໝົດ"</item>
+    <item msgid="3873873912383879240">"ທັງໝົດຍົກເວັ້ນບັບເຟີບັນທຶກວິທະຍຸ"</item>
+    <item msgid="8489661142527693381">"ບັບເຟີບັນທຶກເຄີນເນວເທົ່ານັ້ນ"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"ປິດອະນິເມຊັນ"</item>
     <item msgid="6624864048416710414">"ຂະໜາດອະນິເມຊັນ .5x"</item>
diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml
index 4fad399..49908ad 100644
--- a/packages/SettingsLib/res/values-lt/arrays.xml
+++ b/packages/SettingsLib/res/values-lt/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 MB žurnalo buferis"</item>
     <item msgid="5431354956856655120">"16 MB žurnalo buferis"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Išjungta"</item>
+    <item msgid="3054662377365844197">"Viskas"</item>
+    <item msgid="688870735111627832">"Viskas, išsk. rad. r."</item>
+    <item msgid="2850427388488887328">"tik branduolys"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Išjungta"</item>
+    <item msgid="172978079776521897">"Visi žurnalų buferiai"</item>
+    <item msgid="3873873912383879240">"Visi, išskyrus radijo ryšio žurnalų buferius"</item>
+    <item msgid="8489661142527693381">"tik branduolio žurnalo buferis"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animacija išjungta"</item>
     <item msgid="6624864048416710414">"Animacijos mastelis 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-mk-rMK/arrays.xml b/packages/SettingsLib/res/values-mk-rMK/arrays.xml
index a6c5ac0..a72bcd3 100644
--- a/packages/SettingsLib/res/values-mk-rMK/arrays.xml
+++ b/packages/SettingsLib/res/values-mk-rMK/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M/меѓумеморија"</item>
     <item msgid="5431354956856655120">"16 M/меѓумеморија"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Исклучено"</item>
+    <item msgid="3054662377365844197">"Сите"</item>
+    <item msgid="688870735111627832">"Сите освен радио"</item>
+    <item msgid="2850427388488887328">"само јадро"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Исклучено"</item>
+    <item msgid="172978079776521897">"Привремена меморија на целата евиденција"</item>
+    <item msgid="3873873912383879240">"Привремена мем. на цела евиденција освен за радио"</item>
+    <item msgid="8489661142527693381">"само привремена меморија за евиденција на јадро"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Без анимација"</item>
     <item msgid="6624864048416710414">"Опсег на анимација 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-ml-rIN/arrays.xml b/packages/SettingsLib/res/values-ml-rIN/arrays.xml
index bbad21c..ac6841e 100644
--- a/packages/SettingsLib/res/values-ml-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-ml-rIN/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"ഓരോ ലോഗ് ബഫറിനും 4M"</item>
     <item msgid="5431354956856655120">"ഓരോ ലോഗ് ബഫറിനും 16M"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"ഓഫ്"</item>
+    <item msgid="3054662377365844197">"എല്ലാം"</item>
+    <item msgid="688870735111627832">"റേഡിയോ ഒഴികെയുള്ള എല്ലാം"</item>
+    <item msgid="2850427388488887328">"കേർനൽ മാത്രം"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"ഓഫ്"</item>
+    <item msgid="172978079776521897">"എല്ലാ ലോഗ് ബഫറുകളും"</item>
+    <item msgid="3873873912383879240">"റേഡിയോ ലോഗ് ബഫറുകൾ ഒഴികെയുള്ള എല്ലാം"</item>
+    <item msgid="8489661142527693381">"കേർനൽ ലോഗ് ബഫർ മാത്രം"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"ആനിമേഷൻ ഓഫുചെയ്യുക"</item>
     <item msgid="6624864048416710414">"ആനിമേഷൻ സ്‌കെയിൽ .5x"</item>
diff --git a/packages/SettingsLib/res/values-mn-rMN/arrays.xml b/packages/SettingsLib/res/values-mn-rMN/arrays.xml
index f470ca8..e812043 100644
--- a/packages/SettingsLib/res/values-mn-rMN/arrays.xml
+++ b/packages/SettingsLib/res/values-mn-rMN/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"лог буфер бүрт 4M"</item>
     <item msgid="5431354956856655120">"лог буфер бүрт 16M"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Идэвхгүй"</item>
+    <item msgid="3054662377365844197">"Бүгд"</item>
+    <item msgid="688870735111627832">"Радиогоос бусад бүх"</item>
+    <item msgid="2850427388488887328">"зөвхөн төвд"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Идэвхгүй"</item>
+    <item msgid="172978079776521897">"Бүх логийн хамгаалалт"</item>
+    <item msgid="3873873912383879240">"Радиогоос бусад бүх логийн хамгаалалт"</item>
+    <item msgid="8489661142527693381">"зөвхөн үйлдлийн системийн төв логийн хамгаалалтад"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Дүрс амилуулалт идэвхгүй"</item>
     <item msgid="6624864048416710414">"Дүрс амилуулах далайц .5x"</item>
diff --git a/packages/SettingsLib/res/values-mr-rIN/arrays.xml b/packages/SettingsLib/res/values-mr-rIN/arrays.xml
index 765f650..5de2f49 100644
--- a/packages/SettingsLib/res/values-mr-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-mr-rIN/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"प्रति लॉग बफर 4M"</item>
     <item msgid="5431354956856655120">"प्रति लॉग बफर 16M"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"बंद"</item>
+    <item msgid="3054662377365844197">"सर्व"</item>
+    <item msgid="688870735111627832">"सर्व परंतु रेडिओ"</item>
+    <item msgid="2850427388488887328">"फक्त कर्नेल"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"बंद"</item>
+    <item msgid="172978079776521897">"सर्व लॉग बफर"</item>
+    <item msgid="3873873912383879240">"सर्व परंतु रेडिओ लॉग बफर"</item>
+    <item msgid="8489661142527693381">"फक्त कर्नेल लॉग बफर"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"अॅनिमेशन बंद"</item>
     <item msgid="6624864048416710414">"अॅनिमेशन स्केल .5x"</item>
diff --git a/packages/SettingsLib/res/values-ms-rMY/arrays.xml b/packages/SettingsLib/res/values-ms-rMY/arrays.xml
index 2e31792..d6ea50c 100644
--- a/packages/SettingsLib/res/values-ms-rMY/arrays.xml
+++ b/packages/SettingsLib/res/values-ms-rMY/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4M per penimbal log"</item>
     <item msgid="5431354956856655120">"16M per penimbal log"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Mati"</item>
+    <item msgid="3054662377365844197">"Semua"</item>
+    <item msgid="688870735111627832">"Sma kcli radio"</item>
+    <item msgid="2850427388488887328">"inti sahaja"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Mati"</item>
+    <item msgid="172978079776521897">"Semua penimbal log"</item>
+    <item msgid="3873873912383879240">"Semua kecuali penimbal log radio"</item>
+    <item msgid="8489661142527693381">"penimbal log inti sahaja"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animasi dimatikan"</item>
     <item msgid="6624864048416710414">"Skala animasi .5x"</item>
diff --git a/packages/SettingsLib/res/values-my-rMM/arrays.xml b/packages/SettingsLib/res/values-my-rMM/arrays.xml
index 41a59ff..7ba8e94 100644
--- a/packages/SettingsLib/res/values-my-rMM/arrays.xml
+++ b/packages/SettingsLib/res/values-my-rMM/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"မှတ်တမ်းယာယီကြားခံနယ်တစ်ခုလျှင် 4M"</item>
     <item msgid="5431354956856655120">"မှတ်တမ်းယာယီကြားခံနယ်တစ်ခုလျှင် 16M"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"ပိတ်ပါ"</item>
+    <item msgid="3054662377365844197">"အားလုံး"</item>
+    <item msgid="688870735111627832">"ရေဒီယိုမှလွဲ၍ အားလုံး"</item>
+    <item msgid="2850427388488887328">"ကာနယ်သာ"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"ပိတ်ပါ"</item>
+    <item msgid="172978079776521897">"မှတ်တမ်းသိမ်းဆည်းရန် လျာထားချက်များ အားလုံး"</item>
+    <item msgid="3873873912383879240">"ရေဒီယို မှတ်တမ်းသိမ်းဆည်းရန်လျာထားချက်မှလွဲ၍ အားလုံး"</item>
+    <item msgid="8489661142527693381">"ကာနယ်မှတ်တမ်းသိမ်းဆည်းရန် လျာထားချက်သာ"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"လှုပ်ရှားသက်ဝင်မှုပုံများကိုပိတ်ပါ"</item>
     <item msgid="6624864048416710414">"လှုပ်ရှားသက်ဝင်မှုပုံ စကေး ၅ဆ"</item>
diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml
index 7c33b14..bc4ff27 100644
--- a/packages/SettingsLib/res/values-nb/arrays.xml
+++ b/packages/SettingsLib/res/values-nb/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4M per loggbuffer"</item>
     <item msgid="5431354956856655120">"16M per loggbuffer"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Av"</item>
+    <item msgid="3054662377365844197">"Alle"</item>
+    <item msgid="688870735111627832">"Unntatt radio"</item>
+    <item msgid="2850427388488887328">"bare kjerne"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Av"</item>
+    <item msgid="172978079776521897">"Alle loggbuffere"</item>
+    <item msgid="3873873912383879240">"Alle unntatt radiologgbuffere"</item>
+    <item msgid="8489661142527693381">"bare kjerneloggbuffer"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animasjon av"</item>
     <item msgid="6624864048416710414">"Animasjonsskala 0,5 x"</item>
diff --git a/packages/SettingsLib/res/values-ne-rNP/arrays.xml b/packages/SettingsLib/res/values-ne-rNP/arrays.xml
index eb63951..2063f17 100644
--- a/packages/SettingsLib/res/values-ne-rNP/arrays.xml
+++ b/packages/SettingsLib/res/values-ne-rNP/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"४एम प्रति लग बफर"</item>
     <item msgid="5431354956856655120">"१६एम प्रति लग बफर"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"निष्क्रिय"</item>
+    <item msgid="3054662377365844197">"सबै"</item>
+    <item msgid="688870735111627832">"रेडियो बाहेक सबै"</item>
+    <item msgid="2850427388488887328">"कर्नेल मात्र"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"निष्क्रिय"</item>
+    <item msgid="172978079776521897">"सबै लग सम्बन्धी बफरहरू"</item>
+    <item msgid="3873873912383879240">"रेडियो सम्बन्धी लगका बफरहरू बाहेक सबै"</item>
+    <item msgid="8489661142527693381">"कर्नेलको लग सम्बन्धी बफर मात्र"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"सजीविकरण बन्द"</item>
     <item msgid="6624864048416710414">"सजीविकरण मापन .5x"</item>
diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml
index 504b3d8..4cdd4fa 100644
--- a/packages/SettingsLib/res/values-nl/arrays.xml
+++ b/packages/SettingsLib/res/values-nl/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M per logbuffer"</item>
     <item msgid="5431354956856655120">"16 M per logbuffer"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Uit"</item>
+    <item msgid="3054662377365844197">"Alle"</item>
+    <item msgid="688870735111627832">"Alle beh. keuzerondje"</item>
+    <item msgid="2850427388488887328">"alleen kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Uit"</item>
+    <item msgid="172978079776521897">"Alle logboekbuffers"</item>
+    <item msgid="3873873912383879240">"Alle logboekbuffers behalve voor keuzerondjes"</item>
+    <item msgid="8489661142527693381">"alleen kernel-logbuffer"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animatie uit"</item>
     <item msgid="6624864048416710414">"Animatieschaal 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-pa-rIN/arrays.xml b/packages/SettingsLib/res/values-pa-rIN/arrays.xml
index 2f6dd7a..d0a26c8 100644
--- a/packages/SettingsLib/res/values-pa-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-pa-rIN/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4M ਪ੍ਰਤੀ ਲੌਗ ਬਫਰ"</item>
     <item msgid="5431354956856655120">"16M ਪ੍ਰਤੀ ਲੌਗ ਬਫਰ"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"ਬੰਦ"</item>
+    <item msgid="3054662377365844197">"ਸਭ"</item>
+    <item msgid="688870735111627832">"ਸਭ ਪਰ ਰੇਡੀਓ"</item>
+    <item msgid="2850427388488887328">"ਸਿਰਫ਼ ਕਰਨਲ"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"ਬੰਦ"</item>
+    <item msgid="172978079776521897">"ਸਭ ਲੌਗ ਬਫ਼ਰ"</item>
+    <item msgid="3873873912383879240">"ਸਭ ਪਰ ਰੇਡੀਓ ਲੌਗ ਬਫ਼ਰ"</item>
+    <item msgid="8489661142527693381">"ਸਿਰਫ਼ ਕਰਨਲ ਲੌਗ ਬਫ਼ਰ"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"ਐਨੀਮੇਸ਼ਨ ਬੰਦ"</item>
     <item msgid="6624864048416710414">"ਐਨੀਮੇਸ਼ਨ ਸਕੇਲ .5x"</item>
diff --git a/packages/SettingsLib/res/values-pl/arrays.xml b/packages/SettingsLib/res/values-pl/arrays.xml
index 8786a3e..ff36e42 100644
--- a/packages/SettingsLib/res/values-pl/arrays.xml
+++ b/packages/SettingsLib/res/values-pl/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 MB/bufor dziennika"</item>
     <item msgid="5431354956856655120">"16 MB/bufor dziennika"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Wyłączone"</item>
+    <item msgid="3054662377365844197">"Wszystkie"</item>
+    <item msgid="688870735111627832">"Bez radiowych"</item>
+    <item msgid="2850427388488887328">"tylko jądro"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Wyłączone"</item>
+    <item msgid="172978079776521897">"Wszystkie bufory dziennika"</item>
+    <item msgid="3873873912383879240">"Wszystkie oprócz buforów dzienników radiowych"</item>
+    <item msgid="8489661142527693381">"tylko bufor dziennika jądra"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animacja wyłączona"</item>
     <item msgid="6624864048416710414">"Skala animacji 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-pt-rBR/arrays.xml b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
index 1e79c30..90f061c 100644
--- a/packages/SettingsLib/res/values-pt-rBR/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M/buffer de log"</item>
     <item msgid="5431354956856655120">"16 M/buffer de log"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Desativado"</item>
+    <item msgid="3054662377365844197">"Todos"</item>
+    <item msgid="688870735111627832">"Todos, exceto o rádio"</item>
+    <item msgid="2850427388488887328">"somente kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Desativado"</item>
+    <item msgid="172978079776521897">"Todos os buffers de registro"</item>
+    <item msgid="3873873912383879240">"Todos, exceto os buffers de registro de rádio"</item>
+    <item msgid="8489661142527693381">"somente buffer de registro de kernel"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animação desligada"</item>
     <item msgid="6624864048416710414">"Escala da animação 0,5 x"</item>
diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
index b67d661..2c8b835 100644
--- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M por buffer de registo"</item>
     <item msgid="5431354956856655120">"16 M por buffer de registo"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Desativado"</item>
+    <item msgid="3054662377365844197">"Todos"</item>
+    <item msgid="688870735111627832">"Td, exc. rádio"</item>
+    <item msgid="2850427388488887328">"apenas kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Desativado"</item>
+    <item msgid="172978079776521897">"Todos os buffers de registo"</item>
+    <item msgid="3873873912383879240">"Todos, exceto os buffers de registo de rádio"</item>
+    <item msgid="8489661142527693381">"apenas buffer do registo do kernel"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animação desativada"</item>
     <item msgid="6624864048416710414">"Escala de animação 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-pt/arrays.xml b/packages/SettingsLib/res/values-pt/arrays.xml
index 1e79c30..90f061c 100644
--- a/packages/SettingsLib/res/values-pt/arrays.xml
+++ b/packages/SettingsLib/res/values-pt/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M/buffer de log"</item>
     <item msgid="5431354956856655120">"16 M/buffer de log"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Desativado"</item>
+    <item msgid="3054662377365844197">"Todos"</item>
+    <item msgid="688870735111627832">"Todos, exceto o rádio"</item>
+    <item msgid="2850427388488887328">"somente kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Desativado"</item>
+    <item msgid="172978079776521897">"Todos os buffers de registro"</item>
+    <item msgid="3873873912383879240">"Todos, exceto os buffers de registro de rádio"</item>
+    <item msgid="8489661142527693381">"somente buffer de registro de kernel"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animação desligada"</item>
     <item msgid="6624864048416710414">"Escala da animação 0,5 x"</item>
diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml
index 8c32593..d5574dd 100644
--- a/packages/SettingsLib/res/values-ro/arrays.xml
+++ b/packages/SettingsLib/res/values-ro/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 MB/zonă-tampon de înregistrări în jurnal"</item>
     <item msgid="5431354956856655120">"16 MB/zonă-tampon de înregistrări în jurnal"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Dezactivată"</item>
+    <item msgid="3054662377365844197">"Toate"</item>
+    <item msgid="688870735111627832">"Toate, fără radio"</item>
+    <item msgid="2850427388488887328">"numai nucleul"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Dezactivată"</item>
+    <item msgid="172978079776521897">"Toate zonele-tampon pentru jurnale"</item>
+    <item msgid="3873873912383879240">"Toate zonele-tampon pentru jurnale fără cele radio"</item>
+    <item msgid="8489661142527693381">"numai zona-tampon pentru jurnalul nucleului"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animație dezactivată"</item>
     <item msgid="6624864048416710414">"Animație la scara 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-ru/arrays.xml b/packages/SettingsLib/res/values-ru/arrays.xml
index 7d0dd6c..2fff9dd 100644
--- a/packages/SettingsLib/res/values-ru/arrays.xml
+++ b/packages/SettingsLib/res/values-ru/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"Буфер: макс. 4 МБ"</item>
     <item msgid="5431354956856655120">"Буфер: макс. 16 МБ"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Отключено"</item>
+    <item msgid="3054662377365844197">"Все"</item>
+    <item msgid="688870735111627832">"Все, кроме системных"</item>
+    <item msgid="2850427388488887328">"только ядро"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Отключено"</item>
+    <item msgid="172978079776521897">"Все буферы журналов"</item>
+    <item msgid="3873873912383879240">"Все, кроме буферов системного журнала"</item>
+    <item msgid="8489661142527693381">"только буфер журнала ядра"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Без анимации"</item>
     <item msgid="6624864048416710414">"Анимация 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-si-rLK/arrays.xml b/packages/SettingsLib/res/values-si-rLK/arrays.xml
index c4a6550..518a330 100644
--- a/packages/SettingsLib/res/values-si-rLK/arrays.xml
+++ b/packages/SettingsLib/res/values-si-rLK/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"ලොග අන්තරාවකට 4M"</item>
     <item msgid="5431354956856655120">"ලොග අන්තරාවකට 16M"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"ක්‍රියාවිරහිතය"</item>
+    <item msgid="3054662377365844197">"සියලු"</item>
+    <item msgid="688870735111627832">"සැම වුවද රේඩි."</item>
+    <item msgid="2850427388488887328">"කර්නල පමණි"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"ක්‍රියාවිරහිතයි"</item>
+    <item msgid="172978079776521897">"සියලු ලොග අන්තරාචය"</item>
+    <item msgid="3873873912383879240">"සියලු නමුත් රේඩියෝ ලොග අන්තරාචය"</item>
+    <item msgid="8489661142527693381">"කර්නල ලොග් අන්තරාචය පමණි"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"සජිවිකරණය අක්‍රිය කිරීම"</item>
     <item msgid="6624864048416710414">"සජීවීකරණ පරිමාණය .5x"</item>
diff --git a/packages/SettingsLib/res/values-sk/arrays.xml b/packages/SettingsLib/res/values-sk/arrays.xml
index 3e9ced6..2848040 100644
--- a/packages/SettingsLib/res/values-sk/arrays.xml
+++ b/packages/SettingsLib/res/values-sk/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 MB na vyrov. pamäť denníka"</item>
     <item msgid="5431354956856655120">"16 MB na vyrov. pamäť denníka"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Vypnuté"</item>
+    <item msgid="3054662377365844197">"Všetko"</item>
+    <item msgid="688870735111627832">"Okrem rádia"</item>
+    <item msgid="2850427388488887328">"iba jadro"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Vypnuté"</item>
+    <item msgid="172978079776521897">"Všetky vyrovnávacie pamäte denníka"</item>
+    <item msgid="3873873912383879240">"Všetky vyrovnávacie pamäte denníka (okrem rádia)"</item>
+    <item msgid="8489661142527693381">"iba vyrovnávacia pamäť denníka jadra"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animácia je vypnutá"</item>
     <item msgid="6624864048416710414">"Mierka animácie 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-sl/arrays.xml b/packages/SettingsLib/res/values-sl/arrays.xml
index 705f6e6..baa16ac 100644
--- a/packages/SettingsLib/res/values-sl/arrays.xml
+++ b/packages/SettingsLib/res/values-sl/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M/medpomnilnik dnevnika"</item>
     <item msgid="5431354956856655120">"16 M/medpomnilnik dnevnika"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Izklopljeno"</item>
+    <item msgid="3054662377365844197">"Vse"</item>
+    <item msgid="688870735111627832">"Vse (brez rad.)"</item>
+    <item msgid="2850427388488887328">"samo jedro"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Izklopljeno"</item>
+    <item msgid="172978079776521897">"Vsi medpomnilniki dnevnika"</item>
+    <item msgid="3873873912383879240">"Vsi medpomnilniki dnevnika, razen za radio"</item>
+    <item msgid="8489661142527693381">"samo medpomnilnik dnevnika jedra"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animacija je izključena"</item>
     <item msgid="6624864048416710414">"Merilo animacije: 0,5 x"</item>
diff --git a/packages/SettingsLib/res/values-sq-rAL/arrays.xml b/packages/SettingsLib/res/values-sq-rAL/arrays.xml
index 07b92557..c40ad83 100644
--- a/packages/SettingsLib/res/values-sq-rAL/arrays.xml
+++ b/packages/SettingsLib/res/values-sq-rAL/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 milionë/memorie regjistrimi"</item>
     <item msgid="5431354956856655120">"16 milionë/memorie regjistrimi"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Joaktive"</item>
+    <item msgid="3054662377365844197">"Të gjitha"</item>
+    <item msgid="688870735111627832">"Të gjitha përveç atyre radio"</item>
+    <item msgid="2850427388488887328">"vetëm bërthama"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Joaktive"</item>
+    <item msgid="172978079776521897">"Të gjitha memoriet e regjistrit"</item>
+    <item msgid="3873873912383879240">"Të gjitha memoriet e regjistrit, përveç atyre radio"</item>
+    <item msgid="8489661142527693381">"vetëm memoria e regjistrimit të bërthamës"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animacioni është i çaktivizuar"</item>
     <item msgid="6624864048416710414">"Shkalla e animacionit 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-sr/arrays.xml b/packages/SettingsLib/res/values-sr/arrays.xml
index 4a8f843..1817558 100644
--- a/packages/SettingsLib/res/values-sr/arrays.xml
+++ b/packages/SettingsLib/res/values-sr/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 MB по међумеморији евиденције"</item>
     <item msgid="5431354956856655120">"16 MB по међумеморији евиденције"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Искључено"</item>
+    <item msgid="3054662377365844197">"Све"</item>
+    <item msgid="688870735111627832">"Све сeм радија"</item>
+    <item msgid="2850427388488887328">"само језгро"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Искључено"</item>
+    <item msgid="172978079776521897">"Све међумеморије евиденција"</item>
+    <item msgid="3873873912383879240">"Све осим међумеморија евиденција за радио"</item>
+    <item msgid="8489661142527693381">"само међумеморија евиденције језгра"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Анимација је искључена"</item>
     <item msgid="6624864048416710414">"Размера анимације 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml
index e5476f4..9ecedca 100644
--- a/packages/SettingsLib/res/values-sv/arrays.xml
+++ b/packages/SettingsLib/res/values-sv/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 MB/loggbuffert"</item>
     <item msgid="5431354956856655120">"16 MB/loggbuffert"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Av"</item>
+    <item msgid="3054662377365844197">"Alla"</item>
+    <item msgid="688870735111627832">"Alla utom radio"</item>
+    <item msgid="2850427388488887328">"endast kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Av"</item>
+    <item msgid="172978079776521897">"Alla loggbuffertar"</item>
+    <item msgid="3873873912383879240">"Alla loggbuffertar utom för radio"</item>
+    <item msgid="8489661142527693381">"endast buffert av kernellogg"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animering avstängd"</item>
     <item msgid="6624864048416710414">"Animering i skala 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml
index e41c8c6..e2fbfc3 100644
--- a/packages/SettingsLib/res/values-sw/arrays.xml
+++ b/packages/SettingsLib/res/values-sw/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"M4 kwa kila akiba ya kumbukumbu"</item>
     <item msgid="5431354956856655120">"M16 kwa kila akiba ya kumbukumbu"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Yamezimwa"</item>
+    <item msgid="3054662377365844197">"Zote"</item>
+    <item msgid="688870735111627832">"Zote isipokuwa redio"</item>
+    <item msgid="2850427388488887328">"keneli pekee"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Imezimwa"</item>
+    <item msgid="172978079776521897">"Akiba ya kumbukumbu zote"</item>
+    <item msgid="3873873912383879240">"Zote isipokuwa akiba ya kumbukumbu za redio"</item>
+    <item msgid="8489661142527693381">"akiba ya kumbukumbu ya keneli pekee"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Haiwani imezimwa"</item>
     <item msgid="6624864048416710414">"Skeli .5x ya haiwani"</item>
diff --git a/packages/SettingsLib/res/values-ta-rIN/arrays.xml b/packages/SettingsLib/res/values-ta-rIN/arrays.xml
index 4d28aa0..fed3cd1 100644
--- a/packages/SettingsLib/res/values-ta-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-ta-rIN/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4M / லாக் பஃபர்"</item>
     <item msgid="5431354956856655120">"16M / லாக் பஃபர்"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"முடக்கத்தில்"</item>
+    <item msgid="3054662377365844197">"எல்லாம்"</item>
+    <item msgid="688870735111627832">"எல்லாம் (ரேடியோ தவிர்த்து)"</item>
+    <item msgid="2850427388488887328">"கெர்னல் மட்டும்"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"முடக்கத்தில்"</item>
+    <item msgid="172978079776521897">"தற்காலிகமாகச் சேமித்த எல்லா பதிவுகளும்"</item>
+    <item msgid="3873873912383879240">"எல்லாம் (தற்காலிகமாகச் சேமித்த ரேடியோ பதிவுகள் தவிர்த்து)"</item>
+    <item msgid="8489661142527693381">"கெர்னல் லாக் பஃபர் மட்டும்"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"அனிமேஷனை முடக்கு"</item>
     <item msgid="6624864048416710414">"அனிமேஷன் அளவு .5x"</item>
diff --git a/packages/SettingsLib/res/values-te-rIN/arrays.xml b/packages/SettingsLib/res/values-te-rIN/arrays.xml
index 106f194..482a1da 100644
--- a/packages/SettingsLib/res/values-te-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-te-rIN/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"లాగ్ బఫర్‌కి 4M"</item>
     <item msgid="5431354956856655120">"లాగ్ బఫర్‌కి 16M"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"ఆఫ్ చేయి"</item>
+    <item msgid="3054662377365844197">"అన్నీ"</item>
+    <item msgid="688870735111627832">"అన్నీ కానీ రేడియో"</item>
+    <item msgid="2850427388488887328">"కెర్నెల్ మాత్రమే"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"ఆఫ్ చేయి"</item>
+    <item msgid="172978079776521897">"అన్ని లాగ్ బఫర్‌లు"</item>
+    <item msgid="3873873912383879240">"అన్నీ కానీ రేడియో లాగ్ బఫర్‌లు"</item>
+    <item msgid="8489661142527693381">"కెర్నెల్ లాగ్ బఫర్ మాత్రమే"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"యానిమేషన్ ఆఫ్‌లో ఉంది"</item>
     <item msgid="6624864048416710414">"యానిమేషన్ ప్రమాణం .5x"</item>
diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml
index 5e03cc3..08caeb6 100644
--- a/packages/SettingsLib/res/values-th/arrays.xml
+++ b/packages/SettingsLib/res/values-th/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4 M ต่อบัฟเฟอร์ไฟล์บันทึก"</item>
     <item msgid="5431354956856655120">"16 M ต่อบัฟเฟอร์ไฟล์บันทึก"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"ปิด"</item>
+    <item msgid="3054662377365844197">"ทั้งหมด"</item>
+    <item msgid="688870735111627832">"ทั้งหมดเว้นวิทยุ"</item>
+    <item msgid="2850427388488887328">"เฉพาะเคอร์เนล"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"ปิด"</item>
+    <item msgid="172978079776521897">"บัฟเฟอร์บันทึกทั้งหมด"</item>
+    <item msgid="3873873912383879240">"ทั้งหมดยกเว้นบัฟเฟอร์บันทึกวิทยุ"</item>
+    <item msgid="8489661142527693381">"เฉพาะบัฟเฟอร์ไฟล์บันทึกเคอร์เนล"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"ปิดภาพเคลื่อนไหว"</item>
     <item msgid="6624864048416710414">"ภาพเคลื่อนไหวขนาด 0.5 เท่า"</item>
diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml
index 9f99fd2..a1505dc 100644
--- a/packages/SettingsLib/res/values-tl/arrays.xml
+++ b/packages/SettingsLib/res/values-tl/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4M kada log buffer"</item>
     <item msgid="5431354956856655120">"16M kada log buffer"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Naka-off"</item>
+    <item msgid="3054662377365844197">"Lahat"</item>
+    <item msgid="688870735111627832">"Maliban sa radyo"</item>
+    <item msgid="2850427388488887328">"kernel lang"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Naka-off"</item>
+    <item msgid="172978079776521897">"Lahat ng buffer ng log"</item>
+    <item msgid="3873873912383879240">"Lahat maliban sa buffer ng log ng radyo"</item>
+    <item msgid="8489661142527693381">"kernel log buffer lang"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Naka-off ang animation"</item>
     <item msgid="6624864048416710414">"Scale ng animation .5x"</item>
diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml
index b0ffc39..c97e79c 100644
--- a/packages/SettingsLib/res/values-tr/arrays.xml
+++ b/packages/SettingsLib/res/values-tr/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"Günlük arabelleği başına 4 MB"</item>
     <item msgid="5431354956856655120">"Günlük arabelleği başına 16 MB"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Kapalı"</item>
+    <item msgid="3054662377365844197">"Tümü"</item>
+    <item msgid="688870735111627832">"Radyo hariç tümü"</item>
+    <item msgid="2850427388488887328">"yaln. çekirdek"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Kapalı"</item>
+    <item msgid="172978079776521897">"Günlük arabelleklerin tümü"</item>
+    <item msgid="3873873912383879240">"Radyo günlük arabellekleri hariç tümü"</item>
+    <item msgid="8489661142527693381">"yalnızca çekirdek günlük arabelleği"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animasyon kapalı"</item>
     <item msgid="6624864048416710414">"Animasyon ölçeği 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml
index 2032cb4..7b720f3 100644
--- a/packages/SettingsLib/res/values-uk/arrays.xml
+++ b/packages/SettingsLib/res/values-uk/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"Буфер журналу: 4 Мб"</item>
     <item msgid="5431354956856655120">"Буфер журналу: 16 Мб"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Вимкнено"</item>
+    <item msgid="3054662377365844197">"Усі"</item>
+    <item msgid="688870735111627832">"Усі, крім радіо"</item>
+    <item msgid="2850427388488887328">"лише ядро"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Вимкнено"</item>
+    <item msgid="172978079776521897">"Буфери всіх журналів"</item>
+    <item msgid="3873873912383879240">"Буфери всіх журналів, крім радіо"</item>
+    <item msgid="8489661142527693381">"лише буфер журналу ядра"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Анімацію вимкнено"</item>
     <item msgid="6624864048416710414">"Анімація 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-ur-rPK/arrays.xml b/packages/SettingsLib/res/values-ur-rPK/arrays.xml
index 1aebccd..4f081e5 100644
--- a/packages/SettingsLib/res/values-ur-rPK/arrays.xml
+++ b/packages/SettingsLib/res/values-ur-rPK/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"‏4M فی لاگ بفر"</item>
     <item msgid="5431354956856655120">"‏16M فی لاگ بفر"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"آف"</item>
+    <item msgid="3054662377365844197">"تمام"</item>
+    <item msgid="688870735111627832">"ریڈیو کے سوا تمام"</item>
+    <item msgid="2850427388488887328">"صرف کرنل"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"آف"</item>
+    <item msgid="172978079776521897">"تمام لاگ بفرز"</item>
+    <item msgid="3873873912383879240">"ریڈیو لاگ بفرز کے سوا تمام"</item>
+    <item msgid="8489661142527693381">"صرف کرنل لاگ بفر"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"اینیمیشن آف ہے"</item>
     <item msgid="6624864048416710414">"‏اینیمیشن اسکیل ‎.5x"</item>
diff --git a/packages/SettingsLib/res/values-uz-rUZ/arrays.xml b/packages/SettingsLib/res/values-uz-rUZ/arrays.xml
index fc3a549..f501242 100644
--- a/packages/SettingsLib/res/values-uz-rUZ/arrays.xml
+++ b/packages/SettingsLib/res/values-uz-rUZ/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"Bufer: maks. 4 MB"</item>
     <item msgid="5431354956856655120">"Bufer: maks. 16 MB"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"O‘chiq"</item>
+    <item msgid="3054662377365844197">"Hammasi"</item>
+    <item msgid="688870735111627832">"Radiodan boshqa hammasi"</item>
+    <item msgid="2850427388488887328">"faqat yadro"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"O‘chiq"</item>
+    <item msgid="172978079776521897">"Barcha jurnallar buferi"</item>
+    <item msgid="3873873912383879240">"Radio jurnallar buferidan tashqari hammasi"</item>
+    <item msgid="8489661142527693381">"faqat yadro jurnali buferi"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Animatsiya o‘chiq"</item>
     <item msgid="6624864048416710414">"Animatsiya (0,5x)"</item>
diff --git a/packages/SettingsLib/res/values-vi/arrays.xml b/packages/SettingsLib/res/values-vi/arrays.xml
index 95b24ef..237b4f4 100644
--- a/packages/SettingsLib/res/values-vi/arrays.xml
+++ b/packages/SettingsLib/res/values-vi/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4M/lần tải nhật ký"</item>
     <item msgid="5431354956856655120">"16M/lần tải nhật ký"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Tắt"</item>
+    <item msgid="3054662377365844197">"Tất cả"</item>
+    <item msgid="688870735111627832">"Tất cả trừ đài"</item>
+    <item msgid="2850427388488887328">"chỉ kernel"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Tắt"</item>
+    <item msgid="172978079776521897">"Tất cả lần tải nhật ký"</item>
+    <item msgid="3873873912383879240">"Tất cả trừ lần tải nhật ký qua đài"</item>
+    <item msgid="8489661142527693381">"chỉ vùng đệm nhật ký kernel"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Tắt hình động"</item>
     <item msgid="6624864048416710414">"Tỷ lệ hình động 0,5x"</item>
diff --git a/packages/SettingsLib/res/values-zh-rHK/arrays.xml b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
index 19853ef..fe65884 100644
--- a/packages/SettingsLib/res/values-zh-rHK/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"每個記錄緩衝區 4M"</item>
     <item msgid="5431354956856655120">"每個記錄緩衝區 16M"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"關閉"</item>
+    <item msgid="3054662377365844197">"全部"</item>
+    <item msgid="688870735111627832">"所有非無線電"</item>
+    <item msgid="2850427388488887328">"只限核心"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"關閉"</item>
+    <item msgid="172978079776521897">"所有記錄緩衝區"</item>
+    <item msgid="3873873912383879240">"所有非無線電記錄緩衝區"</item>
+    <item msgid="8489661142527693381">"只限核心記錄緩衝區"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"關閉動畫"</item>
     <item msgid="6624864048416710414">"動畫比例 .5x"</item>
diff --git a/packages/SettingsLib/res/values-zh-rTW/arrays.xml b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
index 443a512..0939e93 100644
--- a/packages/SettingsLib/res/values-zh-rTW/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"每個紀錄緩衝區 4M"</item>
     <item msgid="5431354956856655120">"每個紀錄緩衝區 16M"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"關閉"</item>
+    <item msgid="3054662377365844197">"全部"</item>
+    <item msgid="688870735111627832">"無線電以外"</item>
+    <item msgid="2850427388488887328">"僅限核心"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"關閉"</item>
+    <item msgid="172978079776521897">"所有紀錄緩衝區"</item>
+    <item msgid="3873873912383879240">"無線電紀錄緩衝區以外的所有紀錄緩衝區"</item>
+    <item msgid="8489661142527693381">"僅限核心紀錄緩衝區"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"關閉動畫"</item>
     <item msgid="6624864048416710414">"動畫比例 0.5x"</item>
diff --git a/packages/SettingsLib/res/values-zu/arrays.xml b/packages/SettingsLib/res/values-zu/arrays.xml
index c04c175..772dee8 100644
--- a/packages/SettingsLib/res/values-zu/arrays.xml
+++ b/packages/SettingsLib/res/values-zu/arrays.xml
@@ -80,8 +80,18 @@
     <item msgid="3606047780792894151">"4M ngebhafa yelogu ngayinye"</item>
     <item msgid="5431354956856655120">"16M ngebhafa yelogu ngayinye"</item>
   </string-array>
-    <!-- no translation found for select_logpersist_titles:3 (2850427388488887328) -->
-    <!-- no translation found for select_logpersist_summaries:3 (8489661142527693381) -->
+  <string-array name="select_logpersist_titles">
+    <item msgid="1744840221860799971">"Valiwe"</item>
+    <item msgid="3054662377365844197">"Konke"</item>
+    <item msgid="688870735111627832">"Konke ngaphandle kwerediyo"</item>
+    <item msgid="2850427388488887328">"i-kernel kuphela"</item>
+  </string-array>
+  <string-array name="select_logpersist_summaries">
+    <item msgid="2216470072500521830">"Valiwe"</item>
+    <item msgid="172978079776521897">"Onke amabhafa elogi"</item>
+    <item msgid="3873873912383879240">"Konke ngaphandle kwamabhafa elogi yerediyo"</item>
+    <item msgid="8489661142527693381">"ilogi ye-kernel kuphela"</item>
+  </string-array>
   <string-array name="window_animation_scale_entries">
     <item msgid="8134156599370824081">"Isithombe esinyakazayo sivliwe"</item>
     <item msgid="6624864048416710414">"Isilinganiso sesithombe esinyakazayo ngu-05x"</item>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
index b79ce80..bf48e5d 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
@@ -247,7 +247,6 @@
                 return Settings.Secure.getInt(mContext.getContentResolver(), name, 0) != 0;
             case Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES:
             case Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES:
-            case Settings.Secure.ACCESSIBILITY_DISPLAY_COLOR_MATRIX:
             case Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER:
             case Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE:
                 return !TextUtils.isEmpty(Settings.Secure.getString(
diff --git a/packages/SystemUI/res/drawable/ic_qs_night_display_off.xml b/packages/SystemUI/res/drawable/ic_qs_night_display_off.xml
new file mode 100644
index 0000000..778ccbc
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_night_display_off.xml
@@ -0,0 +1,27 @@
+<!--
+    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="64dp"
+    android:height="64dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:alpha="0.3">
+
+    <path
+        android:fillColor="#FFF"
+        android:pathData="M6,12c0,5.5,4.5,10,10,10c1,0,2-0.2,3-0.5c-4.1-1.3-7-5.1-7-9.5s2.9-8.3,7-9.5C18.1,2.2,17.1,2,16,2C10.5,2,6,6.5,6,12z" />
+
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_night_display_on.xml b/packages/SystemUI/res/drawable/ic_qs_night_display_on.xml
new file mode 100644
index 0000000..aaca663
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_night_display_on.xml
@@ -0,0 +1,26 @@
+<!--
+    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="64dp"
+    android:height="64dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:fillColor="#FFF"
+        android:pathData="M6,12c0,5.5,4.5,10,10,10c1,0,2-0.2,3-0.5c-4.1-1.3-7-5.1-7-9.5s2.9-8.3,7-9.5C18.1,2.2,17.1,2,16,2C10.5,2,6,6.5,6,12z" />
+
+</vector>
diff --git a/packages/SystemUI/res/layout/battery_detail.xml b/packages/SystemUI/res/layout/battery_detail.xml
index 1f24ab0..8abfcf6 100644
--- a/packages/SystemUI/res/layout/battery_detail.xml
+++ b/packages/SystemUI/res/layout/battery_detail.xml
@@ -25,7 +25,7 @@
         android:id="@+id/charge_and_estimation"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingStart="72dp"
+        android:paddingStart="16dp"
         android:textAppearance="?android:attr/textAppearanceSmall"
         android:textColor="?android:attr/colorAccent" />
 
diff --git a/packages/SystemUI/res/layout/qs_detail_header.xml b/packages/SystemUI/res/layout/qs_detail_header.xml
index 8352e30..f809c68 100644
--- a/packages/SystemUI/res/layout/qs_detail_header.xml
+++ b/packages/SystemUI/res/layout/qs_detail_header.xml
@@ -25,20 +25,9 @@
     android:background="@drawable/btn_borderless_rect"
     android:gravity="center">
 
-    <ImageView
-        android:id="@*android:id/up"
-        android:layout_width="@dimen/qs_detail_image_width"
-        android:layout_height="@dimen/qs_detail_image_height"
-        android:layout_marginEnd="@dimen/qs_detail_back_margin_end"
-        android:padding="@dimen/qs_detail_image_padding"
-        android:clickable="true"
-        android:background="?android:attr/selectableItemBackground"
-        android:contentDescription="@*android:string/action_bar_up_description"
-        android:src="?android:attr/homeAsUpIndicator" />
-
     <TextView
         android:id="@android:id/title"
-        android:paddingLeft="@dimen/qs_detail_header_text_padding"
+        android:paddingStart="@dimen/qs_detail_header_text_padding"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_weight="1"
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 76dfd81..5bd0e87 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -212,7 +212,7 @@
     <dimen name="qs_detail_empty_text_size">14sp</dimen>
     <dimen name="qs_detail_margin_top">28dp</dimen>
     <dimen name="qs_detail_back_margin_end">16dp</dimen>
-    <dimen name="qs_detail_header_text_padding">0dp</dimen>
+    <dimen name="qs_detail_header_text_padding">16dp</dimen>
     <dimen name="qs_data_usage_text_size">14sp</dimen>
     <dimen name="qs_data_usage_usage_text_size">36sp</dimen>
     <dimen name="qs_battery_padding">2dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 71816f7..1151ffd 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -750,6 +750,12 @@
     <string name="quick_settings_cellular_detail_data_warning"><xliff:g id="data_limit" example="2.0 GB">%s</xliff:g> warning</string>
     <!-- QuickSettings: Work mode [CHAR LIMIT=NONE] -->
     <string name="quick_settings_work_mode_label">Work mode</string>
+    <!-- QuickSettings: Label for the toggle to activate Night display (renamed "Night Light" with title caps). [CHAR LIMIT=20] -->
+    <string name="quick_settings_night_display_label">Night Light</string>
+    <!-- QuickSettings: Summary for the toggle to deactivate Night display when it's on (renamed "Night Light" with title caps). [CHAR LIMIT=NONE] -->
+    <string name="quick_settings_night_display_summary_on">Night Light on, tap to turn off</string>
+    <!-- QuickSettings: Label for the toggle to activate Night display when it's off (renamed "Night Light" with title caps). [CHAR LIMIT=NONE] -->
+    <string name="quick_settings_night_display_summary_off">Night Light off, tap to turn on</string>
 
     <!-- Recents: The empty recents string. [CHAR LIMIT=NONE] -->
     <string name="recents_empty_message">No recent items</string>
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
index 805e9d6..46e6b9b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
@@ -63,7 +63,6 @@
     private boolean mScanState;
     private boolean mClosingDetail;
     private boolean mFullyExpanded;
-    protected View mQsDetailHeaderBack;
     private BaseStatusBarHeader mHeader;
     private boolean mTriggeredExpand;
     private int mOpenX;
@@ -92,7 +91,6 @@
         mDetailDoneButton = (TextView) findViewById(android.R.id.button1);
 
         mQsDetailHeader = findViewById(R.id.qs_detail_header);
-        mQsDetailHeaderBack = mQsDetailHeader.findViewById(com.android.internal.R.id.up);
         mQsDetailHeaderTitle = (TextView) mQsDetailHeader.findViewById(android.R.id.title);
         mQsDetailHeaderSwitch = (Switch) mQsDetailHeader.findViewById(android.R.id.toggle);
         mQsDetailHeaderProgress = (ImageView) findViewById(R.id.qs_detail_header_progress);
@@ -109,7 +107,6 @@
                 mQsPanel.closeDetail();
             }
         };
-        mQsDetailHeaderBack.setOnClickListener(doneListener);
         mDetailDoneButton.setOnClickListener(doneListener);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
new file mode 100644
index 0000000..9a3549e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
@@ -0,0 +1,99 @@
+/*
+ * 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.qs.tiles;
+
+import android.content.Intent;
+import android.provider.Settings;
+import android.widget.Switch;
+
+import com.android.internal.app.NightDisplayController;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.MetricsProto.MetricsEvent;
+import com.android.systemui.R;
+import com.android.systemui.qs.QSTile;
+
+public class NightDisplayTile extends QSTile<QSTile.BooleanState>
+        implements NightDisplayController.Callback {
+
+    private final NightDisplayController mController;
+
+    public NightDisplayTile(Host host) {
+        super(host);
+        mController = new NightDisplayController(mContext);
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return NightDisplayController.isAvailable(mContext);
+    }
+
+    @Override
+    public BooleanState newTileState() {
+        return new BooleanState();
+    }
+
+    @Override
+    protected void handleClick() {
+        final boolean activated = !mState.value;
+        MetricsLogger.action(mContext, getMetricsCategory(), activated);
+        mController.setActivated(activated);
+    }
+
+    @Override
+    protected void handleUpdateState(BooleanState state, Object arg) {
+        final boolean isActivated = mController.isActivated();
+        state.value = isActivated;
+        state.label = mContext.getString(R.string.quick_settings_night_display_label);
+        state.icon = ResourceIcon.get(isActivated ? R.drawable.ic_qs_night_display_on
+                : R.drawable.ic_qs_night_display_off);
+        state.contentDescription = mContext.getString(isActivated
+                ? R.string.quick_settings_night_display_summary_on
+                : R.string.quick_settings_night_display_summary_off);
+        state.minimalAccessibilityClassName = state.expandedAccessibilityClassName
+                = Switch.class.getName();
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsEvent.QS_NIGHT_DISPLAY;
+    }
+
+    @Override
+    public Intent getLongClickIntent() {
+        return new Intent(Settings.ACTION_DISPLAY_SETTINGS);
+    }
+
+    @Override
+    protected void setListening(boolean listening) {
+        if (listening) {
+            mController.setListener(this);
+            refreshState();
+        } else {
+            mController.setListener(null);
+        }
+    }
+
+    @Override
+    public CharSequence getTileLabel() {
+        return mContext.getString(R.string.quick_settings_night_display_label);
+    }
+
+    @Override
+    public void onActivated(boolean activated) {
+        refreshState();
+    }
+}
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 ca7f905..15e235d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
@@ -52,6 +52,7 @@
 import com.android.systemui.qs.tiles.HotspotTile;
 import com.android.systemui.qs.tiles.IntentTile;
 import com.android.systemui.qs.tiles.LocationTile;
+import com.android.systemui.qs.tiles.NightDisplayTile;
 import com.android.systemui.qs.tiles.RotationLockTile;
 import com.android.systemui.qs.tiles.UserTile;
 import com.android.systemui.qs.tiles.WifiTile;
@@ -440,6 +441,7 @@
         else if (tileSpec.equals("user")) return new UserTile(this);
         else if (tileSpec.equals("battery")) return new BatteryTile(this);
         else if (tileSpec.equals("saver")) return new DataSaverTile(this);
+        else if (tileSpec.equals("night")) return new NightDisplayTile(this);
         // Intent tiles.
         else if (tileSpec.startsWith(IntentTile.PREFIX)) return IntentTile.create(this,tileSpec);
         else if (tileSpec.startsWith(CustomTile.PREFIX)) return CustomTile.create(this,tileSpec);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
index a035eee..a326806 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
@@ -357,11 +357,12 @@
 
     public void dump(PrintWriter pw) {
         int N = mStatusIcons.getChildCount();
-        pw.println("  system icons: " + N);
+        pw.println("  icon views: " + N);
         for (int i=0; i<N; i++) {
             StatusBarIconView ic = (StatusBarIconView) mStatusIcons.getChildAt(i);
             pw.println("    [" + i + "] icon=" + ic);
         }
+        super.dump(pw);
     }
 
     public void dispatchDemoCommand(String command, Bundle args) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java
index 97b31f2..6821879 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java
@@ -81,9 +81,9 @@
 
     public void dump(PrintWriter pw) {
         final int N = mSlots.size();
-        pw.println("Icon list:");
+        pw.println("  icon slots: " + N);
         for (int i=0; i<N; i++) {
-            pw.printf("  %2d: (%s) %s\n", i, mSlots.get(i), mIcons.get(i));
+            pw.printf("    %2d: (%s) %s\n", i, mSlots.get(i), mIcons.get(i));
         }
     }
 }
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 b4d0ffd..d4351bb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -2349,6 +2349,7 @@
         if (hasAddEvent) {
             // This child was just added lets remove all events.
             mHeadsUpChangeAnimations.removeAll(mTmpList);
+            ((ExpandableNotificationRow ) child).setHeadsupDisappearRunning(false);
         }
         mTmpList.clear();
         return hasAddEvent;
@@ -3099,6 +3100,16 @@
         requestChildrenUpdate();
         runAnimationFinishedRunnables();
         clearViewOverlays();
+        clearHeadsUpDisappearRunning();
+    }
+
+    private void clearHeadsUpDisappearRunning() {
+        for (int i = 0; i < getChildCount(); i++) {
+            View view = getChildAt(i);
+            if (view instanceof ExpandableNotificationRow) {
+                ((ExpandableNotificationRow) view).setHeadsupDisappearRunning(false);
+            }
+        }
     }
 
     private void clearViewOverlays() {
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerZenModePanel.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerZenModePanel.java
index cc0ffb0..1ea23bb 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerZenModePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerZenModePanel.java
@@ -54,7 +54,6 @@
         mHeaderSwitch = findViewById(R.id.tuner_zen_switch);
         mHeaderSwitch.setVisibility(View.VISIBLE);
         mHeaderSwitch.setOnClickListener(this);
-        mHeaderSwitch.findViewById(com.android.internal.R.id.up).setVisibility(View.GONE);
         ((TextView) mHeaderSwitch.findViewById(android.R.id.title)).setText(
                 R.string.quick_settings_dnd_label);
         mZenModePanel = (ZenModePanel) findViewById(R.id.zen_mode_panel);
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 05cd40a..cfb18b7 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -2188,6 +2188,12 @@
     // Settings launched from collapsed quick settings.
     ACTION_QS_COLLAPSED_SETTINGS_LAUNCH = 490;
 
+    // OPEN: QS Night mode tile shown
+    // ACTION: QS Night mode tile tapped
+    //   SUBTYPE: 0 is off, 1 is on
+    // CATEGORY: QUICK_SETTINGS
+    QS_NIGHT_DISPLAY = 491;
+
     // ---- End N-MR1 Constants, all N-MR1 constants go above this line ----
 
     // ------- Begin N Keyboard Shortcuts Helper -----
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 7a12289..ba426b3 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -1422,7 +1422,8 @@
         updateTouchExplorationLocked(userState);
         updatePerformGesturesLocked(userState);
         updateEnhancedWebAccessibilityLocked(userState);
-        updateDisplayColorAdjustmentSettingsLocked(userState);
+        updateDisplayDaltonizerLocked(userState);
+        updateDisplayInversionLocked(userState);
         updateMagnificationLocked(userState);
         updateSoftKeyboardShowModeLocked(userState);
         scheduleUpdateInputFilter(userState);
@@ -1539,7 +1540,6 @@
         somethingChanged |= readEnhancedWebAccessibilityEnabledChangedLocked(userState);
         somethingChanged |= readDisplayMagnificationEnabledSettingLocked(userState);
         somethingChanged |= readAutoclickEnabledSettingLocked(userState);
-        somethingChanged |= readDisplayColorAdjustmentSettingsLocked(userState);
 
         return somethingChanged;
     }
@@ -1602,18 +1602,6 @@
          return false;
     }
 
-    private boolean readDisplayColorAdjustmentSettingsLocked(UserState userState) {
-        final boolean displayAdjustmentsEnabled = DisplayAdjustmentUtils.hasAdjustments(mContext,
-                userState.mUserId);
-        if (displayAdjustmentsEnabled != userState.mHasDisplayColorAdjustment) {
-            userState.mHasDisplayColorAdjustment = displayAdjustmentsEnabled;
-            return true;
-        }
-        // If display adjustment is enabled, always assume there was a change in
-        // the adjustment settings.
-        return displayAdjustmentsEnabled;
-    }
-
     private boolean readHighTextContrastEnabledSettingLocked(UserState userState) {
         final boolean highTextContrastEnabled = Settings.Secure.getIntForUser(
                 mContext.getContentResolver(),
@@ -1730,8 +1718,12 @@
         return false;
     }
 
-    private void updateDisplayColorAdjustmentSettingsLocked(UserState userState) {
-        DisplayAdjustmentUtils.applyAdjustments(mContext, userState.mUserId);
+    private void updateDisplayDaltonizerLocked(UserState userState) {
+        DisplayAdjustmentUtils.applyDaltonizerSetting(mContext, userState.mUserId);
+    }
+
+    private void updateDisplayInversionLocked(UserState userState) {
+        DisplayAdjustmentUtils.applyInversionSetting(mContext, userState.mUserId);
     }
 
     private void updateMagnificationLocked(UserState userState) {
@@ -4201,7 +4193,6 @@
         public boolean mIsAutoclickEnabled;
         public boolean mIsPerformGesturesEnabled;
         public boolean mIsFilterKeyEventsEnabled;
-        public boolean mHasDisplayColorAdjustment;
         public boolean mAccessibilityFocusOnlyInActiveWindow;
 
         private Service mUiAutomationService;
@@ -4317,9 +4308,6 @@
         private final Uri mDisplayDaltonizerUri = Settings.Secure.getUriFor(
                 Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER);
 
-        private final Uri mDisplayColorMatrixUri = Settings.Secure.getUriFor(
-                Settings.Secure.ACCESSIBILITY_DISPLAY_COLOR_MATRIX);
-
         private final Uri mHighTextContrastUri = Settings.Secure.getUriFor(
                 Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED);
 
@@ -4351,8 +4339,6 @@
             contentResolver.registerContentObserver(
                     mDisplayDaltonizerUri, false, this, UserHandle.USER_ALL);
             contentResolver.registerContentObserver(
-                    mDisplayColorMatrixUri, false, this, UserHandle.USER_ALL);
-            contentResolver.registerContentObserver(
                     mHighTextContrastUri, false, this, UserHandle.USER_ALL);
             contentResolver.registerContentObserver(
                     mAccessibilitySoftKeyboardModeUri, false, this, UserHandle.USER_ALL);
@@ -4394,14 +4380,11 @@
                     if (readEnhancedWebAccessibilityEnabledChangedLocked(userState)) {
                         onUserStateChangedLocked(userState);
                     }
-                } else if (mDisplayInversionEnabledUri.equals(uri)
-                        || mDisplayDaltonizerEnabledUri.equals(uri)
+                } else if (mDisplayDaltonizerEnabledUri.equals(uri)
                         || mDisplayDaltonizerUri.equals(uri)) {
-                    if (readDisplayColorAdjustmentSettingsLocked(userState)) {
-                        updateDisplayColorAdjustmentSettingsLocked(userState);
-                    }
-                } else if (mDisplayColorMatrixUri.equals(uri)) {
-                    updateDisplayColorAdjustmentSettingsLocked(userState);
+                    updateDisplayDaltonizerLocked(userState);
+                } else if (mDisplayInversionEnabledUri.equals(uri)) {
+                    updateDisplayInversionLocked(userState);
                 } else if (mHighTextContrastUri.equals(uri)) {
                     if (readHighTextContrastEnabledSettingLocked(userState)) {
                         onUserStateChangedLocked(userState);
diff --git a/services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java b/services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java
index e1f3cd8..1532946 100644
--- a/services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java
+++ b/services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java
@@ -18,23 +18,23 @@
 
 import android.content.ContentResolver;
 import android.content.Context;
-import android.opengl.Matrix;
-import android.os.IBinder;
-import android.os.Parcel;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.provider.Settings;
-import android.util.Slog;
+import android.provider.Settings.Secure;
 import android.view.accessibility.AccessibilityManager;
 
+import com.android.server.LocalServices;
+import com.android.server.display.DisplayTransformManager;
+
 /**
  * Utility methods for performing accessibility display adjustments.
  */
 class DisplayAdjustmentUtils {
-    private static final String LOG_TAG = DisplayAdjustmentUtils.class.getSimpleName();
+
+    /** Default inversion mode for display color correction. */
+    private static final int DEFAULT_DISPLAY_DALTONIZER =
+            AccessibilityManager.DALTONIZER_CORRECT_DEUTERANOMALY;
 
     /** Matrix and offset used for converting color to gray-scale. */
-    private static final float[] GRAYSCALE_MATRIX = new float[] {
+    private static final float[] MATRIX_GRAYSCALE = new float[] {
         .2126f, .2126f, .2126f, 0,
         .7152f, .7152f, .7152f, 0,
         .0722f, .0722f, .0722f, 0,
@@ -48,150 +48,44 @@
      * represents a non-multiplied addition, see surfaceflinger's ProgramCache
      * for full implementation details.
      */
-    private static final float[] INVERSION_MATRIX_VALUE_ONLY = new float[] {
+    private static final float[] MATRIX_INVERT_COLOR = new float[] {
         0.402f, -0.598f, -0.599f, 0,
        -1.174f, -0.174f, -1.175f, 0,
        -0.228f, -0.228f,  0.772f, 0,
              1,       1,       1, 1
     };
 
-    /** Default inversion mode for display color correction. */
-    private static final int DEFAULT_DISPLAY_DALTONIZER =
-            AccessibilityManager.DALTONIZER_CORRECT_DEUTERANOMALY;
-
-    /**
-     * Returns whether the specified user with has any display color
-     * adjustments.
-     */
-    public static boolean hasAdjustments(Context context, int userId) {
+    public static void applyDaltonizerSetting(Context context, int userId) {
         final ContentResolver cr = context.getContentResolver();
+        final DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class);
 
-        if (Settings.Secure.getIntForUser(cr,
-                Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) != 0) {
-            return true;
+        int daltonizerMode = AccessibilityManager.DALTONIZER_DISABLED;
+        if (Secure.getIntForUser(cr,
+                Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) != 0) {
+            daltonizerMode = Secure.getIntForUser(cr,
+                    Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, DEFAULT_DISPLAY_DALTONIZER, userId);
         }
 
-        if (Settings.Secure.getIntForUser(cr,
-                Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) != 0) {
-            return true;
+        float[] grayscaleMatrix = null;
+        if (daltonizerMode == AccessibilityManager.DALTONIZER_SIMULATE_MONOCHROMACY) {
+            // Monochromacy isn't supported by the native Daltonizer.
+            grayscaleMatrix = MATRIX_GRAYSCALE;
+            daltonizerMode = AccessibilityManager.DALTONIZER_DISABLED;
         }
-
-        return false;
+        dtm.setColorMatrix(DisplayTransformManager.LEVEL_COLOR_MATRIX_GRAYSCALE, grayscaleMatrix);
+        dtm.setDaltonizerMode(daltonizerMode);
     }
 
     /**
      * Applies the specified user's display color adjustments.
      */
-    public static void applyAdjustments(Context context, int userId) {
+    public static void applyInversionSetting(Context context, int userId) {
         final ContentResolver cr = context.getContentResolver();
-        float[] colorMatrix = null;
+        final DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class);
 
-        if (Settings.Secure.getIntForUser(cr,
-                Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) != 0) {
-            colorMatrix = multiply(colorMatrix, INVERSION_MATRIX_VALUE_ONLY);
-        }
-
-        if (Settings.Secure.getIntForUser(cr,
-                Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) != 0) {
-            final int daltonizerMode = Settings.Secure.getIntForUser(cr,
-                    Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, DEFAULT_DISPLAY_DALTONIZER,
-                    userId);
-            // Monochromacy isn't supported by the native Daltonizer.
-            if (daltonizerMode == AccessibilityManager.DALTONIZER_SIMULATE_MONOCHROMACY) {
-                colorMatrix = multiply(colorMatrix, GRAYSCALE_MATRIX);
-                setDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED);
-            } else {
-                setDaltonizerMode(daltonizerMode);
-            }
-        } else {
-            setDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED);
-        }
-
-        String matrix = Settings.Secure.getStringForUser(cr,
-                Settings.Secure.ACCESSIBILITY_DISPLAY_COLOR_MATRIX, userId);
-        if (matrix != null) {
-            final float[] userMatrix = get4x4Matrix(matrix);
-            if (userMatrix != null) {
-                colorMatrix = multiply(colorMatrix, userMatrix);
-            }
-        }
-
-        setColorTransform(colorMatrix);
+        final boolean invertColors = Secure.getIntForUser(cr,
+                Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) != 0;
+        dtm.setColorMatrix(DisplayTransformManager.LEVEL_COLOR_MATRIX_INVERT_COLOR,
+                invertColors ? MATRIX_INVERT_COLOR : null);
     }
-
-    private static float[] get4x4Matrix(String matrix) {
-        String[] strValues = matrix.split(",");
-        if (strValues.length != 16) {
-            return null;
-        }
-        float[] values = new float[strValues.length];
-        try {
-            for (int i = 0; i < values.length; i++) {
-                values[i] = Float.parseFloat(strValues[i]);
-            }
-        } catch (java.lang.NumberFormatException ex) {
-            return null;
-        }
-        return values;
-    }
-
-    private static float[] multiply(float[] matrix, float[] other) {
-        if (matrix == null) {
-            return other;
-        }
-        float[] result = new float[16];
-        Matrix.multiplyMM(result, 0, matrix, 0, other, 0);
-        return result;
-    }
-
-    /**
-     * Sets the surface flinger's Daltonization mode. This adjusts the color
-     * space to correct for or simulate various types of color blindness.
-     *
-     * @param mode new Daltonization mode
-     */
-    private static void setDaltonizerMode(int mode) {
-        try {
-            final IBinder flinger = ServiceManager.getService("SurfaceFlinger");
-            if (flinger != null) {
-                final Parcel data = Parcel.obtain();
-                data.writeInterfaceToken("android.ui.ISurfaceComposer");
-                data.writeInt(mode);
-                flinger.transact(1014, data, null, 0);
-                data.recycle();
-            }
-        } catch (RemoteException ex) {
-            Slog.e(LOG_TAG, "Failed to set Daltonizer mode", ex);
-        }
-    }
-
-    /**
-     * Sets the surface flinger's color transformation as a 4x4 matrix. If the
-     * matrix is null, color transformations are disabled.
-     *
-     * @param m the float array that holds the transformation matrix, or null to
-     *            disable transformation
-     */
-    private static void setColorTransform(float[] m) {
-        try {
-            final IBinder flinger = ServiceManager.getService("SurfaceFlinger");
-            if (flinger != null) {
-                final Parcel data = Parcel.obtain();
-                data.writeInterfaceToken("android.ui.ISurfaceComposer");
-                if (m != null) {
-                    data.writeInt(1);
-                    for (int i = 0; i < 16; i++) {
-                        data.writeFloat(m[i]);
-                    }
-                } else {
-                    data.writeInt(0);
-                }
-                flinger.transact(1015, data, null, 0);
-                data.recycle();
-            }
-        } catch (RemoteException ex) {
-            Slog.e(LOG_TAG, "Failed to set color transform", ex);
-        }
-    }
-
 }
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index 5b7f99c..7c12577d 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -1233,11 +1233,13 @@
             } finally {
                 db.endTransaction();
             }
-            sendAccountsChangedBroadcast(accounts.userId);
         }
         if (getUserManager().getUserInfo(accounts.userId).canHaveProfile()) {
             addAccountToLinkedRestrictedUsers(account, accounts.userId);
         }
+
+        // Only send LOGIN_ACCOUNTS_CHANGED when the database changed.
+        sendAccountsChangedBroadcast(accounts.userId);
         return true;
     }
 
@@ -1420,7 +1422,6 @@
         synchronized (accounts.cacheLock) {
             final SQLiteDatabase db = accounts.openHelper.getWritableDatabaseUserIsUnlocked();
             db.beginTransaction();
-            boolean isSuccessful = false;
             Account renamedAccount = new Account(newName, accountToRename.type);
             try {
                 final long accountId = getAccountIdLocked(db, accountToRename);
@@ -1433,54 +1434,51 @@
                     values.put(ACCOUNTS_PREVIOUS_NAME, accountToRename.name);
                     db.update(TABLE_ACCOUNTS, values, ACCOUNTS_ID + "=?", argsAccountId);
                     db.setTransactionSuccessful();
-                    isSuccessful = true;
                     logRecord(db, DebugDbHelper.ACTION_ACCOUNT_RENAME, TABLE_ACCOUNTS, accountId,
                             accounts);
                 }
             } finally {
                 db.endTransaction();
-                if (isSuccessful) {
-                    /*
-                     * Database transaction was successful. Clean up cached
-                     * data associated with the account in the user profile.
-                     */
-                    insertAccountIntoCacheLocked(accounts, renamedAccount);
-                    /*
-                     * Extract the data and token caches before removing the
-                     * old account to preserve the user data associated with
-                     * the account.
-                     */
-                    HashMap<String, String> tmpData = accounts.userDataCache.get(accountToRename);
-                    HashMap<String, String> tmpTokens = accounts.authTokenCache.get(accountToRename);
-                    removeAccountFromCacheLocked(accounts, accountToRename);
-                    /*
-                     * Update the cached data associated with the renamed
-                     * account.
-                     */
-                    accounts.userDataCache.put(renamedAccount, tmpData);
-                    accounts.authTokenCache.put(renamedAccount, tmpTokens);
-                    accounts.previousNameCache.put(
-                          renamedAccount,
-                          new AtomicReference<String>(accountToRename.name));
-                    resultAccount = renamedAccount;
+            }
+            /*
+             * Database transaction was successful. Clean up cached
+             * data associated with the account in the user profile.
+             */
+            insertAccountIntoCacheLocked(accounts, renamedAccount);
+            /*
+             * Extract the data and token caches before removing the
+             * old account to preserve the user data associated with
+             * the account.
+             */
+            HashMap<String, String> tmpData = accounts.userDataCache.get(accountToRename);
+            HashMap<String, String> tmpTokens = accounts.authTokenCache.get(accountToRename);
+            removeAccountFromCacheLocked(accounts, accountToRename);
+            /*
+             * Update the cached data associated with the renamed
+             * account.
+             */
+            accounts.userDataCache.put(renamedAccount, tmpData);
+            accounts.authTokenCache.put(renamedAccount, tmpTokens);
+            accounts.previousNameCache.put(
+                    renamedAccount,
+                    new AtomicReference<String>(accountToRename.name));
+            resultAccount = renamedAccount;
 
-                    int parentUserId = accounts.userId;
-                    if (canHaveProfile(parentUserId)) {
-                        /*
-                         * Owner or system user account was renamed, rename the account for
-                         * those users with which the account was shared.
-                         */
-                        List<UserInfo> users = getUserManager().getUsers(true);
-                        for (UserInfo user : users) {
-                            if (user.isRestricted()
-                                    && (user.restrictedProfileParentId == parentUserId)) {
-                                renameSharedAccountAsUser(accountToRename, newName, user.id);
-                            }
-                        }
+            int parentUserId = accounts.userId;
+            if (canHaveProfile(parentUserId)) {
+                /*
+                 * Owner or system user account was renamed, rename the account for
+                 * those users with which the account was shared.
+                 */
+                List<UserInfo> users = getUserManager().getUsers(true);
+                for (UserInfo user : users) {
+                    if (user.isRestricted()
+                            && (user.restrictedProfileParentId == parentUserId)) {
+                        renameSharedAccountAsUser(accountToRename, newName, user.id);
                     }
-                    sendAccountsChangedBroadcast(accounts.userId);
                 }
             }
+            sendAccountsChangedBroadcast(accounts.userId);
         }
         return resultAccount;
     }
@@ -1661,7 +1659,7 @@
     }
 
     private boolean removeAccountInternal(UserAccounts accounts, Account account, int callingUid) {
-        int deleted;
+        boolean isChanged = false;
         boolean userUnlocked = isLocalUnlockedUser(accounts.userId);
         if (!userUnlocked) {
             Slog.i(TAG, "Removing account " + account + " while user "+ accounts.userId
@@ -1671,25 +1669,38 @@
             final SQLiteDatabase db = userUnlocked
                     ? accounts.openHelper.getWritableDatabaseUserIsUnlocked()
                     : accounts.openHelper.getWritableDatabase();
-            final long accountId = getAccountIdLocked(db, account);
             db.beginTransaction();
+            // Set to a dummy value, this will only be used if the database
+            // transaction succeeds.
+            long accountId = -1;
             try {
-                deleted = db.delete(TABLE_ACCOUNTS, ACCOUNTS_NAME + "=? AND " + ACCOUNTS_TYPE
-                                + "=?", new String[]{account.name, account.type});
-                if (userUnlocked) {
-                    // Delete from CE table
-                    deleted = db.delete(CE_TABLE_ACCOUNTS, ACCOUNTS_NAME + "=? AND " + ACCOUNTS_TYPE
-                            + "=?", new String[]{account.name, account.type});
+                accountId = getAccountIdLocked(db, account);
+                if (accountId >= 0) {
+                    db.delete(
+                            TABLE_ACCOUNTS,
+                            ACCOUNTS_NAME + "=? AND " + ACCOUNTS_TYPE + "=?",
+                            new String[]{ account.name, account.type });
+                    if (userUnlocked) {
+                        // Delete from CE table
+                        db.delete(
+                                CE_TABLE_ACCOUNTS,
+                                ACCOUNTS_NAME + "=? AND " + ACCOUNTS_TYPE + "=?",
+                                new String[]{ account.name, account.type });
+                    }
+                    db.setTransactionSuccessful();
+                    isChanged = true;
                 }
-                db.setTransactionSuccessful();
             } finally {
                 db.endTransaction();
             }
-            removeAccountFromCacheLocked(accounts, account);
-            sendAccountsChangedBroadcast(accounts.userId);
-            String action = userUnlocked ? DebugDbHelper.ACTION_ACCOUNT_REMOVE
-                    : DebugDbHelper.ACTION_ACCOUNT_REMOVE_DE;
-            logRecord(db, action, TABLE_ACCOUNTS, accountId, accounts);
+            if (isChanged) {
+                removeAccountFromCacheLocked(accounts, account);
+                // Only broadcast LOGIN_ACCOUNTS_CHANGED if a change occured.
+                sendAccountsChangedBroadcast(accounts.userId);
+                String action = userUnlocked ? DebugDbHelper.ACTION_ACCOUNT_REMOVE
+                        : DebugDbHelper.ACTION_ACCOUNT_REMOVE_DE;
+                logRecord(db, action, TABLE_ACCOUNTS, accountId, accounts);
+            }
         }
         long id = Binder.clearCallingIdentity();
         try {
@@ -1706,7 +1717,7 @@
         } finally {
             Binder.restoreCallingIdentity(id);
         }
-        return (deleted > 0);
+        return isChanged;
     }
 
     @Override
@@ -1930,6 +1941,7 @@
         if (account == null) {
             return;
         }
+        boolean isChanged = false;
         synchronized (accounts.cacheLock) {
             final SQLiteDatabase db = accounts.openHelper.getWritableDatabaseUserIsUnlocked();
             db.beginTransaction();
@@ -1939,12 +1951,17 @@
                 final long accountId = getAccountIdLocked(db, account);
                 if (accountId >= 0) {
                     final String[] argsAccountId = {String.valueOf(accountId)};
-                    db.update(CE_TABLE_ACCOUNTS, values, ACCOUNTS_ID + "=?", argsAccountId);
-                    db.delete(CE_TABLE_AUTHTOKENS, AUTHTOKENS_ACCOUNTS_ID + "=?", argsAccountId);
+                    db.update(
+                            CE_TABLE_ACCOUNTS, values, ACCOUNTS_ID + "=?", argsAccountId);
+                    db.delete(
+                            CE_TABLE_AUTHTOKENS, AUTHTOKENS_ACCOUNTS_ID + "=?", argsAccountId);
                     accounts.authTokenCache.remove(account);
                     accounts.accountTokenCaches.remove(account);
                     db.setTransactionSuccessful();
-
+                    // If there is an account whose password will be updated and the database
+                    // transactions succeed, then we say that a change has occured. Even if the
+                    // new password is the same as the old and there were no authtokens to delete.
+                    isChanged = true;
                     String action = (password == null || password.length() == 0) ?
                             DebugDbHelper.ACTION_CLEAR_PASSWORD
                             : DebugDbHelper.ACTION_SET_PASSWORD;
@@ -1952,8 +1969,11 @@
                 }
             } finally {
                 db.endTransaction();
+                if (isChanged) {
+                    // Send LOGIN_ACCOUNTS_CHANGED only if the something changed.
+                    sendAccountsChangedBroadcast(accounts.userId);
+                }
             }
-            sendAccountsChangedBroadcast(accounts.userId);
         }
     }
 
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index ad09df8..9f12b7f 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -3074,7 +3074,7 @@
         final boolean nowVisible = allResumedActivitiesVisible();
         for (int activityNdx = mStoppingActivities.size() - 1; activityNdx >= 0; --activityNdx) {
             ActivityRecord s = mStoppingActivities.get(activityNdx);
-            final boolean waitingVisible = mWaitingVisibleActivities.contains(s);
+            boolean waitingVisible = mWaitingVisibleActivities.contains(s);
             if (DEBUG_STATES) Slog.v(TAG, "Stopping " + s + ": nowVisible=" + nowVisible
                     + " waitingVisible=" + waitingVisible + " finishing=" + s.finishing);
             if (waitingVisible && nowVisible) {
@@ -3087,6 +3087,7 @@
                     // hidden by the activities in front of it.
                     if (DEBUG_STATES) Slog.v(TAG, "Before stopping, can hide: " + s);
                     mWindowManager.setAppVisibility(s.appToken, false);
+                    waitingVisible = false;
                 }
             }
             if ((!waitingVisible || mService.isSleepingOrShuttingDownLocked()) && remove) {
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index 92b55db..12310e3 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -591,13 +591,13 @@
         synchronized (mPublicSync) {
             TetherState tetherState = mTetherStates.get(iface);
             if (tetherState == null) {
-                Log.e(TAG, "Tried to Tether an unknown iface :" + iface + ", ignoring");
+                Log.e(TAG, "Tried to Tether an unknown iface: " + iface + ", ignoring");
                 return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
             }
             // Ignore the error status of the interface.  If the interface is available,
             // the errors are referring to past tethering attempts anyway.
             if (tetherState.mLastState != IControlsTethering.STATE_AVAILABLE) {
-                Log.e(TAG, "Tried to Tether an unavailable iface :" + iface + ", ignoring");
+                Log.e(TAG, "Tried to Tether an unavailable iface: " + iface + ", ignoring");
                 return ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE;
             }
             tetherState.mStateMachine.sendMessage(TetherInterfaceStateMachine.CMD_TETHER_REQUESTED);
@@ -1018,15 +1018,29 @@
      */
     class UpstreamNetworkCallback extends NetworkCallback {
         @Override
+        public void onAvailable(Network network) {
+            mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
+                    UpstreamNetworkMonitor.EVENT_ON_AVAILABLE, 0, network);
+        }
+
+        @Override
+        public void onCapabilitiesChanged(Network network, NetworkCapabilities newNc) {
+            mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
+                    UpstreamNetworkMonitor.EVENT_ON_CAPABILITIES, 0,
+                    new NetworkState(null, null, newNc, network, null, null));
+        }
+
+        @Override
         public void onLinkPropertiesChanged(Network network, LinkProperties newLp) {
-            mTetherMasterSM.sendMessage(
-                    TetherMasterSM.EVENT_UPSTREAM_LINKPROPERTIES_CHANGED,
+            mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
+                    UpstreamNetworkMonitor.EVENT_ON_LINKPROPERTIES, 0,
                     new NetworkState(null, newLp, null, network, null, null));
         }
 
         @Override
         public void onLost(Network network) {
-            mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_LOST, network);
+            mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
+                    UpstreamNetworkMonitor.EVENT_ON_LOST, 0, network);
         }
     }
 
@@ -1045,6 +1059,11 @@
      * could/should be moved here.
      */
     class UpstreamNetworkMonitor {
+        static final int EVENT_ON_AVAILABLE      = 1;
+        static final int EVENT_ON_CAPABILITIES   = 2;
+        static final int EVENT_ON_LINKPROPERTIES = 3;
+        static final int EVENT_ON_LOST           = 4;
+
         final HashMap<Network, NetworkState> mNetworkMap = new HashMap<>();
         NetworkCallback mDefaultNetworkCallback;
         NetworkCallback mDunTetheringCallback;
@@ -1079,33 +1098,107 @@
             mNetworkMap.clear();
         }
 
-        // Returns true if these updated LinkProperties pertain to the current
-        // upstream network interface, false otherwise (or if there is not
-        // currently any upstream tethering interface).
-        boolean processLinkPropertiesChanged(NetworkState networkState) {
-            if (networkState == null ||
-                    networkState.network == null ||
-                    networkState.linkProperties == null) {
-                return false;
-            }
+        NetworkState lookup(Network network) {
+            return (network != null) ? mNetworkMap.get(network) : null;
+        }
 
-            mNetworkMap.put(networkState.network, networkState);
-
-            if (mCurrentUpstreamIface != null) {
-                for (String ifname : networkState.linkProperties.getAllInterfaceNames()) {
-                    if (mCurrentUpstreamIface.equals(ifname)) {
-                        return true;
+        NetworkState processCallback(int arg1, Object obj) {
+            switch (arg1) {
+                case EVENT_ON_AVAILABLE: {
+                    final Network network = (Network) obj;
+                    if (VDBG) {
+                        Log.d(TAG, "EVENT_ON_AVAILABLE for " + network);
                     }
+                    if (!mNetworkMap.containsKey(network)) {
+                        mNetworkMap.put(network,
+                                new NetworkState(null, null, null, network, null, null));
+                    }
+
+                    final ConnectivityManager cm = getConnectivityManager();
+
+                    if (mDefaultNetworkCallback != null) {
+                        cm.requestNetworkCapabilities(mDefaultNetworkCallback);
+                        cm.requestLinkProperties(mDefaultNetworkCallback);
+                    }
+
+                    // Requesting updates for mDunTetheringCallback is not
+                    // necessary. Because it's a listen, it will already have
+                    // heard all NetworkCapabilities and LinkProperties updates
+                    // since UpstreamNetworkMonitor was started. Because we
+                    // start UpstreamNetworkMonitor before chooseUpstreamType()
+                    // is ever invoked (it can register a DUN request) this is
+                    // mostly safe. However, if a DUN network is already up for
+                    // some reason (unlikely, because DUN is restricted and,
+                    // unless the DUN network is shared with another APN, only
+                    // the system can request it and this is the only part of
+                    // the system that requests it) we won't know its
+                    // LinkProperties or NetworkCapabilities.
+
+                    return mNetworkMap.get(network);
+                }
+                case EVENT_ON_CAPABILITIES: {
+                    final NetworkState ns = (NetworkState) obj;
+                    if (!mNetworkMap.containsKey(ns.network)) {
+                        // Ignore updates for networks for which we have not yet
+                        // received onAvailable() - which should never happen -
+                        // or for which we have already received onLost().
+                        return null;
+                    }
+                    if (VDBG) {
+                        Log.d(TAG, String.format("EVENT_ON_CAPABILITIES for %s: %s",
+                                ns.network, ns.networkCapabilities));
+                    }
+
+                    final NetworkState prev = mNetworkMap.get(ns.network);
+                    mNetworkMap.put(ns.network,
+                            new NetworkState(null, prev.linkProperties, ns.networkCapabilities,
+                                             ns.network, null, null));
+                    return mNetworkMap.get(ns.network);
+                }
+                case EVENT_ON_LINKPROPERTIES: {
+                    final NetworkState ns = (NetworkState) obj;
+                    if (!mNetworkMap.containsKey(ns.network)) {
+                        // Ignore updates for networks for which we have not yet
+                        // received onAvailable() - which should never happen -
+                        // or for which we have already received onLost().
+                        return null;
+                    }
+                    if (VDBG) {
+                        Log.d(TAG, String.format("EVENT_ON_LINKPROPERTIES for %s: %s",
+                                ns.network, ns.linkProperties));
+                    }
+
+                    final NetworkState prev = mNetworkMap.get(ns.network);
+                    mNetworkMap.put(ns.network,
+                            new NetworkState(null, ns.linkProperties, prev.networkCapabilities,
+                                             ns.network, null, null));
+                    return mNetworkMap.get(ns.network);
+                }
+                case EVENT_ON_LOST: {
+                    final Network network = (Network) obj;
+                    if (VDBG) {
+                        Log.d(TAG, "EVENT_ON_LOST for " + network);
+                    }
+                    return mNetworkMap.remove(network);
+                }
+                default:
+                    return null;
+            }
+        }
+    }
+
+    // Needed because the canonical source of upstream truth is just the
+    // upstream interface name, |mCurrentUpstreamIface|.  This is ripe for
+    // future simplification, once the upstream Network is canonical.
+    boolean pertainsToCurrentUpstream(NetworkState ns) {
+        if (ns != null && ns.linkProperties != null && mCurrentUpstreamIface != null) {
+            for (String ifname : ns.linkProperties.getAllInterfaceNames()) {
+                if (mCurrentUpstreamIface.equals(ifname)) {
+                    return true;
                 }
             }
-            return false;
         }
-
-        void processNetworkLost(Network network) {
-            if (network != null) {
-                mNetworkMap.remove(network);
-            }
-        }
+        return false;
     }
 
     class TetherMasterSM extends StateMachine {
@@ -1120,8 +1213,7 @@
         static final int CMD_RETRY_UPSTREAM                     = BASE_MASTER + 4;
         // Events from NetworkCallbacks that we process on the master state
         // machine thread on behalf of the UpstreamNetworkMonitor.
-        static final int EVENT_UPSTREAM_LINKPROPERTIES_CHANGED  = BASE_MASTER + 5;
-        static final int EVENT_UPSTREAM_LOST                    = BASE_MASTER + 6;
+        static final int EVENT_UPSTREAM_CALLBACK                = BASE_MASTER + 5;
 
         private State mInitialState;
         private State mTetherModeAliveState;
@@ -1278,6 +1370,7 @@
             }
 
             protected void chooseUpstreamType(boolean tryCell) {
+                final ConnectivityManager cm = getConnectivityManager();
                 int upType = ConnectivityManager.TYPE_NONE;
                 String iface = null;
 
@@ -1292,8 +1385,7 @@
                     }
 
                     for (Integer netType : mUpstreamIfaceTypes) {
-                        NetworkInfo info =
-                                getConnectivityManager().getNetworkInfo(netType.intValue());
+                        NetworkInfo info = cm.getNetworkInfo(netType.intValue());
                         if ((info != null) && info.isConnected()) {
                             upType = netType.intValue();
                             break;
@@ -1334,9 +1426,9 @@
                         break;
                 }
 
+                Network network = null;
                 if (upType != ConnectivityManager.TYPE_NONE) {
-                    LinkProperties linkProperties =
-                            getConnectivityManager().getLinkProperties(upType);
+                    LinkProperties linkProperties = cm.getLinkProperties(upType);
                     if (linkProperties != null) {
                         // Find the interface with the default IPv4 route. It may be the
                         // interface described by linkProperties, or one of the interfaces
@@ -1353,7 +1445,7 @@
                     }
 
                     if (iface != null) {
-                        Network network = getConnectivityManager().getNetworkForType(upType);
+                        network = cm.getNetworkForType(upType);
                         if (network == null) {
                             Log.e(TAG, "No Network for upstream type " + upType + "!");
                         }
@@ -1361,6 +1453,13 @@
                     }
                 }
                 notifyTetheredOfNewUpstreamIface(iface);
+                NetworkState ns = mUpstreamNetworkMonitor.lookup(network);
+                if (ns != null && pertainsToCurrentUpstream(ns)) {
+                    // If we already have NetworkState for this network examine
+                    // it immediately, because there likely will be no second
+                    // EVENT_ON_AVAILABLE (it was already received).
+                    handleNewUpstreamNetworkState(ns);
+                }
             }
 
             protected void setDnsForwarders(final Network network, final LinkProperties lp) {
@@ -1393,6 +1492,10 @@
                             ifaceName);
                 }
             }
+
+            protected void handleNewUpstreamNetworkState(NetworkState ns) {
+                mIPv6TetheringCoordinator.updateUpstreamNetworkState(ns);
+            }
         }
 
         private final AtomicInteger mSimBcastGenerationNumber = new AtomicInteger(0);
@@ -1582,24 +1685,55 @@
                         chooseUpstreamType(mTryCell);
                         mTryCell = !mTryCell;
                         break;
-                    case EVENT_UPSTREAM_LINKPROPERTIES_CHANGED:
-                        NetworkState state = (NetworkState) message.obj;
-                        if (mUpstreamNetworkMonitor.processLinkPropertiesChanged(state)) {
-                            setDnsForwarders(state.network, state.linkProperties);
-                        } else if (mCurrentUpstreamIface == null) {
-                            // If we have no upstream interface, try to run through upstream
-                            // selection again.  If, for example, IPv4 connectivity has shown up
-                            // after IPv6 (e.g., 464xlat became available) we want the chance to
-                            // notice and act accordingly.
-                            chooseUpstreamType(false);
+                    case EVENT_UPSTREAM_CALLBACK: {
+                        // First: always update local state about every network.
+                        final NetworkState ns = mUpstreamNetworkMonitor.processCallback(
+                                message.arg1, message.obj);
+
+                        if (ns == null || !pertainsToCurrentUpstream(ns)) {
+                            // TODO: In future, this is where upstream evaluation and selection
+                            // could be handled for notifications which include sufficient data.
+                            // For example, after CONNECTIVITY_ACTION listening is removed, here
+                            // is where we could observe a Wi-Fi network becoming available and
+                            // passing validation.
+                            if (mCurrentUpstreamIface == null) {
+                                // If we have no upstream interface, try to run through upstream
+                                // selection again.  If, for example, IPv4 connectivity has shown up
+                                // after IPv6 (e.g., 464xlat became available) we want the chance to
+                                // notice and act accordingly.
+                                chooseUpstreamType(false);
+                            }
+                            break;
+                        }
+
+                        switch (message.arg1) {
+                            case UpstreamNetworkMonitor.EVENT_ON_AVAILABLE:
+                                // The default network changed, or DUN connected
+                                // before this callback was processed. Updates
+                                // for the current NetworkCapabilities and
+                                // LinkProperties have been requested (default
+                                // request) or are being sent shortly (DUN). Do
+                                // nothing until they arrive; if no updates
+                                // arrive there's nothing to do.
+                                break;
+                            case UpstreamNetworkMonitor.EVENT_ON_CAPABILITIES:
+                                handleNewUpstreamNetworkState(ns);
+                                break;
+                            case UpstreamNetworkMonitor.EVENT_ON_LINKPROPERTIES:
+                                setDnsForwarders(ns.network, ns.linkProperties);
+                                handleNewUpstreamNetworkState(ns);
+                                break;
+                            case UpstreamNetworkMonitor.EVENT_ON_LOST:
+                                // TODO: Re-evaluate possible upstreams. Currently upstream
+                                // reevaluation is triggered via received CONNECTIVITY_ACTION
+                                // broadcasts that result in being passed a
+                                // TetherMasterSM.CMD_UPSTREAM_CHANGED.
+                                break;
+                            default:
+                                break;
                         }
                         break;
-                    case EVENT_UPSTREAM_LOST:
-                        // TODO: Re-evaluate possible upstreams. Currently upstream reevaluation
-                        // is triggered via received CONNECTIVITY_ACTION broadcasts that result
-                        // in being passed a TetherMasterSM.CMD_UPSTREAM_CHANGED.
-                        mUpstreamNetworkMonitor.processNetworkLost((Network) message.obj);
-                        break;
+                    }
                     default:
                         retValue = false;
                         break;
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 6a6570b..fec7ed1 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -244,6 +244,7 @@
         publishBinderService(Context.DISPLAY_SERVICE, new BinderService(),
                 true /*allowIsolated*/);
         publishLocalService(DisplayManagerInternal.class, new LocalService());
+        publishLocalService(DisplayTransformManager.class, new DisplayTransformManager());
     }
 
     @Override
diff --git a/services/core/java/com/android/server/display/DisplayTransformManager.java b/services/core/java/com/android/server/display/DisplayTransformManager.java
new file mode 100644
index 0000000..cfeae7b
--- /dev/null
+++ b/services/core/java/com/android/server/display/DisplayTransformManager.java
@@ -0,0 +1,175 @@
+/*
+ * 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.display;
+
+import android.opengl.Matrix;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.util.Slog;
+import android.util.SparseArray;
+
+/**
+ * Manager for applying color transformations to the display.
+ */
+public class DisplayTransformManager {
+
+    private static final String TAG = "DisplayTransformManager";
+
+    /**
+     * Color transform level used by Night display to tint the display red.
+     */
+    public static final int LEVEL_COLOR_MATRIX_NIGHT_DISPLAY = 100;
+    /**
+     * Color transform level used by A11y services to make the display monochromatic.
+     */
+    public static final int LEVEL_COLOR_MATRIX_GRAYSCALE = 200;
+    /**
+     * Color transform level used by A11y services to invert the display colors.
+     */
+    public static final int LEVEL_COLOR_MATRIX_INVERT_COLOR = 300;
+
+    private final SparseArray<float[]> mColorMatrix = new SparseArray<>(3);
+
+    private int mDaltonizerMode = -1;
+
+    /* package */ DisplayTransformManager() {
+    }
+
+    /**
+     * Returns the color transform matrix set for a given level.
+     */
+    public float[] getColorMatrix(int key) {
+        synchronized (mColorMatrix) {
+            return mColorMatrix.get(key);
+        }
+    }
+
+    /**
+     * Sets and applies a current color transform matrix for a given level.
+     * <p>
+     * Note: all color transforms are first composed to a single matrix in ascending order based
+     * on level before being applied to the display.
+     *
+     * @param key   the level used to identify and compose the color transform (low -> high)
+     * @param value the 4x4 color transform matrix (in column-major order), or {@code null} to
+     *              remove the color transform matrix associated with the provided level
+     */
+    public void setColorMatrix(int key, float[] value) {
+        if (value != null && value.length != 16) {
+            throw new IllegalArgumentException("Expected length: 16 (4x4 matrix)"
+                    + ", actual length: " + value.length);
+        }
+
+        synchronized (mColorMatrix) {
+            if (value != null) {
+                mColorMatrix.put(key, value);
+            } else {
+                mColorMatrix.remove(key);
+            }
+
+            // Update the current color transform.
+            applyColorMatrix(computeColorMatrix());
+        }
+    }
+
+    /**
+     * Returns the composition of all current color matrices, or {@code null} if there are none.
+     */
+    private float[] computeColorMatrix() {
+        synchronized (mColorMatrix) {
+            final int count = mColorMatrix.size();
+            if (count == 0) {
+                return null;
+            }
+
+            final float[][] result = new float[2][16];
+            Matrix.setIdentityM(result[0], 0);
+            for (int i = 0; i < count; i++) {
+                float[] rhs = mColorMatrix.valueAt(i);
+                Matrix.multiplyMM(result[(i + 1) % 2], 0, result[i % 2], 0, rhs, 0);
+            }
+            return result[count % 2];
+        }
+    }
+
+    /**
+     * Returns the current Daltonization mode.
+     */
+    public int getDaltonizerMode() {
+        return mDaltonizerMode;
+    }
+
+    /**
+     * Sets the current Daltonization mode. This adjusts the color space to correct for or simulate
+     * various types of color blindness.
+     *
+     * @param mode the new Daltonization mode, or -1 to disable
+     */
+    public void setDaltonizerMode(int mode) {
+        if (mDaltonizerMode != mode) {
+            mDaltonizerMode = mode;
+            applyDaltonizerMode(mode);
+        }
+    }
+
+    /**
+     * Propagates the provided color transformation matrix to the SurfaceFlinger.
+     */
+    private static void applyColorMatrix(float[] m) {
+        final IBinder flinger = ServiceManager.getService("SurfaceFlinger");
+        if (flinger != null) {
+            final Parcel data = Parcel.obtain();
+            data.writeInterfaceToken("android.ui.ISurfaceComposer");
+            if (m != null) {
+                data.writeInt(1);
+                for (int i = 0; i < 16; i++) {
+                    data.writeFloat(m[i]);
+                }
+            } else {
+                data.writeInt(0);
+            }
+            try {
+                flinger.transact(1015, data, null, 0);
+            } catch (RemoteException ex) {
+                Slog.e(TAG, "Failed to set color transform", ex);
+            } finally {
+                data.recycle();
+            }
+        }
+    }
+
+    /**
+     * Propagates the provided Daltonization mode to the SurfaceFlinger.
+     */
+    private static void applyDaltonizerMode(int mode) {
+        final IBinder flinger = ServiceManager.getService("SurfaceFlinger");
+        if (flinger != null) {
+            final Parcel data = Parcel.obtain();
+            data.writeInterfaceToken("android.ui.ISurfaceComposer");
+            data.writeInt(mode);
+            try {
+                flinger.transact(1014, data, null, 0);
+            } catch (RemoteException ex) {
+                Slog.e(TAG, "Failed to set Daltonizer mode", ex);
+            } finally {
+                data.recycle();
+            }
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/display/NightDisplayService.java b/services/core/java/com/android/server/display/NightDisplayService.java
index 27abd1e..006747b 100644
--- a/services/core/java/com/android/server/display/NightDisplayService.java
+++ b/services/core/java/com/android/server/display/NightDisplayService.java
@@ -47,9 +47,14 @@
     private static final boolean DEBUG = false;
 
     /**
-     * Night mode ~= 3400 K.
+     * Night display ~= 3400 K.
      */
-    private static final String MATRIX_NIGHT = "1,0,0,0,0,.754,0,0,0,0,.516,0,0,0,0,1";
+    private static final float[] MATRIX_NIGHT = new float[] {
+        1,      0,      0, 0,
+        0, 0.754f,      0, 0,
+        0,      0, 0.516f, 0,
+        0,      0,      0, 1
+    };
 
     private int mCurrentUser = UserHandle.USER_NULL;
     private boolean mBootCompleted;
@@ -159,9 +164,9 @@
             }
 
             // Update the current color matrix.
-            final ContentResolver cr = getContext().getContentResolver();
-            Secure.putStringForUser(cr, Secure.ACCESSIBILITY_DISPLAY_COLOR_MATRIX,
-                    activated ? MATRIX_NIGHT : null, mCurrentUser);
+            final DisplayTransformManager dtm = getLocalService(DisplayTransformManager.class);
+            dtm.setColorMatrix(DisplayTransformManager.LEVEL_COLOR_MATRIX_NIGHT_DISPLAY,
+                    activated ? MATRIX_NIGHT : null);
         }
     }
 
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index 8589de1..8f212db 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -1556,6 +1556,11 @@
                 }
             }
 
+            if ((job.getFlags() & JobInfo.FLAG_WILL_BE_FOREGROUND) != 0) {
+                getContext().enforceCallingOrSelfPermission(
+                        android.Manifest.permission.CONNECTIVITY_INTERNAL, TAG);
+            }
+
             long ident = Binder.clearCallingIdentity();
             try {
                 return JobSchedulerService.this.schedule(job, uid);
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 7f2b81e..8dcf653 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -1241,6 +1241,24 @@
     private void setNetworkTemplateEnabled(NetworkTemplate template, boolean enabled) {
         // TODO: reach into ConnectivityManager to proactively disable bringing
         // up this network, since we know that traffic will be blocked.
+
+        if (template.getMatchRule() == MATCH_MOBILE_ALL) {
+            // If mobile data usage hits the limit or if the user resumes the data, we need to
+            // notify telephony.
+            final SubscriptionManager sm = SubscriptionManager.from(mContext);
+            final TelephonyManager tm = TelephonyManager.from(mContext);
+
+            final int[] subIds = sm.getActiveSubscriptionIdList();
+            for (int subId : subIds) {
+                final String subscriberId = tm.getSubscriberId(subId);
+                final NetworkIdentity probeIdent = new NetworkIdentity(TYPE_MOBILE,
+                        TelephonyManager.NETWORK_TYPE_UNKNOWN, subscriberId, null, false, true);
+                // Template is matched when subscriber id matches.
+                if (template.matches(probeIdent)) {
+                    tm.setPolicyDataEnabled(enabled, subId);
+                }
+            }
+        }
     }
 
     /**
diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java
index 01b3dc2..02c6472 100644
--- a/services/core/java/com/android/server/pm/OtaDexoptService.java
+++ b/services/core/java/com/android/server/pm/OtaDexoptService.java
@@ -213,9 +213,19 @@
         // Use the package manager install and install lock here for the OTA dex optimizer.
         PackageDexOptimizer optimizer = new OTADexoptPackageDexOptimizer(
                 collectingInstaller, mPackageManagerService.mInstallLock, mContext);
+        // Make sure that core apps are optimized according to their own "reason".
+        // If the core apps are not preopted in the B OTA, and REASON_AB_OTA is not speed
+        // (by default is speed-profile) they will be interepreted/JITed. This in itself is not a
+        // problem as we will end up doing profile guided compilation. However, some core apps may
+        // be loaded by system server which doesn't JIT and we need to make sure we don't
+        // interpret-only
+        int compilationReason = nextPackage.coreApp
+                ? PackageManagerService.REASON_CORE_APP
+                : PackageManagerService.REASON_AB_OTA;
+
         optimizer.performDexOpt(nextPackage, nextPackage.usesLibraryFiles,
                 null /* ISAs */, false /* checkProfiles */,
-                getCompilerFilterForReason(PackageManagerService.REASON_AB_OTA));
+                getCompilerFilterForReason(compilationReason));
 
         mCommandsForCurrentPackage = collectingConnection.commands;
         if (mCommandsForCurrentPackage.isEmpty()) {
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 5980715..78fa3a3 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -95,6 +95,7 @@
 import static com.android.server.pm.InstructionSets.getPrimaryInstructionSet;
 import static com.android.server.pm.PackageManagerServiceCompilerMapping.getCompilerFilterForReason;
 import static com.android.server.pm.PackageManagerServiceCompilerMapping.getFullCompilerFilter;
+import static com.android.server.pm.PackageManagerServiceCompilerMapping.getNonProfileGuidedCompilerFilter;
 import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_FAILURE;
 import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCESS;
 import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED;
@@ -2800,7 +2801,7 @@
                     }
                 }
 
-                int[] stats = performDexOpt(coreApps, false,
+                int[] stats = performDexOptUpgrade(coreApps, false,
                         getCompilerFilterForReason(REASON_CORE_APP));
 
                 final int elapsedTimeSeconds =
@@ -7324,7 +7325,7 @@
         }
 
         final long startTime = System.nanoTime();
-        final int[] stats = performDexOpt(pkgs, mIsPreNUpgrade /* showDialog */,
+        final int[] stats = performDexOptUpgrade(pkgs, mIsPreNUpgrade /* showDialog */,
                     getCompilerFilterForReason(causeFirstBoot ? REASON_FIRST_BOOT : REASON_BOOT));
 
         final int elapsedTimeSeconds =
@@ -7343,7 +7344,7 @@
      * which are (in order) {@code numberOfPackagesOptimized}, {@code numberOfPackagesSkipped}
      * and {@code numberOfPackagesFailed}.
      */
-    private int[] performDexOpt(List<PackageParser.Package> pkgs, boolean showDialog,
+    private int[] performDexOptUpgrade(List<PackageParser.Package> pkgs, boolean showDialog,
             String compilerFilter) {
 
         int numberOfPackagesVisited = 0;
@@ -7377,6 +7378,19 @@
                 }
             }
 
+            // If the OTA updates a system app which was previously preopted to a non-preopted state
+            // the app might end up being verified at runtime. That's because by default the apps
+            // are verify-profile but for preopted apps there's no profile.
+            // Do a hacky check to ensure that if we have no profiles (a reasonable indication
+            // that before the OTA the app was preopted) the app gets compiled with a non-profile
+            // filter (by default interpret-only).
+            // Note that at this stage unused apps are already filtered.
+            if (isSystemApp(pkg) &&
+                    DexFile.isProfileGuidedCompilerFilter(compilerFilter) &&
+                    !Environment.getReferenceProfile(pkg.packageName).exists()) {
+                compilerFilter = getNonProfileGuidedCompilerFilter(compilerFilter);
+            }
+
             // checkProfiles is false to avoid merging profiles during boot which
             // might interfere with background compilation (b/28612421).
             // Unfortunately this will also means that "pm.dexopt.boot=speed-profile" will
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 5f8cbbf..730217d 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -1444,6 +1444,10 @@
                     shortcut.getPackage().equals(shortcut.getActivity().getPackageName()),
                     "Cannot publish shortcut: activity " + shortcut.getActivity() + " does not"
                     + " belong to package " + shortcut.getPackage());
+            Preconditions.checkState(
+                    injectIsMainActivity(shortcut.getActivity(), shortcut.getUserId()),
+                    "Cannot publish shortcut: activity " + shortcut.getActivity() + " is not"
+                            + " main activity");
         }
 
         if (!forUpdate) {
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index ca92b90..552803f 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -29,6 +29,7 @@
 import android.os.RemoteException;
 import android.os.ResultReceiver;
 import android.os.UserHandle;
+import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.Slog;
 import android.view.KeyEvent;
@@ -942,6 +943,20 @@
                                 + " token=" + tok.token);
             }
             pw.println("  mCurrentUserId=" + mCurrentUserId);
+            pw.println("  mIcons=");
+            for (String slot : mIcons.keySet()) {
+                pw.println("    ");
+                pw.print(slot);
+                pw.print(" -> ");
+                final StatusBarIcon icon = mIcons.get(slot);
+                pw.print(icon);
+                if (!TextUtils.isEmpty(icon.contentDescription)) {
+                    pw.print(" \"");
+                    pw.print(icon.contentDescription);
+                    pw.print("\"");
+                }
+                pw.println();
+            }
         }
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
index f570ff2..d546092 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
@@ -130,7 +130,6 @@
         assertExpectException(NullPointerException.class, "action must be set",
                 () -> new ShortcutInfo.Builder(getTestContext(), "id").setIntent(new Intent()));
 
-        // same for add.
         assertExpectException(
                 IllegalArgumentException.class, "Short label must be provided", () -> {
             ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
@@ -139,6 +138,7 @@
             assertTrue(getManager().setDynamicShortcuts(list(si)));
         });
 
+        // same for add.
         assertExpectException(
                 IllegalArgumentException.class, "Short label must be provided", () -> {
             ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
@@ -147,7 +147,6 @@
             assertTrue(getManager().addDynamicShortcuts(list(si)));
         });
 
-        // same for add.
         assertExpectException(NullPointerException.class, "Intent must be provided", () -> {
             ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
                     .setActivity(new ComponentName(getTestContext().getPackageName(), "s"))
@@ -181,6 +180,33 @@
                     .build();
             assertTrue(getManager().addDynamicShortcuts(list(si)));
         });
+
+        // Now all activities are not main.
+        mMainActivityChecker = (component, userId) -> false;
+
+        assertExpectException(
+                IllegalStateException.class, "is not main", () -> {
+                    ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
+                            .setActivity(new ComponentName(getTestContext(), "s"))
+                            .build();
+                    assertTrue(getManager().setDynamicShortcuts(list(si)));
+                });
+        // For add
+        assertExpectException(
+                IllegalStateException.class, "is not main", () -> {
+                    ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
+                            .setActivity(new ComponentName(getTestContext(), "s"))
+                            .build();
+                    assertTrue(getManager().addDynamicShortcuts(list(si)));
+                });
+        // For update
+        assertExpectException(
+                IllegalStateException.class, "is not main", () -> {
+                    ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
+                            .setActivity(new ComponentName(getTestContext(), "s"))
+                            .build();
+                    assertTrue(getManager().updateShortcuts(list(si)));
+                });
     }
 
     public void testShortcutInfoParcel() {
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index dc053bf..ff082b6 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -5538,5 +5538,22 @@
         }
         return 0;
     }
+
+    /**
+     * Policy control of data connection. Usually used when data limit is passed.
+     * @param enabled True if enabling the data, otherwise disabling.
+     * @param subId sub id
+     * @hide
+     */
+    public void setPolicyDataEnabled(boolean enabled, int subId) {
+        try {
+            ITelephony service = getITelephony();
+            if (service != null) {
+                service.setPolicyDataEnabled(enabled, subId);
+            }
+        } catch (RemoteException e) {
+            Log.e(TAG, "Error calling ITelephony#setPolicyDataEnabled", e);
+        }
+    }
 }
 
diff --git a/telephony/java/com/android/internal/telephony/DctConstants.java b/telephony/java/com/android/internal/telephony/DctConstants.java
index 8166e00..f01e4c0 100644
--- a/telephony/java/com/android/internal/telephony/DctConstants.java
+++ b/telephony/java/com/android/internal/telephony/DctConstants.java
@@ -105,6 +105,7 @@
     public static final int EVENT_DEVICE_PROVISIONED_CHANGE = BASE + 43;
     public static final int EVENT_REDIRECTION_DETECTED = BASE + 44;
     public static final int EVENT_PCO_DATA_RECEIVED = BASE + 45;
+    public static final int EVENT_SET_CARRIER_DATA_ENABLED = BASE + 46;
 
     /***** Constants *****/
 
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 2168b0e..167e1a7 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -1158,4 +1158,12 @@
      * @hide
      */
     long getVtDataUsage();
+
+    /**
+     * Policy control of data connection. Usually used when data limit is passed.
+     * @param enabled True if enabling the data, otherwise disabling.
+     * @param subId Subscription index
+     * @hide
+     */
+    void setPolicyDataEnabled(boolean enabled, int subId);
 }
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index 447ace6..288b2a3 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -750,7 +750,7 @@
     }
 
     // Source for AndroidManifest.xml
-    const String8 manifestFile = String8::format("%s@AndroidManifest.xml", filename);
+    const String8 manifestFile("AndroidManifest.xml");
 
     // The dynamicRefTable can be null if there are no resources for this asset cookie.
     // This fine.
@@ -850,14 +850,16 @@
                 depth++;
                 const char16_t* ctag16 = tree.getElementName(&len);
                 if (ctag16 == NULL) {
-                    fprintf(stderr, "ERROR: failed to get XML element name (bad string pool)\n");
+                    SourcePos(manifestFile, tree.getLineNumber()).error(
+                            "ERROR: failed to get XML element name (bad string pool)");
                     goto bail;
                 }
                 String8 tag(ctag16);
                 //printf("Depth %d tag %s\n", depth, tag.string());
                 if (depth == 1) {
                     if (tag != "manifest") {
-                        fprintf(stderr, "ERROR: manifest does not start with <manifest> tag\n");
+                        SourcePos(manifestFile, tree.getLineNumber()).error(
+                                "ERROR: manifest does not start with <manifest> tag");
                         goto bail;
                     }
                     String8 pkg = AaptXml::getAttribute(tree, NULL, "package", NULL);
@@ -867,12 +869,14 @@
                         String8 error;
                         String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error);
                         if (error != "") {
-                            fprintf(stderr, "ERROR: %s\n", error.string());
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'android:name': %s", error.string());
                             goto bail;
                         }
 
                         if (name == "") {
-                            fprintf(stderr, "ERROR: missing 'android:name' for permission\n");
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR: missing 'android:name' for permission");
                             goto bail;
                         }
                         printf("permission: %s\n",
@@ -881,12 +885,14 @@
                         String8 error;
                         String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error);
                         if (error != "") {
-                            fprintf(stderr, "ERROR: %s\n", error.string());
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'android:name' attribute: %s", error.string());
                             goto bail;
                         }
 
                         if (name == "") {
-                            fprintf(stderr, "ERROR: missing 'android:name' for uses-permission\n");
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR: missing 'android:name' for uses-permission");
                             goto bail;
                         }
                         printUsesPermission(name,
@@ -896,13 +902,14 @@
                         String8 error;
                         String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error);
                         if (error != "") {
-                            fprintf(stderr, "ERROR: %s\n", error.string());
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'android:name' attribute: %s", error.string());
                             goto bail;
                         }
 
                         if (name == "") {
-                            fprintf(stderr, "ERROR: missing 'android:name' for "
-                                    "uses-permission-sdk-23\n");
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR: missing 'android:name' for uses-permission-sdk-23");
                             goto bail;
                         }
                         printUsesPermissionSdk23(
@@ -1163,14 +1170,16 @@
 
                 const char16_t* ctag16 = tree.getElementName(&len);
                 if (ctag16 == NULL) {
-                    fprintf(stderr, "ERROR: failed to get XML element name (bad string pool)\n");
+                    SourcePos(manifestFile, tree.getLineNumber()).error(
+                            "ERROR: failed to get XML element name (bad string pool)");
                     goto bail;
                 }
                 String8 tag(ctag16);
                 //printf("Depth %d,  %s\n", depth, tag.string());
                 if (depth == 1) {
                     if (tag != "manifest") {
-                        fprintf(stderr, "ERROR: manifest does not start with <manifest> tag\n");
+                        SourcePos(manifestFile, tree.getLineNumber()).error(
+                                "ERROR: manifest does not start with <manifest> tag");
                         goto bail;
                     }
                     pkg = AaptXml::getAttribute(tree, NULL, "package", NULL);
@@ -1179,7 +1188,8 @@
                     int32_t versionCode = AaptXml::getIntegerAttribute(tree, VERSION_CODE_ATTR,
                             &error);
                     if (error != "") {
-                        fprintf(stderr, "ERROR getting 'android:versionCode' attribute: %s\n",
+                        SourcePos(manifestFile, tree.getLineNumber()).error(
+                                "ERROR getting 'android:versionCode' attribute: %s",
                                 error.string());
                         goto bail;
                     }
@@ -1191,7 +1201,8 @@
                     String8 versionName = AaptXml::getResolvedAttribute(res, tree,
                             VERSION_NAME_ATTR, &error);
                     if (error != "") {
-                        fprintf(stderr, "ERROR getting 'android:versionName' attribute: %s\n",
+                        SourcePos(manifestFile, tree.getLineNumber()).error(
+                                "ERROR getting 'android:versionName' attribute: %s",
                                 error.string());
                         goto bail;
                     }
@@ -1212,7 +1223,8 @@
                     int32_t installLocation = AaptXml::getResolvedIntegerAttribute(res, tree,
                             INSTALL_LOCATION_ATTR, &error);
                     if (error != "") {
-                        fprintf(stderr, "ERROR getting 'android:installLocation' attribute: %s\n",
+                        SourcePos(manifestFile, tree.getLineNumber()).error(
+                                "ERROR getting 'android:installLocation' attribute: %s",
                                 error.string());
                         goto bail;
                     }
@@ -1278,14 +1290,15 @@
 
                         String8 icon = AaptXml::getResolvedAttribute(res, tree, ICON_ATTR, &error);
                         if (error != "") {
-                            fprintf(stderr, "ERROR getting 'android:icon' attribute: %s\n",
-                                    error.string());
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'android:icon' attribute: %s", error.string());
                             goto bail;
                         }
                         int32_t testOnly = AaptXml::getIntegerAttribute(tree, TEST_ONLY_ATTR, 0,
                                 &error);
                         if (error != "") {
-                            fprintf(stderr, "ERROR getting 'android:testOnly' attribute: %s\n",
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'android:testOnly' attribute: %s",
                                     error.string());
                             goto bail;
                         }
@@ -1293,8 +1306,8 @@
                         String8 banner = AaptXml::getResolvedAttribute(res, tree, BANNER_ATTR,
                                                                        &error);
                         if (error != "") {
-                            fprintf(stderr, "ERROR getting 'android:banner' attribute: %s\n",
-                                    error.string());
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'android:banner' attribute: %s", error.string());
                             goto bail;
                         }
                         printf("application: label='%s' ",
@@ -1312,8 +1325,8 @@
                         int32_t isGame = AaptXml::getResolvedIntegerAttribute(res, tree,
                                 ISGAME_ATTR, 0, &error);
                         if (error != "") {
-                            fprintf(stderr, "ERROR getting 'android:isGame' attribute: %s\n",
-                                    error.string());
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'android:isGame' attribute: %s", error.string());
                             goto bail;
                         }
                         if (isGame != 0) {
@@ -1323,7 +1336,8 @@
                         int32_t debuggable = AaptXml::getResolvedIntegerAttribute(res, tree,
                                 DEBUGGABLE_ATTR, 0, &error);
                         if (error != "") {
-                            fprintf(stderr, "ERROR getting 'android:debuggable' attribute: %s\n",
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'android:debuggable' attribute: %s",
                                     error.string());
                             goto bail;
                         }
@@ -1352,8 +1366,8 @@
                             String8 name = AaptXml::getResolvedAttribute(res, tree,
                                     MIN_SDK_VERSION_ATTR, &error);
                             if (error != "") {
-                                fprintf(stderr,
-                                        "ERROR getting 'android:minSdkVersion' attribute: %s\n",
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
+                                        "ERROR getting 'android:minSdkVersion' attribute: %s",
                                         error.string());
                                 goto bail;
                             }
@@ -1374,8 +1388,8 @@
                             String8 name = AaptXml::getResolvedAttribute(res, tree,
                                     TARGET_SDK_VERSION_ATTR, &error);
                             if (error != "") {
-                                fprintf(stderr,
-                                        "ERROR getting 'android:targetSdkVersion' attribute: %s\n",
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
+                                        "ERROR getting 'android:targetSdkVersion' attribute: %s",
                                         error.string());
                                 goto bail;
                             }
@@ -1440,8 +1454,8 @@
                         FeatureGroup group;
                         group.label = AaptXml::getResolvedAttribute(res, tree, LABEL_ATTR, &error);
                         if (error != "") {
-                            fprintf(stderr, "ERROR getting 'android:label' attribute:"
-                                    " %s\n", error.string());
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'android:label' attribute: %s", error.string());
                             goto bail;
                         }
                         featureGroups.add(group);
@@ -1486,13 +1500,14 @@
                     } else if (tag == "uses-permission") {
                         String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error);
                         if (error != "") {
-                            fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
-                                    error.string());
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'android:name' attribute: %s", error.string());
                             goto bail;
                         }
 
                         if (name == "") {
-                            fprintf(stderr, "ERROR: missing 'android:name' for uses-permission\n");
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR: missing 'android:name' for uses-permission");
                             goto bail;
                         }
 
@@ -1521,14 +1536,14 @@
                     } else if (tag == "uses-permission-sdk-23" || tag == "uses-permission-sdk-m") {
                         String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error);
                         if (error != "") {
-                            fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
-                                    error.string());
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'android:name' attribute: %s", error.string());
                             goto bail;
                         }
 
                         if (name == "") {
-                            fprintf(stderr, "ERROR: missing 'android:name' for "
-                                    "uses-permission-sdk-23\n");
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR: missing 'android:name' for uses-permission-sdk-23");
                             goto bail;
                         }
 
@@ -1543,9 +1558,9 @@
                             printf("uses-package:'%s'\n",
                                     ResTable::normalizeForOutput(name.string()).string());
                         } else {
-                            fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
-                                    error.string());
-                                goto bail;
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'android:name' attribute: %s", error.string());
+                            goto bail;
                         }
                     } else if (tag == "original-package") {
                         String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error);
@@ -1553,9 +1568,9 @@
                             printf("original-package:'%s'\n",
                                     ResTable::normalizeForOutput(name.string()).string());
                         } else {
-                            fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
-                                    error.string());
-                                goto bail;
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'android:name' attribute: %s", error.string());
+                            goto bail;
                         }
                     } else if (tag == "supports-gl-texture") {
                         String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error);
@@ -1563,15 +1578,15 @@
                             printf("supports-gl-texture:'%s'\n",
                                     ResTable::normalizeForOutput(name.string()).string());
                         } else {
-                            fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
-                                    error.string());
-                                goto bail;
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'android:name' attribute: %s", error.string());
+                            goto bail;
                         }
                     } else if (tag == "compatible-screens") {
                         printCompatibleScreens(tree, &error);
                         if (error != "") {
-                            fprintf(stderr, "ERROR getting compatible screens: %s\n",
-                                    error.string());
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting compatible screens: %s", error.string());
                             goto bail;
                         }
                         depth--;
@@ -1608,7 +1623,8 @@
                             withinActivity = true;
                             activityName = AaptXml::getAttribute(tree, NAME_ATTR, &error);
                             if (error != "") {
-                                fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
+                                        "ERROR getting 'android:name' attribute: %s",
                                         error.string());
                                 goto bail;
                             }
@@ -1616,7 +1632,8 @@
                             activityLabel = AaptXml::getResolvedAttribute(res, tree, LABEL_ATTR,
                                     &error);
                             if (error != "") {
-                                fprintf(stderr, "ERROR getting 'android:label' attribute: %s\n",
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
+                                        "ERROR getting 'android:label' attribute: %s",
                                         error.string());
                                 goto bail;
                             }
@@ -1624,7 +1641,8 @@
                             activityIcon = AaptXml::getResolvedAttribute(res, tree, ICON_ATTR,
                                     &error);
                             if (error != "") {
-                                fprintf(stderr, "ERROR getting 'android:icon' attribute: %s\n",
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
+                                        "ERROR getting 'android:icon' attribute: %s",
                                         error.string());
                                 goto bail;
                             }
@@ -1632,7 +1650,8 @@
                             activityBanner = AaptXml::getResolvedAttribute(res, tree, BANNER_ATTR,
                                     &error);
                             if (error != "") {
-                                fprintf(stderr, "ERROR getting 'android:banner' attribute: %s\n",
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
+                                        "ERROR getting 'android:banner' attribute: %s",
                                         error.string());
                                 goto bail;
                             }
@@ -1659,9 +1678,9 @@
                         } else if (tag == "uses-library") {
                             String8 libraryName = AaptXml::getAttribute(tree, NAME_ATTR, &error);
                             if (error != "") {
-                                fprintf(stderr,
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
                                         "ERROR getting 'android:name' attribute for uses-library"
-                                        " %s\n", error.string());
+                                        " %s", error.string());
                                 goto bail;
                             }
                             int req = AaptXml::getIntegerAttribute(tree,
@@ -1674,9 +1693,9 @@
                             receiverName = AaptXml::getAttribute(tree, NAME_ATTR, &error);
 
                             if (error != "") {
-                                fprintf(stderr,
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
                                         "ERROR getting 'android:name' attribute for receiver:"
-                                        " %s\n", error.string());
+                                        " %s", error.string());
                                 goto bail;
                             }
 
@@ -1687,9 +1706,9 @@
                                     hasBindDeviceAdminPermission = true;
                                 }
                             } else {
-                                fprintf(stderr,
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
                                         "ERROR getting 'android:permission' attribute for"
-                                        " receiver '%s': %s\n",
+                                        " receiver '%s': %s",
                                         receiverName.string(), error.string());
                             }
                         } else if (tag == "service") {
@@ -1697,8 +1716,9 @@
                             serviceName = AaptXml::getAttribute(tree, NAME_ATTR, &error);
 
                             if (error != "") {
-                                fprintf(stderr, "ERROR getting 'android:name' attribute for "
-                                        "service:%s\n", error.string());
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
+                                        "ERROR getting 'android:name' attribute for "
+                                        "service:%s", error.string());
                                 goto bail;
                             }
 
@@ -1723,8 +1743,9 @@
                                     hasBindDreamServicePermission = true;
                                 }
                             } else {
-                                fprintf(stderr, "ERROR getting 'android:permission' attribute for "
-                                        "service '%s': %s\n", serviceName.string(), error.string());
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
+                                        "ERROR getting 'android:permission' attribute for "
+                                        "service '%s': %s", serviceName.string(), error.string());
                             }
                         } else if (tag == "provider") {
                             withinProvider = true;
@@ -1732,26 +1753,27 @@
                             bool exported = AaptXml::getResolvedIntegerAttribute(res, tree,
                                     EXPORTED_ATTR, &error);
                             if (error != "") {
-                                fprintf(stderr,
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
                                         "ERROR getting 'android:exported' attribute for provider:"
-                                        " %s\n", error.string());
+                                        " %s", error.string());
                                 goto bail;
                             }
 
                             bool grantUriPermissions = AaptXml::getResolvedIntegerAttribute(
                                     res, tree, GRANT_URI_PERMISSIONS_ATTR, &error);
                             if (error != "") {
-                                fprintf(stderr,
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
                                         "ERROR getting 'android:grantUriPermissions' attribute for "
-                                        "provider: %s\n", error.string());
+                                        "provider: %s", error.string());
                                 goto bail;
                             }
 
                             String8 permission = AaptXml::getResolvedAttribute(res, tree,
                                     PERMISSION_ATTR, &error);
                             if (error != "") {
-                                fprintf(stderr, "ERROR getting 'android:permission' attribute for "
-                                        "provider: %s\n", error.string());
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
+                                        "ERROR getting 'android:permission' attribute for "
+                                        "provider: %s", error.string());
                                 goto bail;
                             }
 
@@ -1762,8 +1784,9 @@
                             String8 metaDataName = AaptXml::getResolvedAttribute(res, tree,
                                     NAME_ATTR, &error);
                             if (error != "") {
-                                fprintf(stderr, "ERROR getting 'android:name' attribute for "
-                                        "meta-data:%s\n", error.string());
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
+                                        "ERROR getting 'android:name' attribute for "
+                                        "meta-data: %s", error.string());
                                 goto bail;
                             }
                             printf("meta-data: name='%s' ",
@@ -1776,9 +1799,10 @@
                                 printResolvedResourceAttribute(res, tree, RESOURCE_ATTR,
                                         String8("resource"), &error);
                                 if (error != "") {
-                                    fprintf(stderr, "ERROR getting 'android:value' or "
+                                    SourcePos(manifestFile, tree.getLineNumber()).error(
+                                            "ERROR getting 'android:value' or "
                                             "'android:resource' attribute for "
-                                            "meta-data:%s\n", error.string());
+                                            "meta-data: %s", error.string());
                                     goto bail;
                                 }
                             }
@@ -1788,7 +1812,8 @@
                             if (name != "" && error == "") {
                                 supportedInput.add(name);
                             } else {
-                                fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
+                                        "ERROR getting 'android:name' attribute: %s",
                                         error.string());
                                 goto bail;
                             }
@@ -1847,8 +1872,9 @@
                     } else if (withinService && tag == "meta-data") {
                         String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error);
                         if (error != "") {
-                            fprintf(stderr, "ERROR getting 'android:name' attribute for "
-                                    "meta-data tag in service '%s': %s\n", serviceName.string(),
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'android:name' attribute for "
+                                    "meta-data tag in service '%s': %s", serviceName.string(),
                                     error.string());
                             goto bail;
                         }
@@ -1863,8 +1889,9 @@
                             String8 xmlPath = AaptXml::getResolvedAttribute(res, tree,
                                     RESOURCE_ATTR, &error);
                             if (error != "") {
-                                fprintf(stderr, "ERROR getting 'android:resource' attribute for "
-                                        "meta-data tag in service '%s': %s\n",
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
+                                        "ERROR getting 'android:resource' attribute for "
+                                        "meta-data tag in service '%s': %s",
                                         serviceName.string(), error.string());
                                 goto bail;
                             }
@@ -1872,7 +1899,8 @@
                             Vector<String8> categories = getNfcAidCategories(assets, xmlPath,
                                     offHost, &error);
                             if (error != "") {
-                                fprintf(stderr, "ERROR getting AID category for service '%s'\n",
+                                SourcePos(manifestFile, tree.getLineNumber()).error(
+                                        "ERROR getting AID category for service '%s'",
                                         serviceName.string());
                                 goto bail;
                             }
@@ -1893,8 +1921,8 @@
                     if (tag == "action") {
                         action = AaptXml::getAttribute(tree, NAME_ATTR, &error);
                         if (error != "") {
-                            fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
-                                    error.string());
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'android:name' attribute: %s", error.string());
                             goto bail;
                         }
 
@@ -1949,8 +1977,8 @@
                     if (tag == "category") {
                         String8 category = AaptXml::getAttribute(tree, NAME_ATTR, &error);
                         if (error != "") {
-                            fprintf(stderr, "ERROR getting 'name' attribute: %s\n",
-                                    error.string());
+                            SourcePos(manifestFile, tree.getLineNumber()).error(
+                                    "ERROR getting 'name' attribute: %s", error.string());
                             goto bail;
                         }
                         if (withinActivity) {
@@ -2261,6 +2289,10 @@
     result = NO_ERROR;
 
 bail:
+    if (SourcePos::hasErrors()) {
+        SourcePos::printErrors(stderr);
+    }
+
     if (asset) {
         delete asset;
     }