Merge changes I9731d978,I9e325782,I441a4d4d,I86a85e48,I9268fd66, ...

* changes:
  Keystore 2.0 SPI: Install legacy Keystore provider as AndroidKeyStoreLegacy
  Keystore 2.0 SPI: Zygote install Keystore2 provider conditionally
  Keystore 2.0 SPI: Evolve the generator SPI.
  Keystore 2.0 SPI: Evolve Factory SPI
  Keystore 2.0 SPI: AndroidKeyStoreProvider loads keys from Keystore 2.0
  Keystore 2.0 SPI: Evolve the Crypto SPI.
  Keystore 2.0 SPI: KeyParameter utilities.
  Keystore 2.0 SPI: Update the chunked streamer.
  Keystore 2.0 SPI: KeyStoreCryptoOperationUtils
  Keystore 2.0 SPI: KeyStoreKeys adopt Keystore 2.0
  Keystore 2.0: Shim around the basic functionality of Keystore 2.0
  Keystore 2.0 SPI: Duplicate Keystore SPI to android.security.keystore2 package
diff --git a/Android.bp b/Android.bp
index eb1718e..570040f 100644
--- a/Android.bp
+++ b/Android.bp
@@ -744,6 +744,7 @@
         "core/java/com/android/internal/util/IState.java",
         "core/java/com/android/internal/util/State.java",
         "core/java/com/android/internal/util/StateMachine.java",
+        "services/core/java/com/android/server/vcn/util/PersistableBundleUtils.java",
         "telephony/java/android/telephony/Annotation.java",
     ],
 }
diff --git a/StubLibraries.bp b/StubLibraries.bp
index aa39824..cb36e63 100644
--- a/StubLibraries.bp
+++ b/StubLibraries.bp
@@ -110,37 +110,9 @@
 }
 
 /////////////////////////////////////////////////////////////////////
-// *-api-stubs-docs modules providing source files for the stub libraries
+// These modules provide source files for the stub libraries
 /////////////////////////////////////////////////////////////////////
 
-// api-stubs-docs, system-api-stubs-docs, and test-api-stubs-docs have APIs
-// from the non-updatable part of the platform as well as from the updatable
-// modules
-droidstubs {
-    name: "api-stubs-docs",
-    defaults: ["metalava-full-api-stubs-default"],
-    arg_files: [
-        "core/res/AndroidManifest.xml",
-    ],
-    args: metalava_framework_docs_args,
-    check_api: {
-        current: {
-            api_file: "api/current.txt",
-            removed_api_file: "api/removed.txt",
-        },
-        last_released: {
-            api_file: ":android.api.public.latest",
-            removed_api_file: ":removed.api.public.latest",
-            baseline_file: ":public-api-incompatibilities-with-last-released",
-        },
-        api_lint: {
-            enabled: true,
-            new_since: ":android.api.public.latest",
-            baseline_file: "api/lint-baseline.txt",
-        },
-    },
-}
-
 droidstubs {
     name: "api-stubs-docs-non-updatable",
     defaults: ["metalava-non-updatable-api-stubs-default"],
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 6fa5a7b..6edc8ea 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -6680,7 +6680,7 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public boolean isDeviceManaged() {
         try {
             return mService.hasDeviceOwner();
@@ -10392,7 +10392,7 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public @Nullable CharSequence getDeviceOwnerOrganizationName() {
         try {
             return mService.getDeviceOwnerOrganizationName();
diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java
index 4c96c54..f25b06b 100644
--- a/core/java/android/hardware/hdmi/HdmiControlManager.java
+++ b/core/java/android/hardware/hdmi/HdmiControlManager.java
@@ -407,7 +407,7 @@
      */
     @Nullable
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public HdmiClient getClient(int type) {
         if (mService == null) {
             return null;
@@ -440,7 +440,7 @@
      */
     @Nullable
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public HdmiPlaybackClient getPlaybackClient() {
         return (HdmiPlaybackClient) getClient(HdmiDeviceInfo.DEVICE_PLAYBACK);
     }
@@ -458,7 +458,7 @@
      */
     @Nullable
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public HdmiTvClient getTvClient() {
         return (HdmiTvClient) getClient(HdmiDeviceInfo.DEVICE_TV);
     }
@@ -476,7 +476,7 @@
      * @hide
      */
     @Nullable
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public HdmiAudioSystemClient getAudioSystemClient() {
         return (HdmiAudioSystemClient) getClient(HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
     }
@@ -491,7 +491,7 @@
      * @return {@link HdmiSwitchClient} instance. {@code null} on failure.
      */
     @Nullable
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public HdmiSwitchClient getSwitchClient() {
         return (HdmiSwitchClient) getClient(HdmiDeviceInfo.DEVICE_PURE_CEC_SWITCH);
     }
diff --git a/core/java/android/hardware/location/ContextHubManager.java b/core/java/android/hardware/location/ContextHubManager.java
index 1ed791d..d444807 100644
--- a/core/java/android/hardware/location/ContextHubManager.java
+++ b/core/java/android/hardware/location/ContextHubManager.java
@@ -654,7 +654,7 @@
      *             register a {@link android.hardware.location.ContextHubClientCallback}.
      */
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public int registerCallback(@NonNull Callback callback) {
         return registerCallback(callback, null);
     }
@@ -688,7 +688,7 @@
      *             register a {@link android.hardware.location.ContextHubClientCallback}.
      */
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public int registerCallback(Callback callback, Handler handler) {
         synchronized(this) {
             if (mCallback != null) {
@@ -892,7 +892,7 @@
      * @deprecated Use {@link android.hardware.location.ContextHubClient#close()} to unregister
      *             a {@link android.hardware.location.ContextHubClientCallback}.
      */
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     @Deprecated
     public int unregisterCallback(@NonNull Callback callback) {
       synchronized(this) {
diff --git a/core/java/android/hardware/usb/UsbDeviceConnection.java b/core/java/android/hardware/usb/UsbDeviceConnection.java
index 21634cc..1c35cb6 100644
--- a/core/java/android/hardware/usb/UsbDeviceConnection.java
+++ b/core/java/android/hardware/usb/UsbDeviceConnection.java
@@ -299,7 +299,7 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public boolean resetDevice() {
         return native_reset_device();
     }
diff --git a/core/java/android/net/TrafficStats.java b/core/java/android/net/TrafficStats.java
index 7376830..4e019cf 100644
--- a/core/java/android/net/TrafficStats.java
+++ b/core/java/android/net/TrafficStats.java
@@ -301,7 +301,7 @@
      * Changes only take effect during subsequent calls to
      * {@link #tagSocket(Socket)}.
      */
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public static void setThreadStatsUid(int uid) {
         NetworkManagementSocketTagger.setThreadSocketStatsUid(uid);
     }
@@ -339,7 +339,7 @@
      *
      * @see #setThreadStatsUid(int)
      */
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public static void clearThreadStatsUid() {
         NetworkManagementSocketTagger.setThreadSocketStatsUid(-1);
     }
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index 8cdcd49..38e1704 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -422,7 +422,7 @@
      * {@hide}
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public static boolean verifyPackageCompatibility(File compatibilityFile) throws IOException {
         try (InputStream inputStream = new FileInputStream(compatibilityFile)) {
             return verifyPackageCompatibility(inputStream);
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 684ea08..648d934 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -2221,7 +2221,7 @@
     /** @hide */
     @SystemApi
     @WorkerThread
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public long getAllocatableBytes(@NonNull UUID storageUuid,
             @RequiresPermission @AllocateFlags int flags) throws IOException {
         try {
@@ -2270,7 +2270,7 @@
     /** @hide */
     @SystemApi
     @WorkerThread
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void allocateBytes(@NonNull UUID storageUuid, @BytesLong long bytes,
             @RequiresPermission @AllocateFlags int flags) throws IOException {
         try {
@@ -2320,7 +2320,7 @@
     /** @hide */
     @SystemApi
     @WorkerThread
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void allocateBytes(FileDescriptor fd, @BytesLong long bytes,
             @RequiresPermission @AllocateFlags int flags) throws IOException {
         final File file = ParcelFileDescriptor.getFile(fd);
diff --git a/core/java/android/service/persistentdata/PersistentDataBlockManager.java b/core/java/android/service/persistentdata/PersistentDataBlockManager.java
index 0bf68b7..8242f4e 100644
--- a/core/java/android/service/persistentdata/PersistentDataBlockManager.java
+++ b/core/java/android/service/persistentdata/PersistentDataBlockManager.java
@@ -90,7 +90,7 @@
      *
      * @param data the data to write
      */
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public int write(byte[] data) {
         try {
             return sService.write(data);
@@ -102,7 +102,7 @@
     /**
      * Returns the data block stored on the persistent partition.
      */
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public byte[] read() {
         try {
             return sService.read();
@@ -130,7 +130,7 @@
      *
      * Returns -1 on error.
      */
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public long getMaximumDataBlockSize() {
         try {
             return sService.getMaximumDataBlockSize();
diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java
index 60f1b44..8d1f16b 100644
--- a/core/java/com/android/internal/os/RuntimeInit.java
+++ b/core/java/com/android/internal/os/RuntimeInit.java
@@ -24,7 +24,6 @@
 import android.content.type.DefaultMimeMapFactory;
 import android.os.Build;
 import android.os.DeadObjectException;
-import android.os.Debug;
 import android.os.IBinder;
 import android.os.Process;
 import android.os.SystemProperties;
@@ -257,18 +256,6 @@
          */
         NetworkManagementSocketTagger.install();
 
-        /*
-         * If we're running in an emulator launched with "-trace", put the
-         * VM into emulator trace profiling mode so that the user can hit
-         * F9/F10 at any time to capture traces.  This has performance
-         * consequences, so it's not something you want to do always.
-         */
-        String trace = SystemProperties.get("ro.kernel.android.tracing");
-        if (trace.equals("1")) {
-            Slog.i(TAG, "NOTE: emulator trace profiling enabled");
-            Debug.enableEmulatorTraceOutput();
-        }
-
         initialized = true;
     }
 
diff --git a/libs/WindowManager/Shell/OWNERS b/libs/WindowManager/Shell/OWNERS
index 36da7aa..e2c67fd 100644
--- a/libs/WindowManager/Shell/OWNERS
+++ b/libs/WindowManager/Shell/OWNERS
@@ -1,5 +1,4 @@
 # sysui owners
 hwwang@google.com
-mrenouf@google.com
 winsonc@google.com
 madym@google.com
diff --git a/libs/androidfw/ConfigDescription.cpp b/libs/androidfw/ConfigDescription.cpp
index 1f3a89e..19ead95 100644
--- a/libs/androidfw/ConfigDescription.cpp
+++ b/libs/androidfw/ConfigDescription.cpp
@@ -887,13 +887,16 @@
   }
 
   // Locale de-duping is not-trivial, disable for now (b/62409213).
-  if (diff(o) & CONFIG_LOCALE) {
+  // We must also disable de-duping for all configuration qualifiers with precedence higher than
+  // locale (b/171892595)
+  if (diff(o) & (CONFIG_LOCALE | CONFIG_MCC | CONFIG_MNC)) {
     return false;
   }
 
   if (*this == DefaultConfig()) {
     return true;
   }
+
   return MatchWithDensity(o) && !o.MatchWithDensity(*this) &&
          !isMoreSpecificThan(o) && !o.HasHigherPrecedenceThan(*this);
 }
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 57b8533..107d656 100755
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -3542,8 +3542,8 @@
      * @deprecated use {@link #abandonAudioFocusRequest(AudioFocusRequest)}
      */
     @SystemApi
-    @SuppressLint("Doclava125") // no permission enforcement, but only "undoes" what would have been
-                                // done by a matching requestAudioFocus
+    @SuppressLint("RequiresPermission") // no permission enforcement, but only "undoes" what would
+    // have been done by a matching requestAudioFocus
     public int abandonAudioFocus(OnAudioFocusChangeListener l, AudioAttributes aa) {
         int status = AUDIOFOCUS_REQUEST_FAILED;
         unregisterAudioFocusRequest(l);
@@ -5146,7 +5146,7 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125") // FIXME is this still used?
+    @SuppressLint("RequiresPermission") // FIXME is this still used?
     public boolean isHdmiSystemAudioSupported() {
         try {
             return getService().isHdmiSystemAudioSupported();
diff --git a/services/core/java/com/android/server/pm/OWNERS b/services/core/java/com/android/server/pm/OWNERS
index e48862e..cca2b83 100644
--- a/services/core/java/com/android/server/pm/OWNERS
+++ b/services/core/java/com/android/server/pm/OWNERS
@@ -45,17 +45,17 @@
 per-file SELinuxMMAC.java = cbrubaker@google.com, jeffv@google.com, jgalenson@google.com, nnk@google.com
 
 # shortcuts
-per-file LauncherAppsService.java = omakoto@google.com, yamasani@google.com
-per-file ShareTargetInfo.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutBitmapSaver.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutDumpFiles.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutLauncher.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutNonPersistentUser.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutPackage.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutPackageInfo.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutPackageItem.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutParser.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutRequestPinProcessor.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutService.java = omakoto@google.com, yamasani@google.com
-per-file ShortcutUser.java = omakoto@google.com, yamasani@google.com
+per-file LauncherAppsService.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShareTargetInfo.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutBitmapSaver.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutDumpFiles.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutLauncher.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutNonPersistentUser.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutPackage.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutPackageInfo.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutPackageItem.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutParser.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutRequestPinProcessor.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutService.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
+per-file ShortcutUser.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
 
diff --git a/services/core/java/com/android/server/vcn/util/PersistableBundleUtils.java b/services/core/java/com/android/server/vcn/util/PersistableBundleUtils.java
new file mode 100644
index 0000000..5c1b5ff
--- /dev/null
+++ b/services/core/java/com/android/server/vcn/util/PersistableBundleUtils.java
@@ -0,0 +1,341 @@
+/*
+ * Copyright (C) 2020 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.vcn.util;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.ParcelUuid;
+import android.os.PersistableBundle;
+
+import com.android.internal.util.HexDump;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+/** @hide */
+public class PersistableBundleUtils {
+    private static final String LIST_KEY_FORMAT = "LIST_ITEM_%d";
+    private static final String COLLECTION_SIZE_KEY = "COLLECTION_LENGTH";
+    private static final String MAP_KEY_FORMAT = "MAP_KEY_%d";
+    private static final String MAP_VALUE_FORMAT = "MAP_VALUE_%d";
+
+    private static final String PARCEL_UUID_KEY = "PARCEL_UUID";
+    private static final String BYTE_ARRAY_KEY = "BYTE_ARRAY_KEY";
+    private static final String INTEGER_KEY = "INTEGER_KEY";
+
+    /**
+     * Functional interface to convert an object of the specified type to a PersistableBundle.
+     *
+     * @param <T> the type of the source object
+     */
+    public interface Serializer<T> {
+        /**
+         * Converts this object to a PersistableBundle.
+         *
+         * @return the PersistableBundle representation of this object
+         */
+        PersistableBundle toPersistableBundle(T obj);
+    }
+
+    /**
+     * Functional interface used to create an object of the specified type from a PersistableBundle.
+     *
+     * @param <T> the type of the resultant object
+     */
+    public interface Deserializer<T> {
+        /**
+         * Creates an instance of specified type from a PersistableBundle representation.
+         *
+         * @param in the PersistableBundle representation
+         * @return an instance of the specified type
+         */
+        T fromPersistableBundle(PersistableBundle in);
+    }
+
+    /** Serializer to convert an integer to a PersistableBundle. */
+    public static final Serializer<Integer> INTEGER_SERIALIZER =
+            (i) -> {
+                final PersistableBundle result = new PersistableBundle();
+                result.putInt(INTEGER_KEY, i);
+                return result;
+            };
+
+    /** Deserializer to convert a PersistableBundle to an integer. */
+    public static final Deserializer<Integer> INTEGER_DESERIALIZER =
+            (bundle) -> {
+                Objects.requireNonNull(bundle, "PersistableBundle is null");
+                return bundle.getInt(INTEGER_KEY);
+            };
+
+    /**
+     * Converts a ParcelUuid to a PersistableBundle.
+     *
+     * <p>To avoid key collisions, NO additional key/value pairs should be added to the returned
+     * PersistableBundle object.
+     *
+     * @param uuid a ParcelUuid instance to persist
+     * @return the PersistableBundle instance
+     */
+    public static PersistableBundle fromParcelUuid(ParcelUuid uuid) {
+        final PersistableBundle result = new PersistableBundle();
+
+        result.putString(PARCEL_UUID_KEY, uuid.toString());
+
+        return result;
+    }
+
+    /**
+     * Converts from a PersistableBundle to a ParcelUuid.
+     *
+     * @param bundle the PersistableBundle containing the ParcelUuid
+     * @return the ParcelUuid instance
+     */
+    public static ParcelUuid toParcelUuid(PersistableBundle bundle) {
+        return ParcelUuid.fromString(bundle.getString(PARCEL_UUID_KEY));
+    }
+
+    /**
+     * Converts from a list of Persistable objects to a single PersistableBundle.
+     *
+     * <p>To avoid key collisions, NO additional key/value pairs should be added to the returned
+     * PersistableBundle object.
+     *
+     * @param <T> the type of the objects to convert to the PersistableBundle
+     * @param in the list of objects to be serialized into a PersistableBundle
+     * @param serializer an implementation of the {@link Serializer} functional interface that
+     *     converts an object of type T to a PersistableBundle
+     */
+    @NonNull
+    public static <T> PersistableBundle fromList(
+            @NonNull List<T> in, @NonNull Serializer<T> serializer) {
+        final PersistableBundle result = new PersistableBundle();
+
+        result.putInt(COLLECTION_SIZE_KEY, in.size());
+        for (int i = 0; i < in.size(); i++) {
+            final String key = String.format(LIST_KEY_FORMAT, i);
+            result.putPersistableBundle(key, serializer.toPersistableBundle(in.get(i)));
+        }
+        return result;
+    }
+
+    /**
+     * Converts from a PersistableBundle to a list of objects.
+     *
+     * @param <T> the type of the objects to convert from a PersistableBundle
+     * @param in the PersistableBundle containing the persisted list
+     * @param deserializer an implementation of the {@link Deserializer} functional interface that
+     *     builds the relevant type of objects.
+     */
+    @NonNull
+    public static <T> List<T> toList(
+            @NonNull PersistableBundle in, @NonNull Deserializer<T> deserializer) {
+        final int listLength = in.getInt(COLLECTION_SIZE_KEY);
+        final ArrayList<T> result = new ArrayList<>(listLength);
+
+        for (int i = 0; i < listLength; i++) {
+            final String key = String.format(LIST_KEY_FORMAT, i);
+            final PersistableBundle item = in.getPersistableBundle(key);
+
+            result.add(deserializer.fromPersistableBundle(item));
+        }
+        return result;
+    }
+
+    // TODO: b/170513329 Delete #fromByteArray and #toByteArray once BaseBundle#putByteArray and
+    // BaseBundle#getByteArray are exposed.
+
+    /**
+     * Converts a byte array to a PersistableBundle.
+     *
+     * <p>To avoid key collisions, NO additional key/value pairs should be added to the returned
+     * PersistableBundle object.
+     *
+     * @param array a byte array instance to persist
+     * @return the PersistableBundle instance
+     */
+    public static PersistableBundle fromByteArray(byte[] array) {
+        final PersistableBundle result = new PersistableBundle();
+
+        result.putString(BYTE_ARRAY_KEY, HexDump.toHexString(array));
+
+        return result;
+    }
+
+    /**
+     * Converts from a PersistableBundle to a byte array.
+     *
+     * @param bundle the PersistableBundle containing the byte array
+     * @return the byte array instance
+     */
+    public static byte[] toByteArray(PersistableBundle bundle) {
+        Objects.requireNonNull(bundle, "PersistableBundle is null");
+
+        String hex = bundle.getString(BYTE_ARRAY_KEY);
+        if (hex == null || hex.length() % 2 != 0) {
+            throw new IllegalArgumentException("PersistableBundle contains invalid byte array");
+        }
+
+        return HexDump.hexStringToByteArray(hex);
+    }
+
+    /**
+     * Converts from a Map of Persistable objects to a single PersistableBundle.
+     *
+     * <p>To avoid key collisions, NO additional key/value pairs should be added to the returned
+     * PersistableBundle object.
+     *
+     * @param <K> the type of the map-key to convert to the PersistableBundle
+     * @param <V> the type of the map-value to convert to the PersistableBundle
+     * @param in the Map of objects implementing the {@link Persistable} interface
+     * @param keySerializer an implementation of the {@link Serializer} functional interface that
+     *     converts a map-key of type T to a PersistableBundle
+     * @param valueSerializer an implementation of the {@link Serializer} functional interface that
+     *     converts a map-value of type E to a PersistableBundle
+     */
+    @NonNull
+    public static <K, V> PersistableBundle fromMap(
+            @NonNull Map<K, V> in,
+            @NonNull Serializer<K> keySerializer,
+            @NonNull Serializer<V> valueSerializer) {
+        final PersistableBundle result = new PersistableBundle();
+
+        result.putInt(COLLECTION_SIZE_KEY, in.size());
+        int i = 0;
+        for (Entry<K, V> entry : in.entrySet()) {
+            final String keyKey = String.format(MAP_KEY_FORMAT, i);
+            final String valueKey = String.format(MAP_VALUE_FORMAT, i);
+            result.putPersistableBundle(keyKey, keySerializer.toPersistableBundle(entry.getKey()));
+            result.putPersistableBundle(
+                    valueKey, valueSerializer.toPersistableBundle(entry.getValue()));
+
+            i++;
+        }
+
+        return result;
+    }
+
+    /**
+     * Converts from a PersistableBundle to a Map of objects.
+     *
+     * <p>In an attempt to preserve ordering, the returned map will be a LinkedHashMap. However, the
+     * guarantees on the ordering can only ever be as strong as the map that was serialized in
+     * {@link fromMap()}. If the initial map that was serialized had no ordering guarantees, the
+     * deserialized map similarly may be of a non-deterministic order.
+     *
+     * @param <K> the type of the map-key to convert from a PersistableBundle
+     * @param <V> the type of the map-value to convert from a PersistableBundle
+     * @param in the PersistableBundle containing the persisted Map
+     * @param keyDeserializer an implementation of the {@link Deserializer} functional interface
+     *     that builds the relevant type of map-key.
+     * @param valueDeserializer an implementation of the {@link Deserializer} functional interface
+     *     that builds the relevant type of map-value.
+     * @return An instance of the parsed map as a LinkedHashMap (in an attempt to preserve
+     *     ordering).
+     */
+    @NonNull
+    public static <K, V> LinkedHashMap<K, V> toMap(
+            @NonNull PersistableBundle in,
+            @NonNull Deserializer<K> keyDeserializer,
+            @NonNull Deserializer<V> valueDeserializer) {
+        final int mapSize = in.getInt(COLLECTION_SIZE_KEY);
+        final LinkedHashMap<K, V> result = new LinkedHashMap<>(mapSize);
+
+        for (int i = 0; i < mapSize; i++) {
+            final String keyKey = String.format(MAP_KEY_FORMAT, i);
+            final String valueKey = String.format(MAP_VALUE_FORMAT, i);
+            final PersistableBundle keyBundle = in.getPersistableBundle(keyKey);
+            final PersistableBundle valueBundle = in.getPersistableBundle(valueKey);
+
+            final K key = keyDeserializer.fromPersistableBundle(keyBundle);
+            final V value = valueDeserializer.fromPersistableBundle(valueBundle);
+            result.put(key, value);
+        }
+        return result;
+    }
+
+    /**
+     * Ensures safe reading and writing of {@link PersistableBundle}s to and from disk.
+     *
+     * <p>This class will enforce exclusion between reads and writes using the standard semantics of
+     * a ReadWriteLock. Specifically, concurrent readers ARE allowed, but reads/writes from/to the
+     * file are mutually exclusive. In other words, for an unbounded number n, the acceptable states
+     * are n readers, OR 1 writer (but not both).
+     */
+    public static class LockingReadWriteHelper {
+        private final ReadWriteLock mDiskLock = new ReentrantReadWriteLock();
+        private final String mPath;
+
+        public LockingReadWriteHelper(@NonNull String path) {
+            mPath = Objects.requireNonNull(path, "fileName was null");
+        }
+
+        /**
+         * Reads the {@link PersistableBundle} from the disk.
+         *
+         * @return the PersistableBundle, if the file existed, or null otherwise
+         */
+        @Nullable
+        public PersistableBundle readFromDisk() throws IOException {
+            try {
+                mDiskLock.readLock().lock();
+                final File file = new File(mPath);
+                if (!file.exists()) {
+                    return null;
+                }
+
+                try (FileInputStream fis = new FileInputStream(file)) {
+                    return PersistableBundle.readFromStream(fis);
+                }
+            } finally {
+                mDiskLock.readLock().unlock();
+            }
+        }
+
+        /**
+         * Writes a {@link PersistableBundle} to disk.
+         *
+         * @param bundle the {@link PersistableBundle} to write to disk
+         */
+        public void writeToDisk(@NonNull PersistableBundle bundle) throws IOException {
+            Objects.requireNonNull(bundle, "bundle was null");
+
+            try {
+                mDiskLock.writeLock().lock();
+                final File file = new File(mPath);
+                if (!file.exists()) {
+                    file.getParentFile().mkdirs();
+                }
+
+                try (FileOutputStream fos = new FileOutputStream(file)) {
+                    bundle.writeToStream(fos);
+                }
+            } finally {
+                mDiskLock.writeLock().unlock();
+            }
+        }
+    }
+}
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index fbb1701d..da2d4d8 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -1228,7 +1228,7 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public List<PhoneAccountHandle> getPhoneAccountsForPackage() {
         try {
             if (isServiceConnected()) {
@@ -1356,7 +1356,7 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void clearPhoneAccounts() {
         clearAccounts();
     }
@@ -1366,7 +1366,7 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void clearAccounts() {
         try {
             if (isServiceConnected()) {
@@ -1398,7 +1398,7 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public ComponentName getDefaultPhoneApp() {
         try {
             if (isServiceConnected()) {
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 2ffc14e..0c0943d 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -4782,7 +4782,7 @@
      */
     @NonNull
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public static PersistableBundle getDefaultConfig() {
         return new PersistableBundle(sDefaults);
     }
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 9243467..6f88cbd 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -4656,7 +4656,7 @@
      * be implemented instead.
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void setVisualVoicemailEnabled(PhoneAccountHandle phoneAccountHandle, boolean enabled){
     }
 
@@ -4671,7 +4671,7 @@
      */
     @SystemApi
     @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public boolean isVisualVoicemailEnabled(PhoneAccountHandle phoneAccountHandle){
         return false;
     }
@@ -4690,7 +4690,7 @@
      * @hide
      */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     @Nullable
     public Bundle getVisualVoicemailSettings(){
         try {
@@ -8524,7 +8524,7 @@
 
     /** @hide */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public int checkCarrierPrivilegesForPackage(String pkgName) {
         try {
             ITelephony telephony = getITelephony();
@@ -8540,7 +8540,7 @@
 
     /** @hide */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public int checkCarrierPrivilegesForPackageAnyPhone(String pkgName) {
         try {
             ITelephony telephony = getITelephony();
@@ -8616,7 +8616,7 @@
 
     /** @hide */
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void dial(String number) {
         try {
             ITelephony telephony = getITelephony();
@@ -8675,7 +8675,7 @@
      */
     @Deprecated
     @SystemApi
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void silenceRinger() {
         // No-op
     }
diff --git a/tests/vcn/java/com/android/server/vcn/util/PersistableBundleUtilsTest.java b/tests/vcn/java/com/android/server/vcn/util/PersistableBundleUtilsTest.java
new file mode 100644
index 0000000..a44a734
--- /dev/null
+++ b/tests/vcn/java/com/android/server/vcn/util/PersistableBundleUtilsTest.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright (C) 2020 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.vcn.util;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import android.os.PersistableBundle;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Objects;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class PersistableBundleUtilsTest {
+    private static final String TEST_KEY = "testKey";
+    private static final String TEST_STRING_PREFIX = "testString";
+    private static final int[] TEST_INT_ARRAY = new int[] {0, 1, 2, 3, 4};
+
+    private static final int NUM_COLLECTION_ENTRIES = 10;
+
+    private static class TestKey {
+        private static final String TEST_INTEGER_KEY =
+                "mTestInteger"; // Purposely colliding with keys of test class to ensure namespacing
+        private final int mTestInteger;
+
+        TestKey(int testInteger) {
+            mTestInteger = testInteger;
+        }
+
+        TestKey(PersistableBundle in) {
+            mTestInteger = in.getInt(TEST_INTEGER_KEY);
+        }
+
+        public PersistableBundle toPersistableBundle() {
+            final PersistableBundle result = new PersistableBundle();
+
+            result.putInt(TEST_INTEGER_KEY, mTestInteger);
+
+            return result;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(mTestInteger);
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (!(o instanceof TestKey)) {
+                return false;
+            }
+
+            final TestKey other = (TestKey) o;
+            return mTestInteger == other.mTestInteger;
+        }
+    }
+
+    private static class TestClass {
+        private static final String TEST_INTEGER_KEY = "mTestInteger";
+        private final int mTestInteger;
+
+        private static final String TEST_INT_ARRAY_KEY = "mTestIntArray";
+        private final int[] mTestIntArray;
+
+        private static final String TEST_STRING_KEY = "mTestString";
+        private final String mTestString;
+
+        private static final String TEST_PERSISTABLE_BUNDLE_KEY = "mTestPersistableBundle";
+        private final PersistableBundle mTestPersistableBundle;
+
+        TestClass(
+                int testInteger,
+                int[] testIntArray,
+                String testString,
+                PersistableBundle testPersistableBundle) {
+            mTestInteger = testInteger;
+            mTestIntArray = testIntArray;
+            mTestString = testString;
+            mTestPersistableBundle = testPersistableBundle;
+        }
+
+        TestClass(PersistableBundle in) {
+            mTestInteger = in.getInt(TEST_INTEGER_KEY);
+            mTestIntArray = in.getIntArray(TEST_INT_ARRAY_KEY);
+            mTestString = in.getString(TEST_STRING_KEY);
+            mTestPersistableBundle = in.getPersistableBundle(TEST_PERSISTABLE_BUNDLE_KEY);
+        }
+
+        public PersistableBundle toPersistableBundle() {
+            final PersistableBundle result = new PersistableBundle();
+
+            result.putInt(TEST_INTEGER_KEY, mTestInteger);
+            result.putIntArray(TEST_INT_ARRAY_KEY, mTestIntArray);
+            result.putString(TEST_STRING_KEY, mTestString);
+            result.putPersistableBundle(TEST_PERSISTABLE_BUNDLE_KEY, mTestPersistableBundle);
+
+            return result;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(
+                    mTestInteger,
+                    Arrays.hashCode(mTestIntArray),
+                    mTestString,
+                    mTestPersistableBundle);
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (!(o instanceof TestClass)) {
+                return false;
+            }
+
+            final TestClass other = (TestClass) o;
+
+            // TODO: Add a proper equals() to PersistableBundle. But in the meantime, force
+            // TODO: unparcelling in order to allow test comparison.
+            if (mTestPersistableBundle.size() != other.mTestPersistableBundle.size()) {
+                return false;
+            }
+
+            return mTestInteger == other.mTestInteger
+                    && Arrays.equals(mTestIntArray, other.mTestIntArray)
+                    && mTestString.equals(other.mTestString)
+                    && mTestPersistableBundle.kindofEquals(other.mTestPersistableBundle);
+        }
+    }
+
+    @Test
+    public void testListConversionLossless() throws Exception {
+        final List<TestClass> sourceList = new ArrayList<>();
+        for (int i = 0; i < NUM_COLLECTION_ENTRIES; i++) {
+            final PersistableBundle innerBundle = new PersistableBundle();
+            innerBundle.putInt(TEST_KEY, i);
+
+            sourceList.add(new TestClass(i, TEST_INT_ARRAY, TEST_STRING_PREFIX + i, innerBundle));
+        }
+
+        final PersistableBundle bundled =
+                PersistableBundleUtils.fromList(sourceList, TestClass::toPersistableBundle);
+        final List<TestClass> resultList = PersistableBundleUtils.toList(bundled, TestClass::new);
+
+        assertEquals(sourceList, resultList);
+    }
+
+    @Test
+    public void testMapConversionLossless() throws Exception {
+        final LinkedHashMap<TestKey, TestClass> sourceMap = new LinkedHashMap<>();
+        for (int i = 0; i < NUM_COLLECTION_ENTRIES; i++) {
+            final TestKey key = new TestKey(i * i);
+
+            final PersistableBundle innerBundle = new PersistableBundle();
+            innerBundle.putInt(TEST_KEY, i);
+            final TestClass value =
+                    new TestClass(i, TEST_INT_ARRAY, TEST_STRING_PREFIX + i, innerBundle);
+
+            sourceMap.put(key, value);
+        }
+
+        final PersistableBundle bundled =
+                PersistableBundleUtils.fromMap(
+                        sourceMap, TestKey::toPersistableBundle, TestClass::toPersistableBundle);
+        final LinkedHashMap<TestKey, TestClass> resultList =
+                PersistableBundleUtils.toMap(bundled, TestKey::new, TestClass::new);
+
+        assertEquals(sourceMap, resultList);
+    }
+
+    @Test
+    public void testByteArrayConversionLossless() {
+        final byte[] byteArray = "testByteArrayConversionLossless".getBytes();
+
+        PersistableBundle bundle = PersistableBundleUtils.fromByteArray(byteArray);
+        byte[] result = PersistableBundleUtils.toByteArray(bundle);
+
+        assertArrayEquals(byteArray, result);
+    }
+
+    @Test
+    public void testIntegerConversionLossless() throws Exception {
+        final int testInt = 1;
+        final PersistableBundle integerBundle =
+                PersistableBundleUtils.INTEGER_SERIALIZER.toPersistableBundle(testInt);
+        final int result =
+                PersistableBundleUtils.INTEGER_DESERIALIZER.fromPersistableBundle(integerBundle);
+
+        assertEquals(testInt, result);
+    }
+}
diff --git a/tools/aapt2/DominatorTree_test.cpp b/tools/aapt2/DominatorTree_test.cpp
index 3e49034..52949da 100644
--- a/tools/aapt2/DominatorTree_test.cpp
+++ b/tools/aapt2/DominatorTree_test.cpp
@@ -198,5 +198,33 @@
   EXPECT_EQ(expected, printer.ToString(&tree));
 }
 
+TEST(DominatorTreeTest, MccMncIsPeertoLocale) {
+  const ConfigDescription default_config = {};
+  const ConfigDescription de_config = test::ParseConfigOrDie("de");
+  const ConfigDescription fr_config = test::ParseConfigOrDie("fr");
+  const ConfigDescription mcc_config = test::ParseConfigOrDie("mcc262");
+  const ConfigDescription mcc_fr_config = test::ParseConfigOrDie("mcc262-fr");
+  const ConfigDescription mnc_config = test::ParseConfigOrDie("mnc2");
+  const ConfigDescription mnc_fr_config = test::ParseConfigOrDie("mnc2-fr");
+  std::vector<std::unique_ptr<ResourceConfigValue>> configs;
+  configs.push_back(util::make_unique<ResourceConfigValue>(default_config, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(de_config, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(fr_config, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(mcc_config, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(mcc_fr_config, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(mnc_config, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(mnc_fr_config, ""));
+  DominatorTree tree(configs);
+  PrettyPrinter printer;
+  std::string expected =
+      "<default>\n"
+      "de\n"
+      "fr\n"
+      "mcc262\n"
+      "mcc262-fr\n"
+      "mnc2\n"
+      "mnc2-fr\n";
+  EXPECT_EQ(expected, printer.ToString(&tree));
+}
 
 }  // namespace aapt
diff --git a/tools/aapt2/optimize/ResourceDeduper_test.cpp b/tools/aapt2/optimize/ResourceDeduper_test.cpp
index 048e318..888de40 100644
--- a/tools/aapt2/optimize/ResourceDeduper_test.cpp
+++ b/tools/aapt2/optimize/ResourceDeduper_test.cpp
@@ -52,9 +52,11 @@
           .Build();
 
   ASSERT_TRUE(ResourceDeduper().Consume(context.get(), table.get()));
+  EXPECT_THAT(table, HasValue("android:string/dedupe", default_config));
   EXPECT_THAT(table, Not(HasValue("android:string/dedupe", ldrtl_config)));
   EXPECT_THAT(table, Not(HasValue("android:string/dedupe", land_config)));
 
+  EXPECT_THAT(table, HasValue("android:string/dedupe2", default_config));
   EXPECT_THAT(table, HasValue("android:string/dedupe2", ldrtl_v21_config));
   EXPECT_THAT(table, Not(HasValue("android:string/dedupe2", ldrtl_config)));
 
@@ -151,4 +153,24 @@
   EXPECT_THAT(table, HasValue("android:string/keep", fr_rCA_config));
 }
 
+TEST(ResourceDeduperTest, MccMncValuesAreKept) {
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+  const ConfigDescription default_config = {};
+  const ConfigDescription mcc_config = test::ParseConfigOrDie("mcc262");
+  const ConfigDescription mnc_config = test::ParseConfigOrDie("mnc2");
+
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .AddString("android:string/keep", ResourceId{}, default_config, "keep")
+          .AddString("android:string/keep", ResourceId{}, mcc_config, "keep")
+          .AddString("android:string/keep", ResourceId{}, mnc_config, "keep")
+          .Build();
+
+  ASSERT_TRUE(ResourceDeduper().Consume(context.get(), table.get()));
+  EXPECT_THAT(table, HasValue("android:string/keep", default_config));
+  EXPECT_THAT(table, HasValue("android:string/keep", mcc_config));
+  EXPECT_THAT(table, HasValue("android:string/keep", mnc_config));
+}
+
+
 }  // namespace aapt
diff --git a/wifi/java/android/net/wifi/RttManager.java b/wifi/java/android/net/wifi/RttManager.java
index 73c52ab..034defb 100644
--- a/wifi/java/android/net/wifi/RttManager.java
+++ b/wifi/java/android/net/wifi/RttManager.java
@@ -173,7 +173,7 @@
 
     /** @deprecated Use the new {@link android.net.wifi.RttManager#getRttCapabilities()} API.*/
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public Capabilities getCapabilities() {
         throw new UnsupportedOperationException(
                 "getCapabilities is not supported in the adaptation layer");
diff --git a/wifi/java/android/net/wifi/WifiScanner.java b/wifi/java/android/net/wifi/WifiScanner.java
index 94771ac..4163c88 100644
--- a/wifi/java/android/net/wifi/WifiScanner.java
+++ b/wifi/java/android/net/wifi/WifiScanner.java
@@ -1239,7 +1239,7 @@
      * @param bssidInfos access points to watch
      */
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void configureWifiChange(
             int rssiSampleSize,                             /* sample size for RSSI averaging */
             int lostApSampleSize,                           /* samples to confirm AP's loss */
@@ -1273,7 +1273,7 @@
      *                 provided on {@link #stopTrackingWifiChange}
      */
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void startTrackingWifiChange(WifiChangeListener listener) {
         throw new UnsupportedOperationException();
     }
@@ -1284,7 +1284,7 @@
      * #stopTrackingWifiChange}
      */
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void stopTrackingWifiChange(WifiChangeListener listener) {
         throw new UnsupportedOperationException();
     }
@@ -1292,7 +1292,7 @@
     /** @hide */
     @SystemApi
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void configureWifiChange(WifiChangeSettings settings) {
         throw new UnsupportedOperationException();
     }
@@ -1348,7 +1348,7 @@
      *                 also be provided on {@link #stopTrackingBssids}
      */
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void startTrackingBssids(BssidInfo[] bssidInfos,
                                     int apLostThreshold, BssidListener listener) {
         throw new UnsupportedOperationException();
@@ -1359,7 +1359,7 @@
      * @param listener same object provided in {@link #startTrackingBssids}
      */
     @Deprecated
-    @SuppressLint("Doclava125")
+    @SuppressLint("RequiresPermission")
     public void stopTrackingBssids(BssidListener listener) {
         throw new UnsupportedOperationException();
     }