Merge "Add cancel button to long screenshot UI" into sc-dev
diff --git a/Android.bp b/Android.bp
index 71023bf..c450acf 100644
--- a/Android.bp
+++ b/Android.bp
@@ -104,6 +104,7 @@
         ":android.security.apc-java-source",
         ":android.security.authorization-java-source",
         ":android.security.maintenance-java-source",
+        ":android.security.metrics-java-source",
         ":android.security.vpnprofilestore-java-source",
         ":android.system.keystore2-V1-java-source",
         ":credstore_aidl",
diff --git a/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTest.java b/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTest.java
index 689fb36..21c4491 100644
--- a/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTest.java
+++ b/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTest.java
@@ -18,6 +18,7 @@
 
 import static android.perftests.utils.ManualBenchmarkState.StatsReport;
 import static android.perftests.utils.PerfTestActivity.ID_EDITOR;
+import static android.perftests.utils.TestUtils.getOnMainSync;
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.view.WindowInsetsAnimation.Callback.DISPATCH_MODE_STOP;
 
@@ -25,6 +26,7 @@
 
 import static org.junit.Assert.assertTrue;
 
+import android.annotation.UiThread;
 import android.app.Activity;
 import android.content.ComponentName;
 import android.content.Context;
@@ -64,6 +66,7 @@
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
 
@@ -72,6 +75,7 @@
 public class ImePerfTest extends ImePerfTestBase
         implements ManualBenchmarkState.CustomizedIterationListener {
     private static final String TAG = ImePerfTest.class.getSimpleName();
+    private static final long ANIMATION_NOT_STARTED = -1;
 
     @Rule
     public final PerfManualStatusReporter mPerfStatusReporter = new PerfManualStatusReporter();
@@ -304,12 +308,18 @@
                 latchEnd.set(new CountDownLatch(2));
                 // For measuring hide, lets show IME first.
                 if (!show) {
-                    activity.runOnUiThread(() -> {
-                        controller.show(WindowInsets.Type.ime());
+                    AtomicBoolean showCalled = new AtomicBoolean();
+                    getInstrumentation().runOnMainSync(() -> {
+                        if (!isImeVisible(activity)) {
+                            controller.show(WindowInsets.Type.ime());
+                            showCalled.set(true);
+                        }
                     });
-                    PollingCheck.check("IME show animation should finish ", TIMEOUT_1_S_IN_MS,
-                            () -> latchStart.get().getCount() == 1
-                                    && latchEnd.get().getCount() == 1);
+                    if (showCalled.get()) {
+                        PollingCheck.check("IME show animation should finish ", TIMEOUT_1_S_IN_MS,
+                                () -> latchStart.get().getCount() == 1
+                                        && latchEnd.get().getCount() == 1);
+                    }
                 }
                 if (!mIsTraceStarted && !state.isWarmingUp()) {
                     startAsyncAtrace();
@@ -317,23 +327,35 @@
                 }
 
                 AtomicLong startTime = new AtomicLong();
-                activity.runOnUiThread(() -> {
+                AtomicBoolean unexpectedVisibility = new AtomicBoolean();
+                getInstrumentation().runOnMainSync(() -> {
+                    boolean isVisible = isImeVisible(activity);
                     startTime.set(SystemClock.elapsedRealtimeNanos());
-                    if (show) {
+
+                    if (show && !isVisible) {
                         controller.show(WindowInsets.Type.ime());
-                    } else {
+                    } else if (!show && isVisible) {
                         controller.hide(WindowInsets.Type.ime());
+                    } else {
+                        // ignore this iteration as unexpected IME visibility was encountered.
+                        unexpectedVisibility.set(true);
                     }
                 });
 
-                measuredTimeNs = waitForAnimationStart(latchStart, startTime);
+                if (!unexpectedVisibility.get()) {
+                    long timeElapsed = waitForAnimationStart(latchStart, startTime);
+                    if (timeElapsed != ANIMATION_NOT_STARTED) {
+                        measuredTimeNs = timeElapsed;
+                    }
+                }
 
                 // hide IME before next iteration.
                 if (show) {
                     activity.runOnUiThread(() -> controller.hide(WindowInsets.Type.ime()));
                     try {
                         latchEnd.get().await(TIMEOUT_1_S_IN_MS * 5, TimeUnit.MILLISECONDS);
-                        if (latchEnd.get().getCount() != 0) {
+                        if (latchEnd.get().getCount() != 0
+                                && getOnMainSync(() -> isImeVisible(activity))) {
                             Assert.fail("IME hide animation should finish.");
                         }
                     } catch (InterruptedException e) {
@@ -350,12 +372,18 @@
         addResultToState(state);
     }
 
+    @UiThread
+    private boolean isImeVisible(@NonNull final Activity activity) {
+        return activity.getWindow().getDecorView().getRootWindowInsets().isVisible(
+                WindowInsets.Type.ime());
+    }
+
     private long waitForAnimationStart(
             AtomicReference<CountDownLatch> latchStart, AtomicLong startTime) {
         try {
             latchStart.get().await(TIMEOUT_1_S_IN_MS * 5, TimeUnit.MILLISECONDS);
             if (latchStart.get().getCount() != 0) {
-                Assert.fail("IME animation should start " + latchStart.get().getCount());
+                return ANIMATION_NOT_STARTED;
             }
         } catch (InterruptedException e) { }
 
diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/TestUtils.java b/apct-tests/perftests/utils/src/android/perftests/utils/TestUtils.java
new file mode 100644
index 0000000..d8d3ee3
--- /dev/null
+++ b/apct-tests/perftests/utils/src/android/perftests/utils/TestUtils.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.perftests.utils;
+
+import android.app.Instrumentation;
+
+import androidx.annotation.NonNull;
+import androidx.test.InstrumentationRegistry;
+
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Supplier;
+
+public final class TestUtils {
+
+    /**
+     * Retrieves a value that needs to be obtained on the main thread.
+     *
+     * <p>A simple utility method that helps to return an object from the UI thread.</p>
+     *
+     * @param supplier callback to be called on the UI thread to return a value
+     * @param <T> Type of the value to be returned
+     * @return Value returned from {@code supplier}
+     */
+    public static <T> T getOnMainSync(@NonNull Supplier<T> supplier) {
+        final AtomicReference<T> result = new AtomicReference<>();
+        final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        instrumentation.runOnMainSync(() -> result.set(supplier.get()));
+        return result.get();
+    }
+}
diff --git a/apex/appsearch/Android.bp b/apex/appsearch/Android.bp
index 8278426..ac97e04 100644
--- a/apex/appsearch/Android.bp
+++ b/apex/appsearch/Android.bp
@@ -50,6 +50,20 @@
     name: "com.android.appsearch-bootclasspath-fragment",
     contents: ["framework-appsearch"],
     apex_available: ["com.android.appsearch"],
+
+    // The bootclasspath_fragments that provide APIs on which this depends.
+    fragments: [
+        {
+            apex: "com.android.art",
+            module: "art-bootclasspath-fragment",
+        },
+    ],
+
+    // Additional stubs libraries that this fragment's contents use which are
+    // not provided by another bootclasspath_fragment.
+    additional_stubs: [
+        "android-non-updatable",
+    ],
 }
 
 // Encapsulate the contributions made by the com.android.appsearch to the systemserverclasspath.
diff --git a/apex/jobscheduler/framework/java/android/app/AlarmManager.java b/apex/jobscheduler/framework/java/android/app/AlarmManager.java
index 4843415..9c0c365 100644
--- a/apex/jobscheduler/framework/java/android/app/AlarmManager.java
+++ b/apex/jobscheduler/framework/java/android/app/AlarmManager.java
@@ -494,6 +494,9 @@
      * exact alarms, rescheduling each time as described above. Legacy applications
      * whose {@code targetSdkVersion} is earlier than API 19 will continue to have all
      * of their alarms, including repeating alarms, treated as exact.
+     * <p>Apps targeting {@link Build.VERSION_CODES#S} will need to set the flag
+     * {@link PendingIntent#FLAG_MUTABLE} on the {@link PendingIntent} being used to set this alarm,
+     * if they want the alarm count to be supplied with the key {@link Intent#EXTRA_ALARM_COUNT}.
      *
      * @param type type of alarm.
      * @param triggerAtMillis time in milliseconds that the alarm should first
@@ -516,6 +519,7 @@
      * @see #ELAPSED_REALTIME_WAKEUP
      * @see #RTC
      * @see #RTC_WAKEUP
+     * @see Intent#EXTRA_ALARM_COUNT
      */
     public void setRepeating(@AlarmType int type, long triggerAtMillis,
             long intervalMillis, PendingIntent operation) {
@@ -1004,6 +1008,9 @@
      * been available since API 3, your application can safely call it and be
      * assured that it will get similar behavior on both current and older versions
      * of Android.
+     * <p>Apps targeting {@link Build.VERSION_CODES#S} will need to set the flag
+     * {@link PendingIntent#FLAG_MUTABLE} on the {@link PendingIntent} being used to set this alarm,
+     * if they want the alarm count to be supplied with the key {@link Intent#EXTRA_ALARM_COUNT}.
      *
      * @param type type of alarm.
      * @param triggerAtMillis time in milliseconds that the alarm should first
@@ -1038,6 +1045,7 @@
      * @see #INTERVAL_HOUR
      * @see #INTERVAL_HALF_DAY
      * @see #INTERVAL_DAY
+     * @see Intent#EXTRA_ALARM_COUNT
      */
     public void setInexactRepeating(@AlarmType int type, long triggerAtMillis,
             long intervalMillis, PendingIntent operation) {
@@ -1286,22 +1294,31 @@
 
     /**
      * Called to check if the caller can schedule exact alarms.
+     * Your app schedules exact alarms when it calls any of the {@code setExact...} or
+     * {@link #setAlarmClock(AlarmClockInfo, PendingIntent) setAlarmClock} API methods.
      * <p>
-     * Apps targeting {@link Build.VERSION_CODES#S} or higher can schedule exact alarms if they
-     * have the {@link Manifest.permission#SCHEDULE_EXACT_ALARM} permission. These apps can also
+     * Apps targeting {@link Build.VERSION_CODES#S} or higher can schedule exact alarms only if they
+     * have the {@link Manifest.permission#SCHEDULE_EXACT_ALARM} permission or they are on the
+     * device's power-save exemption list.
+     * These apps can also
      * start {@link android.provider.Settings#ACTION_REQUEST_SCHEDULE_EXACT_ALARM} to
-     * request this from the user.
+     * request this permission from the user.
      * <p>
      * Apps targeting lower sdk versions, can always schedule exact alarms.
      *
-     * @return {@code true} if the caller can schedule exact alarms.
+     * @return {@code true} if the caller can schedule exact alarms, {@code false} otherwise.
      * @see android.provider.Settings#ACTION_REQUEST_SCHEDULE_EXACT_ALARM
      * @see #setExact(int, long, PendingIntent)
      * @see #setExactAndAllowWhileIdle(int, long, PendingIntent)
      * @see #setAlarmClock(AlarmClockInfo, PendingIntent)
+     * @see android.os.PowerManager#isIgnoringBatteryOptimizations(String)
      */
     public boolean canScheduleExactAlarms() {
-        return hasScheduleExactAlarm(mContext.getOpPackageName(), mContext.getUserId());
+        try {
+            return mService.canScheduleExactAlarms(mContext.getOpPackageName());
+        } catch (RemoteException re) {
+            throw re.rethrowFromSystemServer();
+        }
     }
 
     /**
diff --git a/apex/jobscheduler/framework/java/android/app/IAlarmManager.aidl b/apex/jobscheduler/framework/java/android/app/IAlarmManager.aidl
index cd7c1e8..9d11ca4 100644
--- a/apex/jobscheduler/framework/java/android/app/IAlarmManager.aidl
+++ b/apex/jobscheduler/framework/java/android/app/IAlarmManager.aidl
@@ -41,6 +41,7 @@
     @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
     AlarmManager.AlarmClockInfo getNextAlarmClock(int userId);
     long currentNetworkTimeMillis();
+    boolean canScheduleExactAlarms(String packageName);
     boolean hasScheduleExactAlarm(String packageName, int userId);
     int getConfigVersion();
 }
diff --git a/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java b/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java
index 42e953b..a1a46af 100644
--- a/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java
+++ b/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java
@@ -190,6 +190,8 @@
      * @hide
      */
     public static final int REASON_TEMP_ALLOWED_WHILE_IN_USE = 70;
+    /** @hide */
+    public static final int REASON_CURRENT_INPUT_METHOD = 71;
 
     /* BG-FGS-launch is allowed by temp-allow-list or system-allow-list.
        Reason code for temp and system allow list starts here.
@@ -381,6 +383,7 @@
             REASON_ACTIVITY_VISIBILITY_GRACE_PERIOD,
             REASON_OP_ACTIVATE_VPN,
             REASON_OP_ACTIVATE_PLATFORM_VPN,
+            REASON_CURRENT_INPUT_METHOD,
             REASON_TEMP_ALLOWED_WHILE_IN_USE,
             // temp and system allow list reasons.
             REASON_GEOFENCING,
@@ -649,6 +652,8 @@
                 return "OP_ACTIVATE_VPN";
             case REASON_OP_ACTIVATE_PLATFORM_VPN:
                 return "OP_ACTIVATE_PLATFORM_VPN";
+            case REASON_CURRENT_INPUT_METHOD:
+                return "CURRENT_INPUT_METHOD";
             case REASON_TEMP_ALLOWED_WHILE_IN_USE:
                 return "TEMP_ALLOWED_WHILE_IN_USE";
             case REASON_GEOFENCING:
diff --git a/apex/jobscheduler/framework/java/com/android/server/AppStateTracker.java b/apex/jobscheduler/framework/java/com/android/server/AppStateTracker.java
index 3c89016..b0b9abc 100644
--- a/apex/jobscheduler/framework/java/com/android/server/AppStateTracker.java
+++ b/apex/jobscheduler/framework/java/com/android/server/AppStateTracker.java
@@ -25,29 +25,19 @@
     String TAG = "AppStateTracker";
 
     /**
-     * Register a {@link ForcedAppStandbyListener} to listen for forced-app-standby changes that
-     * should affect services etc.
+     * Register a {@link ServiceStateListener} to listen for forced-app-standby changes that should
+     * affect services.
      */
-    void addForcedAppStandbyListener(@NonNull ForcedAppStandbyListener listener);
+    void addServiceStateListener(@NonNull ServiceStateListener listener);
 
     /**
-     * @return {code true} if the given UID/package has been in forced app standby mode.
+     * A listener to listen to forced-app-standby changes that should affect services.
      */
-    boolean isAppInForcedAppStandby(int uid, @NonNull String packageName);
-
-    /**
-     * A listener to listen to forced-app-standby changes that should affect services etc.
-     */
-    interface ForcedAppStandbyListener {
+    interface ServiceStateListener {
         /**
-         * Called when an app goes in/out of forced app standby.
+         * Called when an app goes into forced app standby and its foreground
+         * services need to be removed from that state.
          */
-        void updateForceAppStandbyForUidPackage(int uid, String packageName, boolean standby);
-
-        /**
-         * Called when all apps' forced-app-standby states need to be re-evaluated, due to
-         * enable/disable certain feature flags.
-         */
-        void updateForcedAppStandbyForAllApps();
+        void stopForegroundServicesForUidPackage(int uid, String packageName);
     }
 }
diff --git a/apex/jobscheduler/service/java/com/android/server/AppStateTrackerImpl.java b/apex/jobscheduler/service/java/com/android/server/AppStateTrackerImpl.java
index 1deb365..c332a59 100644
--- a/apex/jobscheduler/service/java/com/android/server/AppStateTrackerImpl.java
+++ b/apex/jobscheduler/service/java/com/android/server/AppStateTrackerImpl.java
@@ -60,10 +60,8 @@
 
 import java.io.PrintWriter;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
-import java.util.Set;
 
 /**
  * Class to keep track of the information related to "force app standby", which includes:
@@ -162,46 +160,16 @@
     @GuardedBy("mLock")
     boolean mForcedAppStandbyEnabled;
 
-    /**
-     * A lock-free set of (uid, packageName) pairs in forced app standby mode.
-     *
-     * <p>
-     * It's bascially shadowing the {@link #mRunAnyRestrictedPackages} together with
-     * the {@link #mForcedAppStandbyEnabled} and the {@link #mForceAllAppsStandby} - mutations on
-     * them would result in copy-on-write.
-     *
-     * Note: when {@link #mForcedAppStandbyEnabled} is {@code false}, it'll be set to an empty set.
-     *       when {@link #mForceAllAppsStandby} is {@code true}, it'll be set to null;
-     * </p>
-     */
-    volatile Set<Pair<Integer, String>> mForcedAppStandbyUidPackages = Collections.emptySet();
-
     @Override
-    public void addForcedAppStandbyListener(@NonNull ForcedAppStandbyListener listener) {
+    public void addServiceStateListener(@NonNull ServiceStateListener listener) {
         addListener(new Listener() {
             @Override
-            public void updateForceAppStandbyForUidPackage(int uid, String packageName,
-                    boolean standby) {
-                listener.updateForceAppStandbyForUidPackage(uid, packageName, standby);
-            }
-
-            @Override
-            public void updateForcedAppStandbyForAllApps() {
-                listener.updateForcedAppStandbyForAllApps();
+            public void stopForegroundServicesForUidPackage(int uid, String packageName) {
+                listener.stopForegroundServicesForUidPackage(uid, packageName);
             }
         });
     }
 
-    @Override
-    public boolean isAppInForcedAppStandby(int uid, @NonNull String packageName) {
-        final Set<Pair<Integer, String>> fasUidPkgs = mForcedAppStandbyUidPackages;
-        if (fasUidPkgs == null) {
-            // Meaning the mForceAllAppsStandby is true.
-            return true;
-        }
-        return fasUidPkgs.contains(Pair.create(uid, packageName));
-    }
-
     interface Stats {
         int UID_FG_STATE_CHANGED = 0;
         int UID_ACTIVE_STATE_CHANGED = 1;
@@ -265,7 +233,6 @@
                         return;
                     }
                     mForcedAppStandbyEnabled = enabled;
-                    updateForcedAppStandbyUidPackagesLocked();
                     if (DEBUG) {
                         Slog.d(TAG, "Forced app standby feature flag changed: "
                                 + mForcedAppStandbyEnabled);
@@ -310,11 +277,7 @@
             if (!sender.isRunAnyInBackgroundAppOpsAllowed(uid, packageName)) {
                 Slog.v(TAG, "Package " + packageName + "/" + uid
                         + " toggled into fg service restriction");
-                updateForceAppStandbyForUidPackage(uid, packageName, true);
-            } else {
-                Slog.v(TAG, "Package " + packageName + "/" + uid
-                        + " toggled out of fg service restriction");
-                updateForceAppStandbyForUidPackage(uid, packageName, false);
+                stopForegroundServicesForUidPackage(uid, packageName);
             }
         }
 
@@ -379,7 +342,6 @@
         private void onForceAllAppsStandbyChanged(AppStateTrackerImpl sender) {
             updateAllJobs();
             updateAllAlarms();
-            updateForcedAppStandbyForAllApps();
         }
 
         /**
@@ -404,17 +366,10 @@
         }
 
         /**
-         * Called when an app goes in/out of forced app standby.
+         * Called when an app goes into forced app standby and its foreground
+         * services need to be removed from that state.
          */
-        public void updateForceAppStandbyForUidPackage(int uid, String packageName,
-                boolean standby) {
-        }
-
-        /**
-         * Called when all apps' forced-app-standby states need to be re-evaluated due to changes of
-         * feature flags such as {@link #mForcedAppStandbyEnabled} or {@link #mForceAllAppsStandby}.
-         */
-        public void updateForcedAppStandbyForAllApps() {
+        public void stopForegroundServicesForUidPackage(int uid, String packageName) {
         }
 
         /**
@@ -483,12 +438,9 @@
                         final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
                         // No need to notify for state change as all the alarms and jobs should be
                         // removed too.
-                        synchronized (mLock) {
-                            mExemptedBucketPackages.remove(userId, pkgName);
-                            mRunAnyRestrictedPackages.remove(Pair.create(uid, pkgName));
-                            updateForcedAppStandbyUidPackagesLocked();
-                            mActiveUids.delete(uid);
-                        }
+                        mExemptedBucketPackages.remove(userId, pkgName);
+                        mRunAnyRestrictedPackages.remove(Pair.create(uid, pkgName));
+                        mActiveUids.delete(uid);
                     }
                     break;
             }
@@ -628,29 +580,6 @@
                 }
             }
         }
-        updateForcedAppStandbyUidPackagesLocked();
-    }
-
-    /**
-     * Update the {@link #mForcedAppStandbyUidPackages} upon mutations on
-     * {@link #mRunAnyRestrictedPackages}, {@link #mForcedAppStandbyEnabled} or
-     * {@link #mForceAllAppsStandby}.
-     */
-    @GuardedBy("mLock")
-    private void updateForcedAppStandbyUidPackagesLocked() {
-        if (!mForcedAppStandbyEnabled) {
-            mForcedAppStandbyUidPackages = Collections.emptySet();
-            return;
-        }
-        if (mForceAllAppsStandby) {
-            mForcedAppStandbyUidPackages = null;
-            return;
-        }
-        Set<Pair<Integer, String>> fasUidPkgs = new ArraySet<>();
-        for (int i = 0, size = mRunAnyRestrictedPackages.size(); i < size; i++) {
-            fasUidPkgs.add(mRunAnyRestrictedPackages.valueAt(i));
-        }
-        mForcedAppStandbyUidPackages = Collections.unmodifiableSet(fasUidPkgs);
     }
 
     private void updateForceAllAppStandbyState() {
@@ -672,7 +601,6 @@
             return;
         }
         mForceAllAppsStandby = enable;
-        updateForcedAppStandbyUidPackagesLocked();
 
         mHandler.notifyForceAllAppsStandbyChanged();
     }
@@ -717,7 +645,6 @@
         } else {
             mRunAnyRestrictedPackages.removeAt(index);
         }
-        updateForcedAppStandbyUidPackagesLocked();
         return true;
     }
 
@@ -969,7 +896,6 @@
                         if (unblockAlarms) {
                             l.unblockAllUnrestrictedAlarms();
                         }
-                        l.updateForcedAppStandbyForAllApps();
                     }
                     mStatLogger.logDurationStat(
                             Stats.FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED, start);
@@ -1040,7 +966,6 @@
                     mRunAnyRestrictedPackages.removeAt(i);
                 }
             }
-            updateForcedAppStandbyUidPackagesLocked();
             cleanUpArrayForUser(mActiveUids, removedUserId);
             mExemptedBucketPackages.remove(removedUserId);
         }
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
index 70e548d..ed80ddb 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
@@ -1740,7 +1740,7 @@
                     if (!isExactAlarmChangeEnabled(a.packageName, UserHandle.getUserId(a.uid))) {
                         return false;
                     }
-                    return a.alarmClock != null || !isExemptFromExactAlarmPermission(a.uid);
+                    return !isExemptFromExactAlarmPermission(a.uid);
                 };
                 removeAlarmsInternalLocked(whichAlarms, REMOVE_REASON_EXACT_PERMISSION_REVOKED);
             }
@@ -2414,6 +2414,7 @@
     /**
      * Returns true if the given uid does not require SCHEDULE_EXACT_ALARM to set exact,
      * allow-while-idle alarms.
+     * Note: It is ok to call this method without the lock {@link #mLock} held.
      */
     boolean isExemptFromExactAlarmPermission(int uid) {
         return (UserHandle.isSameApp(mSystemUiUid, uid)
@@ -2515,7 +2516,7 @@
                     idleOptions = allowWhileIdle ? mOptsWithFgs.toBundle() : null;
                 }
                 if (needsPermission && !hasScheduleExactAlarmInternal(callingPackage, callingUid)) {
-                    if (alarmClock != null || !isExemptFromExactAlarmPermission(callingUid)) {
+                    if (!isExemptFromExactAlarmPermission(callingUid)) {
                         final String errorMessage = "Caller " + callingPackage + " needs to hold "
                                 + Manifest.permission.SCHEDULE_EXACT_ALARM + " to set "
                                 + "exact alarms.";
@@ -2527,10 +2528,16 @@
                     } else {
                         allowListed = true;
                     }
-                    // If the app is on the full system power allow-list (not except-idle), or we're
-                    // in a soft failure mode, we still allow the alarms.
-                    // We give temporary allowlist to allow-while-idle alarms but without FGS
-                    // capability. Note that apps that are in the power allow-list do not need it.
+                    // If the app is on the full system power allow-list (not except-idle), or the
+                    // user-elected allow-list, or we're in a soft failure mode, we still allow the
+                    // alarms.
+                    // In both cases, ALLOW_WHILE_IDLE alarms get a lower quota equivalent to what
+                    // pre-S apps got. Note that user-allow-listed apps don't use the flag
+                    // ALLOW_WHILE_IDLE.
+                    // We grant temporary allow-list to allow-while-idle alarms but without FGS
+                    // capability. AlarmClock alarms do not get the temporary allow-list. This is
+                    // consistent with pre-S behavior. Note that apps that are in either of the
+                    // power-save allow-lists do not need it.
                     idleOptions = allowWhileIdle ? mOptsWithoutFgs.toBundle() : null;
                     lowerQuota = allowWhileIdle;
                 }
@@ -2561,6 +2568,22 @@
         }
 
         @Override
+        public boolean canScheduleExactAlarms(String packageName) {
+            final int callingUid = mInjector.getCallingUid();
+            final int userId = UserHandle.getUserId(callingUid);
+            final int packageUid = mPackageManagerInternal.getPackageUid(packageName, 0, userId);
+            if (callingUid != packageUid) {
+                throw new SecurityException("Uid " + callingUid
+                        + " cannot query canScheduleExactAlarms for package " + packageName);
+            }
+            if (!isExactAlarmChangeEnabled(packageName, userId)) {
+                return true;
+            }
+            return isExemptFromExactAlarmPermission(packageUid)
+                    || hasScheduleExactAlarmInternal(packageName, packageUid);
+        }
+
+        @Override
         public boolean hasScheduleExactAlarm(String packageName, int userId) {
             final int callingUid = mInjector.getCallingUid();
             if (UserHandle.getUserId(callingUid) != userId) {
@@ -2572,9 +2595,6 @@
                 throw new SecurityException("Uid " + callingUid
                         + " cannot query hasScheduleExactAlarm for uid " + uid);
             }
-            if (!isExactAlarmChangeEnabled(packageName, userId)) {
-                return true;
-            }
             return (uid > 0) ? hasScheduleExactAlarmInternal(packageName, uid) : false;
         }
 
@@ -3577,17 +3597,14 @@
      * This is not expected to get called frequently.
      */
     void removeExactAlarmsOnPermissionRevokedLocked(int uid, String packageName) {
-        Slog.w(TAG, "Package " + packageName + ", uid " + uid + " lost SCHEDULE_EXACT_ALARM!");
-        if (!isExactAlarmChangeEnabled(packageName, UserHandle.getUserId(uid))) {
+        if (isExemptFromExactAlarmPermission(uid)
+                || !isExactAlarmChangeEnabled(packageName, UserHandle.getUserId(uid))) {
             return;
         }
+        Slog.w(TAG, "Package " + packageName + ", uid " + uid + " lost SCHEDULE_EXACT_ALARM!");
 
-        final Predicate<Alarm> whichAlarms = a -> {
-            if (a.uid == uid && a.packageName.equals(packageName) && a.windowLength == 0) {
-                return a.alarmClock != null || !isExemptFromExactAlarmPermission(uid);
-            }
-            return false;
-        };
+        final Predicate<Alarm> whichAlarms = a -> (a.uid == uid && a.packageName.equals(packageName)
+                && a.windowLength == 0);
         removeAlarmsInternalLocked(whichAlarms, REMOVE_REASON_EXACT_PERMISSION_REVOKED);
 
         if (mConstants.KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED) {
diff --git a/boot/hiddenapi/hiddenapi-max-target-o.txt b/boot/hiddenapi/hiddenapi-max-target-o.txt
index 3cc28d9..0ec918b 100644
--- a/boot/hiddenapi/hiddenapi-max-target-o.txt
+++ b/boot/hiddenapi/hiddenapi-max-target-o.txt
@@ -8961,12 +8961,6 @@
 Landroid/app/slice/SliceSpec;-><init>(Landroid/os/Parcel;)V
 Landroid/app/slice/SliceSpec;->mRevision:I
 Landroid/app/slice/SliceSpec;->mType:Ljava/lang/String;
-Landroid/app/StatsManager;-><init>(Landroid/content/Context;)V
-Landroid/app/StatsManager;->DEBUG:Z
-Landroid/app/StatsManager;->getIStatsManagerLocked()Landroid/os/IStatsManager;
-Landroid/app/StatsManager;->mContext:Landroid/content/Context;
-Landroid/app/StatsManager;->mService:Landroid/os/IStatsManager;
-Landroid/app/StatsManager;->TAG:Ljava/lang/String;
 Landroid/app/StatusBarManager;->CAMERA_LAUNCH_SOURCE_LIFT_TRIGGER:I
 Landroid/app/StatusBarManager;->CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP:I
 Landroid/app/StatusBarManager;->CAMERA_LAUNCH_SOURCE_WIGGLE:I
@@ -31618,12 +31612,6 @@
 Landroid/media/MediaSession2$CommandButton;->getProvider()Landroid/media/update/MediaSession2Provider$CommandButtonProvider;
 Landroid/media/MediaSession2$CommandButton;->isEnabled()Z
 Landroid/media/MediaSession2$CommandButton;->mProvider:Landroid/media/update/MediaSession2Provider$CommandButtonProvider;
-Landroid/media/MediaSession2$ControllerInfo;-><init>(Landroid/content/Context;IILjava/lang/String;Landroid/os/IInterface;)V
-Landroid/media/MediaSession2$ControllerInfo;->getPackageName()Ljava/lang/String;
-Landroid/media/MediaSession2$ControllerInfo;->getProvider()Landroid/media/update/MediaSession2Provider$ControllerInfoProvider;
-Landroid/media/MediaSession2$ControllerInfo;->getUid()I
-Landroid/media/MediaSession2$ControllerInfo;->isTrusted()Z
-Landroid/media/MediaSession2$ControllerInfo;->mProvider:Landroid/media/update/MediaSession2Provider$ControllerInfoProvider;
 Landroid/media/MediaSession2$OnDataSourceMissingHelper;->onDataSourceMissing(Landroid/media/MediaSession2;Landroid/media/MediaItem2;)Landroid/media/DataSourceDesc;
 Landroid/media/MediaSession2$SessionCallback;-><init>()V
 Landroid/media/MediaSession2$SessionCallback;->onBufferingStateChanged(Landroid/media/MediaSession2;Landroid/media/MediaPlayerBase;Landroid/media/MediaItem2;I)V
@@ -35339,159 +35327,6 @@
 Landroid/mtp/MtpStorageManager;->sDebug:Z
 Landroid/mtp/MtpStorageManager;->setSubdirectories(Ljava/util/Set;)V
 Landroid/mtp/MtpStorageManager;->TAG:Ljava/lang/String;
-Landroid/net/CaptivePortal;-><init>(Landroid/os/IBinder;)V
-Landroid/net/CaptivePortal;->APP_RETURN_DISMISSED:I
-Landroid/net/CaptivePortal;->APP_RETURN_UNWANTED:I
-Landroid/net/CaptivePortal;->APP_RETURN_WANTED_AS_IS:I
-Landroid/net/CaptivePortal;->mBinder:Landroid/os/IBinder;
-Landroid/net/CaptivePortal;->useNetwork()V
-Landroid/net/ConnectivityManager$CallbackHandler;->DBG:Z
-Landroid/net/ConnectivityManager$CallbackHandler;->getObject(Landroid/os/Message;Ljava/lang/Class;)Ljava/lang/Object;
-Landroid/net/ConnectivityManager$CallbackHandler;->TAG:Ljava/lang/String;
-Landroid/net/ConnectivityManager$Errors;->TOO_MANY_REQUESTS:I
-Landroid/net/ConnectivityManager$LegacyRequest;-><init>()V
-Landroid/net/ConnectivityManager$LegacyRequest;->clearDnsBinding()V
-Landroid/net/ConnectivityManager$LegacyRequest;->currentNetwork:Landroid/net/Network;
-Landroid/net/ConnectivityManager$LegacyRequest;->delay:I
-Landroid/net/ConnectivityManager$LegacyRequest;->expireSequenceNumber:I
-Landroid/net/ConnectivityManager$LegacyRequest;->networkCallback:Landroid/net/ConnectivityManager$NetworkCallback;
-Landroid/net/ConnectivityManager$LegacyRequest;->networkCapabilities:Landroid/net/NetworkCapabilities;
-Landroid/net/ConnectivityManager$LegacyRequest;->networkRequest:Landroid/net/NetworkRequest;
-Landroid/net/ConnectivityManager$NetworkCallback;->networkRequest:Landroid/net/NetworkRequest;
-Landroid/net/ConnectivityManager$NetworkCallback;->onAvailable(Landroid/net/Network;Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;)V
-Landroid/net/ConnectivityManager$NetworkCallback;->onNetworkResumed(Landroid/net/Network;)V
-Landroid/net/ConnectivityManager$NetworkCallback;->onNetworkSuspended(Landroid/net/Network;)V
-Landroid/net/ConnectivityManager$NetworkCallback;->onPreCheck(Landroid/net/Network;)V
-Landroid/net/ConnectivityManager$PacketKeepalive;->BINDER_DIED:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->ERROR_HARDWARE_ERROR:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->ERROR_HARDWARE_UNSUPPORTED:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->ERROR_INVALID_INTERVAL:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->ERROR_INVALID_IP_ADDRESS:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->ERROR_INVALID_LENGTH:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->ERROR_INVALID_NETWORK:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->ERROR_INVALID_PORT:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->mCallback:Landroid/net/ConnectivityManager$PacketKeepaliveCallback;
-Landroid/net/ConnectivityManager$PacketKeepalive;->MIN_INTERVAL:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->mLooper:Landroid/os/Looper;
-Landroid/net/ConnectivityManager$PacketKeepalive;->mMessenger:Landroid/os/Messenger;
-Landroid/net/ConnectivityManager$PacketKeepalive;->mNetwork:Landroid/net/Network;
-Landroid/net/ConnectivityManager$PacketKeepalive;->mSlot:Ljava/lang/Integer;
-Landroid/net/ConnectivityManager$PacketKeepalive;->NATT_PORT:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->NO_KEEPALIVE:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->stopLooper()V
-Landroid/net/ConnectivityManager$PacketKeepalive;->SUCCESS:I
-Landroid/net/ConnectivityManager$PacketKeepalive;->TAG:Ljava/lang/String;
-Landroid/net/ConnectivityManager$TooManyRequestsException;-><init>()V
-Landroid/net/ConnectivityManager;-><init>(Landroid/content/Context;Landroid/net/IConnectivityManager;)V
-Landroid/net/ConnectivityManager;->ACTION_CAPTIVE_PORTAL_TEST_COMPLETED:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->ACTION_DATA_ACTIVITY_CHANGE:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->ACTION_PROMPT_LOST_VALIDATION:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->ACTION_PROMPT_UNVALIDATED:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->ALREADY_UNREGISTERED:Landroid/net/NetworkRequest;
-Landroid/net/ConnectivityManager;->BASE:I
-Landroid/net/ConnectivityManager;->CALLBACK_AVAILABLE:I
-Landroid/net/ConnectivityManager;->CALLBACK_CAP_CHANGED:I
-Landroid/net/ConnectivityManager;->CALLBACK_IP_CHANGED:I
-Landroid/net/ConnectivityManager;->CALLBACK_LOSING:I
-Landroid/net/ConnectivityManager;->CALLBACK_LOST:I
-Landroid/net/ConnectivityManager;->CALLBACK_PRECHECK:I
-Landroid/net/ConnectivityManager;->CALLBACK_RESUMED:I
-Landroid/net/ConnectivityManager;->CALLBACK_SUSPENDED:I
-Landroid/net/ConnectivityManager;->CALLBACK_UNAVAIL:I
-Landroid/net/ConnectivityManager;->checkCallbackNotNull(Landroid/net/ConnectivityManager$NetworkCallback;)V
-Landroid/net/ConnectivityManager;->checkLegacyRoutingApiAccess()V
-Landroid/net/ConnectivityManager;->checkMobileProvisioning(I)I
-Landroid/net/ConnectivityManager;->checkPendingIntentNotNull(Landroid/app/PendingIntent;)V
-Landroid/net/ConnectivityManager;->checkTimeout(I)V
-Landroid/net/ConnectivityManager;->CONNECTIVITY_ACTION_SUPL:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->convertServiceException(Landroid/os/ServiceSpecificException;)Ljava/lang/RuntimeException;
-Landroid/net/ConnectivityManager;->enforceChangePermission(Landroid/content/Context;)V
-Landroid/net/ConnectivityManager;->enforceTetherChangePermission(Landroid/content/Context;Ljava/lang/String;)V
-Landroid/net/ConnectivityManager;->expireRequest(Landroid/net/NetworkCapabilities;I)V
-Landroid/net/ConnectivityManager;->EXPIRE_LEGACY_REQUEST:I
-Landroid/net/ConnectivityManager;->EXTRA_ACTIVE_LOCAL_ONLY:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_ADD_TETHER_TYPE:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_CAPTIVE_PORTAL_PROBE_SPEC:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_CAPTIVE_PORTAL_USER_AGENT:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_DEVICE_TYPE:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_INET_CONDITION:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_IS_ACTIVE:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_IS_CAPTIVE_PORTAL:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_PROVISION_CALLBACK:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_REALTIME_NS:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_REM_TETHER_TYPE:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_RUN_PROVISION:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->EXTRA_SET_ALARM:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->factoryReset()V
-Landroid/net/ConnectivityManager;->findRequestForFeature(Landroid/net/NetworkCapabilities;)Landroid/net/NetworkRequest;
-Landroid/net/ConnectivityManager;->getActiveNetworkForUid(I)Landroid/net/Network;
-Landroid/net/ConnectivityManager;->getActiveNetworkForUid(IZ)Landroid/net/Network;
-Landroid/net/ConnectivityManager;->getActiveNetworkInfoForUid(IZ)Landroid/net/NetworkInfo;
-Landroid/net/ConnectivityManager;->getAlwaysOnVpnPackageForUser(I)Ljava/lang/String;
-Landroid/net/ConnectivityManager;->getCallbackName(I)Ljava/lang/String;
-Landroid/net/ConnectivityManager;->getDefaultHandler()Landroid/net/ConnectivityManager$CallbackHandler;
-Landroid/net/ConnectivityManager;->getGlobalProxy()Landroid/net/ProxyInfo;
-Landroid/net/ConnectivityManager;->getInstanceOrNull()Landroid/net/ConnectivityManager;
-Landroid/net/ConnectivityManager;->getMobileProvisioningUrl()Ljava/lang/String;
-Landroid/net/ConnectivityManager;->getNetworkInfoForUid(Landroid/net/Network;IZ)Landroid/net/NetworkInfo;
-Landroid/net/ConnectivityManager;->getNetworkManagementService()Landroid/os/INetworkManagementService;
-Landroid/net/ConnectivityManager;->getNetworkPolicyManager()Landroid/net/INetworkPolicyManager;
-Landroid/net/ConnectivityManager;->getProxyForNetwork(Landroid/net/Network;)Landroid/net/ProxyInfo;
-Landroid/net/ConnectivityManager;->getTetheredDhcpRanges()[Ljava/lang/String;
-Landroid/net/ConnectivityManager;->inferLegacyTypeForNetworkCapabilities(Landroid/net/NetworkCapabilities;)I
-Landroid/net/ConnectivityManager;->isAlwaysOnVpnPackageSupportedForUser(ILjava/lang/String;)Z
-Landroid/net/ConnectivityManager;->isNetworkTypeWifi(I)Z
-Landroid/net/ConnectivityManager;->legacyTypeForNetworkCapabilities(Landroid/net/NetworkCapabilities;)I
-Landroid/net/ConnectivityManager;->LISTEN:I
-Landroid/net/ConnectivityManager;->MAX_NETWORK_TYPE:I
-Landroid/net/ConnectivityManager;->MAX_RADIO_TYPE:I
-Landroid/net/ConnectivityManager;->mContext:Landroid/content/Context;
-Landroid/net/ConnectivityManager;->MIN_NETWORK_TYPE:I
-Landroid/net/ConnectivityManager;->mNetworkActivityListeners:Landroid/util/ArrayMap;
-Landroid/net/ConnectivityManager;->mNMService:Landroid/os/INetworkManagementService;
-Landroid/net/ConnectivityManager;->mNPManager:Landroid/net/INetworkPolicyManager;
-Landroid/net/ConnectivityManager;->MULTIPATH_PREFERENCE_UNMETERED:I
-Landroid/net/ConnectivityManager;->NETID_UNSET:I
-Landroid/net/ConnectivityManager;->networkCapabilitiesForType(I)Landroid/net/NetworkCapabilities;
-Landroid/net/ConnectivityManager;->PRIVATE_DNS_DEFAULT_MODE_FALLBACK:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->PRIVATE_DNS_MODE_OFF:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->PRIVATE_DNS_MODE_OPPORTUNISTIC:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->PRIVATE_DNS_MODE_PROVIDER_HOSTNAME:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->registerNetworkAgent(Landroid/os/Messenger;Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;ILandroid/net/NetworkMisc;)I
-Landroid/net/ConnectivityManager;->renewRequestLocked(Landroid/net/ConnectivityManager$LegacyRequest;)V
-Landroid/net/ConnectivityManager;->reportInetCondition(II)V
-Landroid/net/ConnectivityManager;->REQUEST:I
-Landroid/net/ConnectivityManager;->requestNetwork(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;IILandroid/os/Handler;)V
-Landroid/net/ConnectivityManager;->REQUEST_ID_UNSET:I
-Landroid/net/ConnectivityManager;->sCallbackHandler:Landroid/net/ConnectivityManager$CallbackHandler;
-Landroid/net/ConnectivityManager;->sCallbacks:Ljava/util/HashMap;
-Landroid/net/ConnectivityManager;->sendExpireMsgForFeature(Landroid/net/NetworkCapabilities;II)V
-Landroid/net/ConnectivityManager;->sendRequestForNetwork(Landroid/net/NetworkCapabilities;Landroid/net/ConnectivityManager$NetworkCallback;IIILandroid/net/ConnectivityManager$CallbackHandler;)Landroid/net/NetworkRequest;
-Landroid/net/ConnectivityManager;->setAcceptUnvalidated(Landroid/net/Network;ZZ)V
-Landroid/net/ConnectivityManager;->setAlwaysOnVpnPackageForUser(ILjava/lang/String;Z)Z
-Landroid/net/ConnectivityManager;->setAvoidUnvalidated(Landroid/net/Network;)V
-Landroid/net/ConnectivityManager;->setGlobalProxy(Landroid/net/ProxyInfo;)V
-Landroid/net/ConnectivityManager;->setProvisioningNotificationVisible(ZILjava/lang/String;)V
-Landroid/net/ConnectivityManager;->sInstance:Landroid/net/ConnectivityManager;
-Landroid/net/ConnectivityManager;->sLegacyTypeToCapability:Landroid/util/SparseIntArray;
-Landroid/net/ConnectivityManager;->sLegacyTypeToTransport:Landroid/util/SparseIntArray;
-Landroid/net/ConnectivityManager;->startCaptivePortalApp(Landroid/net/Network;)V
-Landroid/net/ConnectivityManager;->TAG:Ljava/lang/String;
-Landroid/net/ConnectivityManager;->TETHERING_INVALID:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_DISABLE_NAT_ERROR:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_ENABLE_NAT_ERROR:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_IFACE_CFG_ERROR:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_MASTER_ERROR:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_NO_ERROR:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_PROVISION_FAILED:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_SERVICE_UNAVAIL:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_TETHER_IFACE_ERROR:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_UNAVAIL_IFACE:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_UNKNOWN_IFACE:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_UNSUPPORTED:I
-Landroid/net/ConnectivityManager;->TETHER_ERROR_UNTETHER_IFACE_ERROR:I
-Landroid/net/ConnectivityManager;->unsupportedStartingFrom(I)V
-Landroid/net/ConnectivityManager;->updateLockdownVpn()Z
 Landroid/net/ConnectivityMetricsEvent;-><init>()V
 Landroid/net/ConnectivityMetricsEvent;-><init>(Landroid/os/Parcel;)V
 Landroid/net/ConnectivityMetricsEvent;->CREATOR:Landroid/os/Parcelable$Creator;
@@ -35500,12 +35335,6 @@
 Landroid/net/ConnectivityMetricsEvent;->netId:I
 Landroid/net/ConnectivityMetricsEvent;->timestamp:J
 Landroid/net/ConnectivityMetricsEvent;->transports:J
-Landroid/net/ConnectivityThread$Singleton;-><init>()V
-Landroid/net/ConnectivityThread$Singleton;->INSTANCE:Landroid/net/ConnectivityThread;
-Landroid/net/ConnectivityThread;-><init>()V
-Landroid/net/ConnectivityThread;->createInstance()Landroid/net/ConnectivityThread;
-Landroid/net/ConnectivityThread;->get()Landroid/net/ConnectivityThread;
-Landroid/net/ConnectivityThread;->getInstanceLooper()Landroid/os/Looper;
 Landroid/net/Credentials;->gid:I
 Landroid/net/Credentials;->pid:I
 Landroid/net/Credentials;->uid:I
@@ -35516,9 +35345,6 @@
 Landroid/net/DataUsageRequest;->REQUEST_ID_UNSET:I
 Landroid/net/DataUsageRequest;->template:Landroid/net/NetworkTemplate;
 Landroid/net/DataUsageRequest;->thresholdInBytes:J
-Landroid/net/DhcpInfo;-><init>(Landroid/net/DhcpInfo;)V
-Landroid/net/DhcpInfo;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/DhcpInfo;->putAddress(Ljava/lang/StringBuffer;I)V
 Landroid/net/DhcpResults;->addDns(Ljava/lang/String;)Z
 Landroid/net/DhcpResults;->clear()V
 Landroid/net/DhcpResults;->CREATOR:Landroid/os/Parcelable$Creator;
@@ -35572,224 +35398,6 @@
 Landroid/net/http/X509TrustManagerExtensions;->mDelegate:Lcom/android/org/conscrypt/TrustManagerImpl;
 Landroid/net/http/X509TrustManagerExtensions;->mIsSameTrustConfiguration:Ljava/lang/reflect/Method;
 Landroid/net/http/X509TrustManagerExtensions;->mTrustManager:Ljavax/net/ssl/X509TrustManager;
-Landroid/net/ICaptivePortal$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/ICaptivePortal$Stub$Proxy;->appResponse(I)V
-Landroid/net/ICaptivePortal$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/ICaptivePortal$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/ICaptivePortal$Stub;-><init>()V
-Landroid/net/ICaptivePortal$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/ICaptivePortal;
-Landroid/net/ICaptivePortal$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/ICaptivePortal$Stub;->TRANSACTION_appResponse:I
-Landroid/net/ICaptivePortal;->appResponse(I)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->addVpnAddress(Ljava/lang/String;I)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->checkMobileProvisioning(I)I
-Landroid/net/IConnectivityManager$Stub$Proxy;->establishVpn(Lcom/android/internal/net/VpnConfig;)Landroid/os/ParcelFileDescriptor;
-Landroid/net/IConnectivityManager$Stub$Proxy;->factoryReset()V
-Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveNetwork()Landroid/net/Network;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveNetworkForUid(IZ)Landroid/net/Network;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveNetworkInfoForUid(IZ)Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveNetworkQuotaInfo()Landroid/net/NetworkQuotaInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getAllNetworkState()[Landroid/net/NetworkState;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getAllVpnInfo()[Lcom/android/internal/net/VpnInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getAlwaysOnVpnPackage(I)Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getCaptivePortalServerUrl()Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getDefaultNetworkCapabilitiesForUser(I)[Landroid/net/NetworkCapabilities;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getGlobalProxy()Landroid/net/ProxyInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getLastTetherError(Ljava/lang/String;)I
-Landroid/net/IConnectivityManager$Stub$Proxy;->getLegacyVpnInfo(I)Lcom/android/internal/net/LegacyVpnInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getLinkProperties(Landroid/net/Network;)Landroid/net/LinkProperties;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getLinkPropertiesForType(I)Landroid/net/LinkProperties;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getMobileProvisioningUrl()Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getMultipathPreference(Landroid/net/Network;)I
-Landroid/net/IConnectivityManager$Stub$Proxy;->getNetworkCapabilities(Landroid/net/Network;)Landroid/net/NetworkCapabilities;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getNetworkForType(I)Landroid/net/Network;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getNetworkInfo(I)Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getNetworkInfoForUid(Landroid/net/Network;IZ)Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getNetworkWatchlistConfigHash()[B
-Landroid/net/IConnectivityManager$Stub$Proxy;->getProxyForNetwork(Landroid/net/Network;)Landroid/net/ProxyInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getRestoreDefaultNetworkDelay(I)I
-Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableBluetoothRegexs()[Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableWifiRegexs()[Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getTetheredDhcpRanges()[Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getTetheringErroredIfaces()[Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getVpnConfig(I)Lcom/android/internal/net/VpnConfig;
-Landroid/net/IConnectivityManager$Stub$Proxy;->isActiveNetworkMetered()Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->isAlwaysOnVpnPackageSupported(ILjava/lang/String;)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->isNetworkSupported(I)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->isTetheringSupported(Ljava/lang/String;)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->listenForNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;Landroid/os/IBinder;)Landroid/net/NetworkRequest;
-Landroid/net/IConnectivityManager$Stub$Proxy;->pendingListenForNetwork(Landroid/net/NetworkCapabilities;Landroid/app/PendingIntent;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->pendingRequestForNetwork(Landroid/net/NetworkCapabilities;Landroid/app/PendingIntent;)Landroid/net/NetworkRequest;
-Landroid/net/IConnectivityManager$Stub$Proxy;->prepareVpn(Ljava/lang/String;Ljava/lang/String;I)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->registerNetworkAgent(Landroid/os/Messenger;Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;ILandroid/net/NetworkMisc;)I
-Landroid/net/IConnectivityManager$Stub$Proxy;->registerNetworkFactory(Landroid/os/Messenger;Ljava/lang/String;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->releaseNetworkRequest(Landroid/net/NetworkRequest;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->releasePendingNetworkRequest(Landroid/app/PendingIntent;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->removeVpnAddress(Ljava/lang/String;I)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->reportInetCondition(II)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->reportNetworkConnectivity(Landroid/net/Network;Z)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->requestBandwidthUpdate(Landroid/net/Network;)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->requestNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;ILandroid/os/IBinder;I)Landroid/net/NetworkRequest;
-Landroid/net/IConnectivityManager$Stub$Proxy;->requestRouteToHostAddress(I[B)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->setAcceptUnvalidated(Landroid/net/Network;ZZ)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->setAirplaneMode(Z)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->setAlwaysOnVpnPackage(ILjava/lang/String;Z)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->setAvoidUnvalidated(Landroid/net/Network;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->setGlobalProxy(Landroid/net/ProxyInfo;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->setProvisioningNotificationVisible(ZILjava/lang/String;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->setUnderlyingNetworksForVpn([Landroid/net/Network;)Z
-Landroid/net/IConnectivityManager$Stub$Proxy;->setUsbTethering(ZLjava/lang/String;)I
-Landroid/net/IConnectivityManager$Stub$Proxy;->setVpnPackageAuthorization(Ljava/lang/String;IZ)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->startCaptivePortalApp(Landroid/net/Network;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->startLegacyVpn(Lcom/android/internal/net/VpnProfile;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->startNattKeepalive(Landroid/net/Network;ILandroid/os/Messenger;Landroid/os/IBinder;Ljava/lang/String;ILjava/lang/String;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->startTethering(ILandroid/os/ResultReceiver;ZLjava/lang/String;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->stopKeepalive(Landroid/net/Network;I)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->stopTethering(ILjava/lang/String;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->tether(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/net/IConnectivityManager$Stub$Proxy;->unregisterNetworkFactory(Landroid/os/Messenger;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->untether(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/net/IConnectivityManager$Stub$Proxy;->updateLockdownVpn()Z
-Landroid/net/IConnectivityManager$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_addVpnAddress:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_checkMobileProvisioning:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_establishVpn:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_factoryReset:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getActiveLinkProperties:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getActiveNetwork:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getActiveNetworkForUid:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getActiveNetworkInfo:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getActiveNetworkInfoForUid:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getActiveNetworkQuotaInfo:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getAllNetworkInfo:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getAllNetworks:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getAllNetworkState:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getAllVpnInfo:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getAlwaysOnVpnPackage:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getCaptivePortalServerUrl:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getDefaultNetworkCapabilitiesForUser:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getGlobalProxy:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getLastTetherError:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getLegacyVpnInfo:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getLinkProperties:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getLinkPropertiesForType:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getMobileProvisioningUrl:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getMultipathPreference:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getNetworkCapabilities:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getNetworkForType:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getNetworkInfo:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getNetworkInfoForUid:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getNetworkWatchlistConfigHash:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getProxyForNetwork:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getRestoreDefaultNetworkDelay:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getTetherableBluetoothRegexs:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getTetherableIfaces:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getTetherableUsbRegexs:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getTetherableWifiRegexs:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getTetheredDhcpRanges:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getTetheredIfaces:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getTetheringErroredIfaces:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_getVpnConfig:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_isActiveNetworkMetered:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_isAlwaysOnVpnPackageSupported:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_isNetworkSupported:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_isTetheringSupported:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_listenForNetwork:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_pendingListenForNetwork:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_pendingRequestForNetwork:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_prepareVpn:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_registerNetworkAgent:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_registerNetworkFactory:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_releaseNetworkRequest:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_releasePendingNetworkRequest:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_removeVpnAddress:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_reportInetCondition:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_reportNetworkConnectivity:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_requestBandwidthUpdate:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_requestNetwork:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_requestRouteToHostAddress:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setAcceptUnvalidated:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setAirplaneMode:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setAlwaysOnVpnPackage:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setAvoidUnvalidated:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setGlobalProxy:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setProvisioningNotificationVisible:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setUnderlyingNetworksForVpn:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setUsbTethering:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_setVpnPackageAuthorization:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_startCaptivePortalApp:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_startLegacyVpn:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_startNattKeepalive:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_startTethering:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_stopKeepalive:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_stopTethering:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_tether:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_unregisterNetworkFactory:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_untether:I
-Landroid/net/IConnectivityManager$Stub;->TRANSACTION_updateLockdownVpn:I
-Landroid/net/IConnectivityManager;->addVpnAddress(Ljava/lang/String;I)Z
-Landroid/net/IConnectivityManager;->checkMobileProvisioning(I)I
-Landroid/net/IConnectivityManager;->establishVpn(Lcom/android/internal/net/VpnConfig;)Landroid/os/ParcelFileDescriptor;
-Landroid/net/IConnectivityManager;->factoryReset()V
-Landroid/net/IConnectivityManager;->getActiveNetwork()Landroid/net/Network;
-Landroid/net/IConnectivityManager;->getActiveNetworkForUid(IZ)Landroid/net/Network;
-Landroid/net/IConnectivityManager;->getActiveNetworkInfoForUid(IZ)Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager;->getActiveNetworkQuotaInfo()Landroid/net/NetworkQuotaInfo;
-Landroid/net/IConnectivityManager;->getAllNetworks()[Landroid/net/Network;
-Landroid/net/IConnectivityManager;->getAllVpnInfo()[Lcom/android/internal/net/VpnInfo;
-Landroid/net/IConnectivityManager;->getAlwaysOnVpnPackage(I)Ljava/lang/String;
-Landroid/net/IConnectivityManager;->getCaptivePortalServerUrl()Ljava/lang/String;
-Landroid/net/IConnectivityManager;->getDefaultNetworkCapabilitiesForUser(I)[Landroid/net/NetworkCapabilities;
-Landroid/net/IConnectivityManager;->getGlobalProxy()Landroid/net/ProxyInfo;
-Landroid/net/IConnectivityManager;->getLegacyVpnInfo(I)Lcom/android/internal/net/LegacyVpnInfo;
-Landroid/net/IConnectivityManager;->getLinkProperties(Landroid/net/Network;)Landroid/net/LinkProperties;
-Landroid/net/IConnectivityManager;->getLinkPropertiesForType(I)Landroid/net/LinkProperties;
-Landroid/net/IConnectivityManager;->getMobileProvisioningUrl()Ljava/lang/String;
-Landroid/net/IConnectivityManager;->getMultipathPreference(Landroid/net/Network;)I
-Landroid/net/IConnectivityManager;->getNetworkCapabilities(Landroid/net/Network;)Landroid/net/NetworkCapabilities;
-Landroid/net/IConnectivityManager;->getNetworkForType(I)Landroid/net/Network;
-Landroid/net/IConnectivityManager;->getNetworkInfoForUid(Landroid/net/Network;IZ)Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager;->getNetworkWatchlistConfigHash()[B
-Landroid/net/IConnectivityManager;->getProxyForNetwork(Landroid/net/Network;)Landroid/net/ProxyInfo;
-Landroid/net/IConnectivityManager;->getRestoreDefaultNetworkDelay(I)I
-Landroid/net/IConnectivityManager;->getTetherableBluetoothRegexs()[Ljava/lang/String;
-Landroid/net/IConnectivityManager;->getTetheredDhcpRanges()[Ljava/lang/String;
-Landroid/net/IConnectivityManager;->getVpnConfig(I)Lcom/android/internal/net/VpnConfig;
-Landroid/net/IConnectivityManager;->isActiveNetworkMetered()Z
-Landroid/net/IConnectivityManager;->isAlwaysOnVpnPackageSupported(ILjava/lang/String;)Z
-Landroid/net/IConnectivityManager;->isNetworkSupported(I)Z
-Landroid/net/IConnectivityManager;->isTetheringSupported(Ljava/lang/String;)Z
-Landroid/net/IConnectivityManager;->listenForNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;Landroid/os/IBinder;)Landroid/net/NetworkRequest;
-Landroid/net/IConnectivityManager;->pendingListenForNetwork(Landroid/net/NetworkCapabilities;Landroid/app/PendingIntent;)V
-Landroid/net/IConnectivityManager;->pendingRequestForNetwork(Landroid/net/NetworkCapabilities;Landroid/app/PendingIntent;)Landroid/net/NetworkRequest;
-Landroid/net/IConnectivityManager;->prepareVpn(Ljava/lang/String;Ljava/lang/String;I)Z
-Landroid/net/IConnectivityManager;->registerNetworkAgent(Landroid/os/Messenger;Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;ILandroid/net/NetworkMisc;)I
-Landroid/net/IConnectivityManager;->registerNetworkFactory(Landroid/os/Messenger;Ljava/lang/String;)V
-Landroid/net/IConnectivityManager;->releaseNetworkRequest(Landroid/net/NetworkRequest;)V
-Landroid/net/IConnectivityManager;->releasePendingNetworkRequest(Landroid/app/PendingIntent;)V
-Landroid/net/IConnectivityManager;->removeVpnAddress(Ljava/lang/String;I)Z
-Landroid/net/IConnectivityManager;->reportNetworkConnectivity(Landroid/net/Network;Z)V
-Landroid/net/IConnectivityManager;->requestBandwidthUpdate(Landroid/net/Network;)Z
-Landroid/net/IConnectivityManager;->requestNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;ILandroid/os/IBinder;I)Landroid/net/NetworkRequest;
-Landroid/net/IConnectivityManager;->requestRouteToHostAddress(I[B)Z
-Landroid/net/IConnectivityManager;->setAcceptUnvalidated(Landroid/net/Network;ZZ)V
-Landroid/net/IConnectivityManager;->setAlwaysOnVpnPackage(ILjava/lang/String;Z)Z
-Landroid/net/IConnectivityManager;->setAvoidUnvalidated(Landroid/net/Network;)V
-Landroid/net/IConnectivityManager;->setGlobalProxy(Landroid/net/ProxyInfo;)V
-Landroid/net/IConnectivityManager;->setProvisioningNotificationVisible(ZILjava/lang/String;)V
-Landroid/net/IConnectivityManager;->setUnderlyingNetworksForVpn([Landroid/net/Network;)Z
-Landroid/net/IConnectivityManager;->setUsbTethering(ZLjava/lang/String;)I
-Landroid/net/IConnectivityManager;->setVpnPackageAuthorization(Ljava/lang/String;IZ)V
-Landroid/net/IConnectivityManager;->startCaptivePortalApp(Landroid/net/Network;)V
-Landroid/net/IConnectivityManager;->startNattKeepalive(Landroid/net/Network;ILandroid/os/Messenger;Landroid/os/IBinder;Ljava/lang/String;ILjava/lang/String;)V
-Landroid/net/IConnectivityManager;->startTethering(ILandroid/os/ResultReceiver;ZLjava/lang/String;)V
-Landroid/net/IConnectivityManager;->stopKeepalive(Landroid/net/Network;I)V
-Landroid/net/IConnectivityManager;->stopTethering(ILjava/lang/String;)V
-Landroid/net/IConnectivityManager;->tether(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/net/IConnectivityManager;->unregisterNetworkFactory(Landroid/os/Messenger;)V
-Landroid/net/IConnectivityManager;->untether(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/net/IConnectivityManager;->updateLockdownVpn()Z
 Landroid/net/IEthernetManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 Landroid/net/IEthernetManager$Stub$Proxy;->addListener(Landroid/net/IEthernetServiceListener;)V
 Landroid/net/IEthernetManager$Stub$Proxy;->getAvailableInterfaces()[Ljava/lang/String;
@@ -36306,41 +35914,6 @@
 Landroid/net/InterfaceConfiguration;->mHwAddr:Ljava/lang/String;
 Landroid/net/InterfaceConfiguration;->setHardwareAddress(Ljava/lang/String;)V
 Landroid/net/InterfaceConfiguration;->validateFlag(Ljava/lang/String;)V
-Landroid/net/IpConfiguration$IpAssignment;->DHCP:Landroid/net/IpConfiguration$IpAssignment;
-Landroid/net/IpConfiguration$IpAssignment;->UNASSIGNED:Landroid/net/IpConfiguration$IpAssignment;
-Landroid/net/IpConfiguration$IpAssignment;->valueOf(Ljava/lang/String;)Landroid/net/IpConfiguration$IpAssignment;
-Landroid/net/IpConfiguration$IpAssignment;->values()[Landroid/net/IpConfiguration$IpAssignment;
-Landroid/net/IpConfiguration$ProxySettings;->PAC:Landroid/net/IpConfiguration$ProxySettings;
-Landroid/net/IpConfiguration$ProxySettings;->STATIC:Landroid/net/IpConfiguration$ProxySettings;
-Landroid/net/IpConfiguration$ProxySettings;->UNASSIGNED:Landroid/net/IpConfiguration$ProxySettings;
-Landroid/net/IpConfiguration$ProxySettings;->valueOf(Ljava/lang/String;)Landroid/net/IpConfiguration$ProxySettings;
-Landroid/net/IpConfiguration$ProxySettings;->values()[Landroid/net/IpConfiguration$ProxySettings;
-Landroid/net/IpConfiguration;-><init>()V
-Landroid/net/IpConfiguration;-><init>(Landroid/net/IpConfiguration;)V
-Landroid/net/IpConfiguration;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/IpConfiguration;->getHttpProxy()Landroid/net/ProxyInfo;
-Landroid/net/IpConfiguration;->getIpAssignment()Landroid/net/IpConfiguration$IpAssignment;
-Landroid/net/IpConfiguration;->getProxySettings()Landroid/net/IpConfiguration$ProxySettings;
-Landroid/net/IpConfiguration;->getStaticIpConfiguration()Landroid/net/StaticIpConfiguration;
-Landroid/net/IpConfiguration;->init(Landroid/net/IpConfiguration$IpAssignment;Landroid/net/IpConfiguration$ProxySettings;Landroid/net/StaticIpConfiguration;Landroid/net/ProxyInfo;)V
-Landroid/net/IpConfiguration;->ipAssignment:Landroid/net/IpConfiguration$IpAssignment;
-Landroid/net/IpConfiguration;->proxySettings:Landroid/net/IpConfiguration$ProxySettings;
-Landroid/net/IpConfiguration;->setHttpProxy(Landroid/net/ProxyInfo;)V
-Landroid/net/IpConfiguration;->setIpAssignment(Landroid/net/IpConfiguration$IpAssignment;)V
-Landroid/net/IpConfiguration;->setProxySettings(Landroid/net/IpConfiguration$ProxySettings;)V
-Landroid/net/IpConfiguration;->setStaticIpConfiguration(Landroid/net/StaticIpConfiguration;)V
-Landroid/net/IpConfiguration;->staticIpConfiguration:Landroid/net/StaticIpConfiguration;
-Landroid/net/IpConfiguration;->TAG:Ljava/lang/String;
-Landroid/net/IpPrefix;-><init>(Ljava/lang/String;)V
-Landroid/net/IpPrefix;-><init>(Ljava/net/InetAddress;I)V
-Landroid/net/IpPrefix;-><init>([BI)V
-Landroid/net/IpPrefix;->address:[B
-Landroid/net/IpPrefix;->checkAndMaskAddressAndPrefixLength()V
-Landroid/net/IpPrefix;->containsPrefix(Landroid/net/IpPrefix;)Z
-Landroid/net/IpPrefix;->isIPv4()Z
-Landroid/net/IpPrefix;->isIPv6()Z
-Landroid/net/IpPrefix;->lengthComparator()Ljava/util/Comparator;
-Landroid/net/IpPrefix;->prefixLength:I
 Landroid/net/IpSecAlgorithm;->checkValidOrThrow(Ljava/lang/String;II)V
 Landroid/net/IpSecAlgorithm;->CRYPT_NULL:Ljava/lang/String;
 Landroid/net/IpSecAlgorithm;->equals(Landroid/net/IpSecAlgorithm;Landroid/net/IpSecAlgorithm;)Z
@@ -36522,73 +36095,6 @@
 Landroid/net/ITetheringStatsProvider;->getTetherStats(I)Landroid/net/NetworkStats;
 Landroid/net/ITetheringStatsProvider;->QUOTA_UNLIMITED:I
 Landroid/net/ITetheringStatsProvider;->setInterfaceQuota(Ljava/lang/String;J)V
-Landroid/net/KeepalivePacketData$InvalidPacketException;-><init>(I)V
-Landroid/net/KeepalivePacketData$InvalidPacketException;->error:I
-Landroid/net/KeepalivePacketData;-><init>(Landroid/os/Parcel;)V
-Landroid/net/KeepalivePacketData;-><init>(Ljava/net/InetAddress;ILjava/net/InetAddress;I[B)V
-Landroid/net/KeepalivePacketData;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/KeepalivePacketData;->dstAddress:Ljava/net/InetAddress;
-Landroid/net/KeepalivePacketData;->dstPort:I
-Landroid/net/KeepalivePacketData;->getPacket()[B
-Landroid/net/KeepalivePacketData;->IPV4_HEADER_LENGTH:I
-Landroid/net/KeepalivePacketData;->mPacket:[B
-Landroid/net/KeepalivePacketData;->nattKeepalivePacket(Ljava/net/InetAddress;ILjava/net/InetAddress;I)Landroid/net/KeepalivePacketData;
-Landroid/net/KeepalivePacketData;->srcAddress:Ljava/net/InetAddress;
-Landroid/net/KeepalivePacketData;->srcPort:I
-Landroid/net/KeepalivePacketData;->TAG:Ljava/lang/String;
-Landroid/net/KeepalivePacketData;->UDP_HEADER_LENGTH:I
-Landroid/net/LinkAddress;-><init>(Ljava/lang/String;II)V
-Landroid/net/LinkAddress;-><init>(Ljava/net/InetAddress;III)V
-Landroid/net/LinkAddress;-><init>(Ljava/net/InterfaceAddress;)V
-Landroid/net/LinkAddress;->flags:I
-Landroid/net/LinkAddress;->init(Ljava/net/InetAddress;III)V
-Landroid/net/LinkAddress;->isGlobalPreferred()Z
-Landroid/net/LinkAddress;->isIPv4()Z
-Landroid/net/LinkAddress;->isIPv6ULA()Z
-Landroid/net/LinkAddress;->scope:I
-Landroid/net/LinkAddress;->scopeForUnicastAddress(Ljava/net/InetAddress;)I
-Landroid/net/LinkProperties$CompareResult;-><init>()V
-Landroid/net/LinkProperties$CompareResult;-><init>(Ljava/util/Collection;Ljava/util/Collection;)V
-Landroid/net/LinkProperties$CompareResult;->added:Ljava/util/List;
-Landroid/net/LinkProperties$CompareResult;->removed:Ljava/util/List;
-Landroid/net/LinkProperties$ProvisioningChange;->valueOf(Ljava/lang/String;)Landroid/net/LinkProperties$ProvisioningChange;
-Landroid/net/LinkProperties;->addValidatedPrivateDnsServer(Ljava/net/InetAddress;)Z
-Landroid/net/LinkProperties;->compareAddresses(Landroid/net/LinkProperties;)Landroid/net/LinkProperties$CompareResult;
-Landroid/net/LinkProperties;->compareAllInterfaceNames(Landroid/net/LinkProperties;)Landroid/net/LinkProperties$CompareResult;
-Landroid/net/LinkProperties;->compareAllRoutes(Landroid/net/LinkProperties;)Landroid/net/LinkProperties$CompareResult;
-Landroid/net/LinkProperties;->compareDnses(Landroid/net/LinkProperties;)Landroid/net/LinkProperties$CompareResult;
-Landroid/net/LinkProperties;->compareValidatedPrivateDnses(Landroid/net/LinkProperties;)Landroid/net/LinkProperties$CompareResult;
-Landroid/net/LinkProperties;->ensureDirectlyConnectedRoutes()V
-Landroid/net/LinkProperties;->findLinkAddressIndex(Landroid/net/LinkAddress;)I
-Landroid/net/LinkProperties;->getValidatedPrivateDnsServers()Ljava/util/List;
-Landroid/net/LinkProperties;->hasIPv4AddressOnInterface(Ljava/lang/String;)Z
-Landroid/net/LinkProperties;->isIdenticalMtu(Landroid/net/LinkProperties;)Z
-Landroid/net/LinkProperties;->isIdenticalPrivateDns(Landroid/net/LinkProperties;)Z
-Landroid/net/LinkProperties;->isIdenticalTcpBufferSizes(Landroid/net/LinkProperties;)Z
-Landroid/net/LinkProperties;->isIdenticalValidatedPrivateDnses(Landroid/net/LinkProperties;)Z
-Landroid/net/LinkProperties;->isIPv4Provisioned()Z
-Landroid/net/LinkProperties;->isValidMtu(IZ)Z
-Landroid/net/LinkProperties;->MAX_MTU:I
-Landroid/net/LinkProperties;->mDnses:Ljava/util/ArrayList;
-Landroid/net/LinkProperties;->mDomains:Ljava/lang/String;
-Landroid/net/LinkProperties;->mHttpProxy:Landroid/net/ProxyInfo;
-Landroid/net/LinkProperties;->MIN_MTU:I
-Landroid/net/LinkProperties;->MIN_MTU_V6:I
-Landroid/net/LinkProperties;->mLinkAddresses:Ljava/util/ArrayList;
-Landroid/net/LinkProperties;->mMtu:I
-Landroid/net/LinkProperties;->mPrivateDnsServerName:Ljava/lang/String;
-Landroid/net/LinkProperties;->mRoutes:Ljava/util/ArrayList;
-Landroid/net/LinkProperties;->mStackedLinks:Ljava/util/Hashtable;
-Landroid/net/LinkProperties;->mTcpBufferSizes:Ljava/lang/String;
-Landroid/net/LinkProperties;->mUsePrivateDns:Z
-Landroid/net/LinkProperties;->mValidatedPrivateDnses:Ljava/util/ArrayList;
-Landroid/net/LinkProperties;->removeLinkAddress(Landroid/net/LinkAddress;)Z
-Landroid/net/LinkProperties;->removeStackedLink(Ljava/lang/String;)Z
-Landroid/net/LinkProperties;->removeValidatedPrivateDnsServer(Ljava/net/InetAddress;)Z
-Landroid/net/LinkProperties;->routeWithInterface(Landroid/net/RouteInfo;)Landroid/net/RouteInfo;
-Landroid/net/LinkProperties;->setPrivateDnsServerName(Ljava/lang/String;)V
-Landroid/net/LinkProperties;->setUsePrivateDns(Z)V
-Landroid/net/LinkProperties;->setValidatedPrivateDnsServers(Ljava/util/Collection;)V
 Landroid/net/LinkQualityInfo;-><init>()V
 Landroid/net/LinkQualityInfo;->CREATOR:Landroid/os/Parcelable$Creator;
 Landroid/net/LinkQualityInfo;->getDataSampleDuration()I
@@ -36677,29 +36183,6 @@
 Landroid/net/LocalSocketImpl;->writeba_native([BIILjava/io/FileDescriptor;)V
 Landroid/net/LocalSocketImpl;->writeMonitor:Ljava/lang/Object;
 Landroid/net/LocalSocketImpl;->write_native(ILjava/io/FileDescriptor;)V
-Landroid/net/MacAddress;-><init>(J)V
-Landroid/net/MacAddress;->BASE_GOOGLE_MAC:Landroid/net/MacAddress;
-Landroid/net/MacAddress;->byteAddrFromLongAddr(J)[B
-Landroid/net/MacAddress;->byteAddrFromStringAddr(Ljava/lang/String;)[B
-Landroid/net/MacAddress;->createRandomUnicastAddress()Landroid/net/MacAddress;
-Landroid/net/MacAddress;->createRandomUnicastAddress(Landroid/net/MacAddress;Ljava/util/Random;)Landroid/net/MacAddress;
-Landroid/net/MacAddress;->createRandomUnicastAddressWithGoogleBase()Landroid/net/MacAddress;
-Landroid/net/MacAddress;->ETHER_ADDR_BROADCAST:[B
-Landroid/net/MacAddress;->ETHER_ADDR_LEN:I
-Landroid/net/MacAddress;->isMacAddress([B)Z
-Landroid/net/MacAddress;->isMulticastAddress()Z
-Landroid/net/MacAddress;->LOCALLY_ASSIGNED_MASK:J
-Landroid/net/MacAddress;->longAddrFromByteAddr([B)J
-Landroid/net/MacAddress;->longAddrFromStringAddr(Ljava/lang/String;)J
-Landroid/net/MacAddress;->macAddressType([B)I
-Landroid/net/MacAddress;->mAddr:J
-Landroid/net/MacAddress;->MULTICAST_MASK:J
-Landroid/net/MacAddress;->NIC_MASK:J
-Landroid/net/MacAddress;->OUI_MASK:J
-Landroid/net/MacAddress;->stringAddrFromByteAddr([B)Ljava/lang/String;
-Landroid/net/MacAddress;->stringAddrFromLongAddr(J)Ljava/lang/String;
-Landroid/net/MacAddress;->TYPE_UNKNOWN:I
-Landroid/net/MacAddress;->VALID_LONG_MASK:J
 Landroid/net/MailTo;-><init>()V
 Landroid/net/MailTo;->BODY:Ljava/lang/String;
 Landroid/net/MailTo;->CC:Ljava/lang/String;
@@ -36958,666 +36441,6 @@
 Landroid/net/MobileLinkQualityInfo;->mLteSignalStrength:I
 Landroid/net/MobileLinkQualityInfo;->mMobileNetworkType:I
 Landroid/net/MobileLinkQualityInfo;->mRssi:I
-Landroid/net/Network$NetworkBoundSocketFactory;->connectToHost(Ljava/lang/String;ILjava/net/SocketAddress;)Ljava/net/Socket;
-Landroid/net/Network$NetworkBoundSocketFactory;->mNetId:I
-Landroid/net/Network;-><init>(Landroid/net/Network;)V
-Landroid/net/Network;->getNetIdForResolv()I
-Landroid/net/Network;->HANDLE_MAGIC:J
-Landroid/net/Network;->HANDLE_MAGIC_SIZE:I
-Landroid/net/Network;->httpKeepAlive:Z
-Landroid/net/Network;->httpKeepAliveDurationMs:J
-Landroid/net/Network;->httpMaxConnections:I
-Landroid/net/Network;->maybeInitUrlConnectionFactory()V
-Landroid/net/Network;->mLock:Ljava/lang/Object;
-Landroid/net/Network;->mNetworkBoundSocketFactory:Landroid/net/Network$NetworkBoundSocketFactory;
-Landroid/net/Network;->mPrivateDnsBypass:Z
-Landroid/net/Network;->mUrlConnectionFactory:Lcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory;
-Landroid/net/Network;->setPrivateDnsBypass(Z)V
-Landroid/net/Network;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V
-Landroid/net/NetworkAgent;-><init>(Landroid/os/Looper;Landroid/content/Context;Ljava/lang/String;Landroid/net/NetworkInfo;Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;I)V
-Landroid/net/NetworkAgent;-><init>(Landroid/os/Looper;Landroid/content/Context;Ljava/lang/String;Landroid/net/NetworkInfo;Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;ILandroid/net/NetworkMisc;)V
-Landroid/net/NetworkAgent;->BASE:I
-Landroid/net/NetworkAgent;->BW_REFRESH_MIN_WIN_MS:J
-Landroid/net/NetworkAgent;->CMD_PREVENT_AUTOMATIC_RECONNECT:I
-Landroid/net/NetworkAgent;->CMD_REPORT_NETWORK_STATUS:I
-Landroid/net/NetworkAgent;->CMD_REQUEST_BANDWIDTH_UPDATE:I
-Landroid/net/NetworkAgent;->CMD_SAVE_ACCEPT_UNVALIDATED:I
-Landroid/net/NetworkAgent;->CMD_SET_SIGNAL_STRENGTH_THRESHOLDS:I
-Landroid/net/NetworkAgent;->CMD_START_PACKET_KEEPALIVE:I
-Landroid/net/NetworkAgent;->CMD_STOP_PACKET_KEEPALIVE:I
-Landroid/net/NetworkAgent;->CMD_SUSPECT_BAD:I
-Landroid/net/NetworkAgent;->DBG:Z
-Landroid/net/NetworkAgent;->EVENT_NETWORK_CAPABILITIES_CHANGED:I
-Landroid/net/NetworkAgent;->EVENT_NETWORK_INFO_CHANGED:I
-Landroid/net/NetworkAgent;->EVENT_NETWORK_PROPERTIES_CHANGED:I
-Landroid/net/NetworkAgent;->EVENT_NETWORK_SCORE_CHANGED:I
-Landroid/net/NetworkAgent;->EVENT_PACKET_KEEPALIVE:I
-Landroid/net/NetworkAgent;->EVENT_SET_EXPLICITLY_SELECTED:I
-Landroid/net/NetworkAgent;->explicitlySelected(Z)V
-Landroid/net/NetworkAgent;->INVALID_NETWORK:I
-Landroid/net/NetworkAgent;->log(Ljava/lang/String;)V
-Landroid/net/NetworkAgent;->LOG_TAG:Ljava/lang/String;
-Landroid/net/NetworkAgent;->mAsyncChannel:Lcom/android/internal/util/AsyncChannel;
-Landroid/net/NetworkAgent;->mContext:Landroid/content/Context;
-Landroid/net/NetworkAgent;->mLastBwRefreshTime:J
-Landroid/net/NetworkAgent;->mPollLcePending:Ljava/util/concurrent/atomic/AtomicBoolean;
-Landroid/net/NetworkAgent;->mPollLceScheduled:Z
-Landroid/net/NetworkAgent;->mPreConnectedQueue:Ljava/util/ArrayList;
-Landroid/net/NetworkAgent;->netId:I
-Landroid/net/NetworkAgent;->networkStatus(ILjava/lang/String;)V
-Landroid/net/NetworkAgent;->onPacketKeepaliveEvent(II)V
-Landroid/net/NetworkAgent;->pollLceData()V
-Landroid/net/NetworkAgent;->preventAutomaticReconnect()V
-Landroid/net/NetworkAgent;->queueOrSendMessage(III)V
-Landroid/net/NetworkAgent;->queueOrSendMessage(IIILjava/lang/Object;)V
-Landroid/net/NetworkAgent;->queueOrSendMessage(ILjava/lang/Object;)V
-Landroid/net/NetworkAgent;->queueOrSendMessage(Landroid/os/Message;)V
-Landroid/net/NetworkAgent;->REDIRECT_URL_KEY:Ljava/lang/String;
-Landroid/net/NetworkAgent;->saveAcceptUnvalidated(Z)V
-Landroid/net/NetworkAgent;->sendLinkProperties(Landroid/net/LinkProperties;)V
-Landroid/net/NetworkAgent;->sendNetworkCapabilities(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkAgent;->sendNetworkScore(I)V
-Landroid/net/NetworkAgent;->setSignalStrengthThresholds([I)V
-Landroid/net/NetworkAgent;->startPacketKeepalive(Landroid/os/Message;)V
-Landroid/net/NetworkAgent;->stopPacketKeepalive(Landroid/os/Message;)V
-Landroid/net/NetworkAgent;->unwanted()V
-Landroid/net/NetworkAgent;->VALID_NETWORK:I
-Landroid/net/NetworkAgent;->VDBG:Z
-Landroid/net/NetworkAgent;->WIFI_BASE_SCORE:I
-Landroid/net/NetworkBadging;-><init>()V
-Landroid/net/NetworkBadging;->getBadgedWifiSignalResource(I)I
-Landroid/net/NetworkBadging;->getWifiSignalResource(I)I
-Landroid/net/NetworkCapabilities$NameOf;->nameOf(I)Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->addUnwantedCapability(I)V
-Landroid/net/NetworkCapabilities;->appendStringRepresentationOfBitMaskToStringBuilder(Ljava/lang/StringBuilder;JLandroid/net/NetworkCapabilities$NameOf;Ljava/lang/String;)V
-Landroid/net/NetworkCapabilities;->appliesToUid(I)Z
-Landroid/net/NetworkCapabilities;->appliesToUidRange(Landroid/net/UidRange;)Z
-Landroid/net/NetworkCapabilities;->capabilityNameOf(I)Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->capabilityNamesOf([I)Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->checkValidCapability(I)V
-Landroid/net/NetworkCapabilities;->checkValidTransportType(I)V
-Landroid/net/NetworkCapabilities;->clearAll()V
-Landroid/net/NetworkCapabilities;->combineCapabilities(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->combineLinkBandwidths(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->combineNetCapabilities(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->combineSignalStrength(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->combineSpecifiers(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->combineSSIDs(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->combineTransportTypes(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->combineUids(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->DEFAULT_CAPABILITIES:J
-Landroid/net/NetworkCapabilities;->describeFirstNonRequestableCapability()Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->describeImmutableDifferences(Landroid/net/NetworkCapabilities;)Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->equalRequestableCapabilities(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->equalsLinkBandwidths(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->equalsNetCapabilities(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->equalsNetCapabilitiesRequestable(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->equalsSignalStrength(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->equalsSpecifier(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->equalsSSID(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->equalsTransportTypes(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->equalsUids(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->FORCE_RESTRICTED_CAPABILITIES:J
-Landroid/net/NetworkCapabilities;->getSSID()Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->getUids()Ljava/util/Set;
-Landroid/net/NetworkCapabilities;->getUnwantedCapabilities()[I
-Landroid/net/NetworkCapabilities;->hasUnwantedCapability(I)Z
-Landroid/net/NetworkCapabilities;->INVALID_UID:I
-Landroid/net/NetworkCapabilities;->isValidCapability(I)Z
-Landroid/net/NetworkCapabilities;->isValidTransport(I)Z
-Landroid/net/NetworkCapabilities;->LINK_BANDWIDTH_UNSPECIFIED:I
-Landroid/net/NetworkCapabilities;->maxBandwidth(II)I
-Landroid/net/NetworkCapabilities;->MAX_NET_CAPABILITY:I
-Landroid/net/NetworkCapabilities;->MAX_TRANSPORT:I
-Landroid/net/NetworkCapabilities;->maybeMarkCapabilitiesRestricted()V
-Landroid/net/NetworkCapabilities;->mEstablishingVpnAppUid:I
-Landroid/net/NetworkCapabilities;->minBandwidth(II)I
-Landroid/net/NetworkCapabilities;->MIN_NET_CAPABILITY:I
-Landroid/net/NetworkCapabilities;->MIN_TRANSPORT:I
-Landroid/net/NetworkCapabilities;->mLinkDownBandwidthKbps:I
-Landroid/net/NetworkCapabilities;->mLinkUpBandwidthKbps:I
-Landroid/net/NetworkCapabilities;->mNetworkSpecifier:Landroid/net/NetworkSpecifier;
-Landroid/net/NetworkCapabilities;->mSSID:Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->mTransportTypes:J
-Landroid/net/NetworkCapabilities;->mUids:Landroid/util/ArraySet;
-Landroid/net/NetworkCapabilities;->mUnwantedNetworkCapabilities:J
-Landroid/net/NetworkCapabilities;->MUTABLE_CAPABILITIES:J
-Landroid/net/NetworkCapabilities;->NON_REQUESTABLE_CAPABILITIES:J
-Landroid/net/NetworkCapabilities;->removeTransportType(I)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->RESTRICTED_CAPABILITIES:J
-Landroid/net/NetworkCapabilities;->satisfiedByImmutableNetworkCapabilities(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->satisfiedByLinkBandwidths(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->satisfiedByNetCapabilities(Landroid/net/NetworkCapabilities;Z)Z
-Landroid/net/NetworkCapabilities;->satisfiedByNetworkCapabilities(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->satisfiedByNetworkCapabilities(Landroid/net/NetworkCapabilities;Z)Z
-Landroid/net/NetworkCapabilities;->satisfiedBySignalStrength(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->satisfiedBySpecifier(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->satisfiedBySSID(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->satisfiedByTransportTypes(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->satisfiedByUids(Landroid/net/NetworkCapabilities;)Z
-Landroid/net/NetworkCapabilities;->set(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkCapabilities;->setCapabilities([I)V
-Landroid/net/NetworkCapabilities;->setCapabilities([I[I)V
-Landroid/net/NetworkCapabilities;->setCapability(IZ)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->setEstablishingVpnAppUid(I)V
-Landroid/net/NetworkCapabilities;->setLinkDownstreamBandwidthKbps(I)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->setLinkUpstreamBandwidthKbps(I)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->setNetworkSpecifier(Landroid/net/NetworkSpecifier;)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->setSingleUid(I)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->setSSID(Ljava/lang/String;)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->setTransportType(IZ)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->setTransportTypes([I)V
-Landroid/net/NetworkCapabilities;->setUids(Ljava/util/Set;)Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities;->SIGNAL_STRENGTH_UNSPECIFIED:I
-Landroid/net/NetworkCapabilities;->TAG:Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->transportNameOf(I)Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->TRANSPORT_NAMES:[Ljava/lang/String;
-Landroid/net/NetworkCapabilities;->UNRESTRICTED_CAPABILITIES:J
-Landroid/net/NetworkCapabilities;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V
-Landroid/net/NetworkCapabilitiesProto;-><init>()V
-Landroid/net/NetworkCapabilitiesProto;->CAN_REPORT_SIGNAL_STRENGTH:J
-Landroid/net/NetworkCapabilitiesProto;->CAPABILITIES:J
-Landroid/net/NetworkCapabilitiesProto;->LINK_DOWN_BANDWIDTH_KBPS:J
-Landroid/net/NetworkCapabilitiesProto;->LINK_UP_BANDWIDTH_KBPS:J
-Landroid/net/NetworkCapabilitiesProto;->NETWORK_SPECIFIER:J
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_CAPTIVE_PORTAL:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_CBS:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_DUN:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_EIMS:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_FOREGROUND:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_FOTA:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_IA:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_IMS:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_INTERNET:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_MMS:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_NOT_METERED:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_NOT_RESTRICTED:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_NOT_ROAMING:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_NOT_VPN:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_RCS:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_SUPL:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_TRUSTED:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_VALIDATED:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_WIFI_P2P:I
-Landroid/net/NetworkCapabilitiesProto;->NET_CAPABILITY_XCAP:I
-Landroid/net/NetworkCapabilitiesProto;->SIGNAL_STRENGTH:J
-Landroid/net/NetworkCapabilitiesProto;->TRANSPORTS:J
-Landroid/net/NetworkCapabilitiesProto;->TRANSPORT_BLUETOOTH:I
-Landroid/net/NetworkCapabilitiesProto;->TRANSPORT_CELLULAR:I
-Landroid/net/NetworkCapabilitiesProto;->TRANSPORT_ETHERNET:I
-Landroid/net/NetworkCapabilitiesProto;->TRANSPORT_LOWPAN:I
-Landroid/net/NetworkCapabilitiesProto;->TRANSPORT_VPN:I
-Landroid/net/NetworkCapabilitiesProto;->TRANSPORT_WIFI:I
-Landroid/net/NetworkCapabilitiesProto;->TRANSPORT_WIFI_AWARE:I
-Landroid/net/NetworkConfig;-><init>(Ljava/lang/String;)V
-Landroid/net/NetworkConfig;->dependencyMet:Z
-Landroid/net/NetworkConfig;->isDefault()Z
-Landroid/net/NetworkConfig;->name:Ljava/lang/String;
-Landroid/net/NetworkConfig;->priority:I
-Landroid/net/NetworkConfig;->radio:I
-Landroid/net/NetworkConfig;->restoreTime:I
-Landroid/net/NetworkConfig;->type:I
-Landroid/net/NetworkFactory$NetworkRequestInfo;->request:Landroid/net/NetworkRequest;
-Landroid/net/NetworkFactory$NetworkRequestInfo;->requested:Z
-Landroid/net/NetworkFactory$NetworkRequestInfo;->score:I
-Landroid/net/NetworkFactory;->acceptRequest(Landroid/net/NetworkRequest;I)Z
-Landroid/net/NetworkFactory;->addNetworkRequest(Landroid/net/NetworkRequest;I)V
-Landroid/net/NetworkFactory;->BASE:I
-Landroid/net/NetworkFactory;->CMD_CANCEL_REQUEST:I
-Landroid/net/NetworkFactory;->CMD_REQUEST_NETWORK:I
-Landroid/net/NetworkFactory;->CMD_SET_FILTER:I
-Landroid/net/NetworkFactory;->CMD_SET_SCORE:I
-Landroid/net/NetworkFactory;->DBG:Z
-Landroid/net/NetworkFactory;->evalRequest(Landroid/net/NetworkFactory$NetworkRequestInfo;)V
-Landroid/net/NetworkFactory;->evalRequests()V
-Landroid/net/NetworkFactory;->getRequestCount()I
-Landroid/net/NetworkFactory;->handleAddRequest(Landroid/net/NetworkRequest;I)V
-Landroid/net/NetworkFactory;->handleRemoveRequest(Landroid/net/NetworkRequest;)V
-Landroid/net/NetworkFactory;->handleSetFilter(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkFactory;->handleSetScore(I)V
-Landroid/net/NetworkFactory;->log(Ljava/lang/String;)V
-Landroid/net/NetworkFactory;->LOG_TAG:Ljava/lang/String;
-Landroid/net/NetworkFactory;->mCapabilityFilter:Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkFactory;->mContext:Landroid/content/Context;
-Landroid/net/NetworkFactory;->mMessenger:Landroid/os/Messenger;
-Landroid/net/NetworkFactory;->mNetworkRequests:Landroid/util/SparseArray;
-Landroid/net/NetworkFactory;->mRefCount:I
-Landroid/net/NetworkFactory;->mScore:I
-Landroid/net/NetworkFactory;->needNetworkFor(Landroid/net/NetworkRequest;I)V
-Landroid/net/NetworkFactory;->reevaluateAllRequests()V
-Landroid/net/NetworkFactory;->register()V
-Landroid/net/NetworkFactory;->releaseNetworkFor(Landroid/net/NetworkRequest;)V
-Landroid/net/NetworkFactory;->removeNetworkRequest(Landroid/net/NetworkRequest;)V
-Landroid/net/NetworkFactory;->setCapabilityFilter(Landroid/net/NetworkCapabilities;)V
-Landroid/net/NetworkFactory;->startNetwork()V
-Landroid/net/NetworkFactory;->stopNetwork()V
-Landroid/net/NetworkFactory;->unregister()V
-Landroid/net/NetworkFactory;->VDBG:Z
-Landroid/net/NetworkIdentity;-><init>(IILjava/lang/String;Ljava/lang/String;ZZZ)V
-Landroid/net/NetworkIdentity;->buildNetworkIdentity(Landroid/content/Context;Landroid/net/NetworkState;Z)Landroid/net/NetworkIdentity;
-Landroid/net/NetworkIdentity;->COMBINE_SUBTYPE_ENABLED:Z
-Landroid/net/NetworkIdentity;->compareTo(Landroid/net/NetworkIdentity;)I
-Landroid/net/NetworkIdentity;->getDefaultNetwork()Z
-Landroid/net/NetworkIdentity;->getMetered()Z
-Landroid/net/NetworkIdentity;->getNetworkId()Ljava/lang/String;
-Landroid/net/NetworkIdentity;->getRoaming()Z
-Landroid/net/NetworkIdentity;->getSubscriberId()Ljava/lang/String;
-Landroid/net/NetworkIdentity;->getSubType()I
-Landroid/net/NetworkIdentity;->getType()I
-Landroid/net/NetworkIdentity;->mDefaultNetwork:Z
-Landroid/net/NetworkIdentity;->mMetered:Z
-Landroid/net/NetworkIdentity;->mNetworkId:Ljava/lang/String;
-Landroid/net/NetworkIdentity;->mRoaming:Z
-Landroid/net/NetworkIdentity;->mSubscriberId:Ljava/lang/String;
-Landroid/net/NetworkIdentity;->mSubType:I
-Landroid/net/NetworkIdentity;->mType:I
-Landroid/net/NetworkIdentity;->scrubSubscriberId(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/NetworkIdentity;->scrubSubscriberId([Ljava/lang/String;)[Ljava/lang/String;
-Landroid/net/NetworkIdentity;->SUBTYPE_COMBINED:I
-Landroid/net/NetworkIdentity;->TAG:Ljava/lang/String;
-Landroid/net/NetworkIdentity;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V
-Landroid/net/NetworkInfo;->mDetailedState:Landroid/net/NetworkInfo$DetailedState;
-Landroid/net/NetworkInfo;->mExtraInfo:Ljava/lang/String;
-Landroid/net/NetworkInfo;->mIsAvailable:Z
-Landroid/net/NetworkInfo;->mIsFailover:Z
-Landroid/net/NetworkInfo;->mIsRoaming:Z
-Landroid/net/NetworkInfo;->mNetworkType:I
-Landroid/net/NetworkInfo;->mReason:Ljava/lang/String;
-Landroid/net/NetworkInfo;->mState:Landroid/net/NetworkInfo$State;
-Landroid/net/NetworkInfo;->mSubtype:I
-Landroid/net/NetworkInfo;->mSubtypeName:Ljava/lang/String;
-Landroid/net/NetworkInfo;->mTypeName:Ljava/lang/String;
-Landroid/net/NetworkInfo;->setExtraInfo(Ljava/lang/String;)V
-Landroid/net/NetworkInfo;->setType(I)V
-Landroid/net/NetworkInfo;->stateMap:Ljava/util/EnumMap;
-Landroid/net/NetworkKey;-><init>(Landroid/os/Parcel;)V
-Landroid/net/NetworkKey;->createFromScanResult(Landroid/net/wifi/ScanResult;)Landroid/net/NetworkKey;
-Landroid/net/NetworkKey;->createFromWifiInfo(Landroid/net/wifi/WifiInfo;)Landroid/net/NetworkKey;
-Landroid/net/NetworkKey;->TAG:Ljava/lang/String;
-Landroid/net/NetworkMisc;-><init>()V
-Landroid/net/NetworkMisc;-><init>(Landroid/net/NetworkMisc;)V
-Landroid/net/NetworkMisc;->acceptUnvalidated:Z
-Landroid/net/NetworkMisc;->allowBypass:Z
-Landroid/net/NetworkMisc;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/NetworkMisc;->explicitlySelected:Z
-Landroid/net/NetworkMisc;->provisioningNotificationDisabled:Z
-Landroid/net/NetworkMisc;->subscriberId:Ljava/lang/String;
-Landroid/net/NetworkPolicy;-><init>(Landroid/net/NetworkTemplate;ILjava/lang/String;JJZ)V
-Landroid/net/NetworkPolicy;-><init>(Landroid/net/NetworkTemplate;Landroid/util/RecurrenceRule;JJJJJZZ)V
-Landroid/net/NetworkPolicy;-><init>(Landroid/net/NetworkTemplate;Landroid/util/RecurrenceRule;JJJJZZ)V
-Landroid/net/NetworkPolicy;-><init>(Landroid/os/Parcel;)V
-Landroid/net/NetworkPolicy;->buildRule(ILjava/time/ZoneId;)Landroid/util/RecurrenceRule;
-Landroid/net/NetworkPolicy;->cycleIterator()Ljava/util/Iterator;
-Landroid/net/NetworkPolicy;->cycleRule:Landroid/util/RecurrenceRule;
-Landroid/net/NetworkPolicy;->CYCLE_NONE:I
-Landroid/net/NetworkPolicy;->DEFAULT_MTU:J
-Landroid/net/NetworkPolicy;->getBytesForBackup()[B
-Landroid/net/NetworkPolicy;->getNetworkPolicyFromBackup(Ljava/io/DataInputStream;)Landroid/net/NetworkPolicy;
-Landroid/net/NetworkPolicy;->hasCycle()Z
-Landroid/net/NetworkPolicy;->lastLimitSnooze:J
-Landroid/net/NetworkPolicy;->lastRapidSnooze:J
-Landroid/net/NetworkPolicy;->lastWarningSnooze:J
-Landroid/net/NetworkPolicy;->LIMIT_DISABLED:J
-Landroid/net/NetworkPolicy;->SNOOZE_NEVER:J
-Landroid/net/NetworkPolicy;->VERSION_INIT:I
-Landroid/net/NetworkPolicy;->VERSION_RAPID:I
-Landroid/net/NetworkPolicy;->VERSION_RULE:I
-Landroid/net/NetworkPolicy;->WARNING_DISABLED:J
-Landroid/net/NetworkPolicyManager$Listener;-><init>()V
-Landroid/net/NetworkPolicyManager$Listener;->onMeteredIfacesChanged([Ljava/lang/String;)V
-Landroid/net/NetworkPolicyManager$Listener;->onRestrictBackgroundChanged(Z)V
-Landroid/net/NetworkPolicyManager$Listener;->onSubscriptionOverride(III)V
-Landroid/net/NetworkPolicyManager$Listener;->onUidPoliciesChanged(II)V
-Landroid/net/NetworkPolicyManager$Listener;->onUidRulesChanged(II)V
-Landroid/net/NetworkPolicyManager;-><init>(Landroid/content/Context;Landroid/net/INetworkPolicyManager;)V
-Landroid/net/NetworkPolicyManager;->addUidPolicy(II)V
-Landroid/net/NetworkPolicyManager;->ALLOW_PLATFORM_APP_POLICY:Z
-Landroid/net/NetworkPolicyManager;->cycleIterator(Landroid/net/NetworkPolicy;)Ljava/util/Iterator;
-Landroid/net/NetworkPolicyManager;->EXTRA_NETWORK_TEMPLATE:Ljava/lang/String;
-Landroid/net/NetworkPolicyManager;->factoryReset(Ljava/lang/String;)V
-Landroid/net/NetworkPolicyManager;->FIREWALL_CHAIN_DOZABLE:I
-Landroid/net/NetworkPolicyManager;->FIREWALL_CHAIN_NAME_DOZABLE:Ljava/lang/String;
-Landroid/net/NetworkPolicyManager;->FIREWALL_CHAIN_NAME_NONE:Ljava/lang/String;
-Landroid/net/NetworkPolicyManager;->FIREWALL_CHAIN_NAME_POWERSAVE:Ljava/lang/String;
-Landroid/net/NetworkPolicyManager;->FIREWALL_CHAIN_NAME_STANDBY:Ljava/lang/String;
-Landroid/net/NetworkPolicyManager;->FIREWALL_CHAIN_NONE:I
-Landroid/net/NetworkPolicyManager;->FIREWALL_CHAIN_POWERSAVE:I
-Landroid/net/NetworkPolicyManager;->FIREWALL_CHAIN_STANDBY:I
-Landroid/net/NetworkPolicyManager;->FIREWALL_RULE_ALLOW:I
-Landroid/net/NetworkPolicyManager;->FIREWALL_RULE_DEFAULT:I
-Landroid/net/NetworkPolicyManager;->FIREWALL_RULE_DENY:I
-Landroid/net/NetworkPolicyManager;->FIREWALL_TYPE_BLACKLIST:I
-Landroid/net/NetworkPolicyManager;->FIREWALL_TYPE_WHITELIST:I
-Landroid/net/NetworkPolicyManager;->FOREGROUND_THRESHOLD_STATE:I
-Landroid/net/NetworkPolicyManager;->isProcStateAllowedWhileIdleOrPowerSaveMode(I)Z
-Landroid/net/NetworkPolicyManager;->isProcStateAllowedWhileOnRestrictBackground(I)Z
-Landroid/net/NetworkPolicyManager;->isUidValidForPolicy(Landroid/content/Context;I)Z
-Landroid/net/NetworkPolicyManager;->MASK_ALL_NETWORKS:I
-Landroid/net/NetworkPolicyManager;->MASK_METERED_NETWORKS:I
-Landroid/net/NetworkPolicyManager;->mContext:Landroid/content/Context;
-Landroid/net/NetworkPolicyManager;->OVERRIDE_CONGESTED:I
-Landroid/net/NetworkPolicyManager;->OVERRIDE_UNMETERED:I
-Landroid/net/NetworkPolicyManager;->POLICY_ALLOW_METERED_BACKGROUND:I
-Landroid/net/NetworkPolicyManager;->POLICY_NONE:I
-Landroid/net/NetworkPolicyManager;->POLICY_REJECT_METERED_BACKGROUND:I
-Landroid/net/NetworkPolicyManager;->removeUidPolicy(II)V
-Landroid/net/NetworkPolicyManager;->resolveNetworkId(Landroid/net/wifi/WifiConfiguration;)Ljava/lang/String;
-Landroid/net/NetworkPolicyManager;->resolveNetworkId(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/NetworkPolicyManager;->RULE_ALLOW_ALL:I
-Landroid/net/NetworkPolicyManager;->RULE_ALLOW_METERED:I
-Landroid/net/NetworkPolicyManager;->RULE_NONE:I
-Landroid/net/NetworkPolicyManager;->RULE_REJECT_ALL:I
-Landroid/net/NetworkPolicyManager;->RULE_REJECT_METERED:I
-Landroid/net/NetworkPolicyManager;->RULE_TEMPORARY_ALLOW_METERED:I
-Landroid/net/NetworkPolicyManager;->setNetworkPolicies([Landroid/net/NetworkPolicy;)V
-Landroid/net/NetworkPolicyManager;->uidPoliciesToString(I)Ljava/lang/String;
-Landroid/net/NetworkPolicyManager;->uidRulesToString(I)Ljava/lang/String;
-Landroid/net/NetworkProto;-><init>()V
-Landroid/net/NetworkProto;->NET_ID:J
-Landroid/net/NetworkQuotaInfo;-><init>()V
-Landroid/net/NetworkQuotaInfo;-><init>(Landroid/os/Parcel;)V
-Landroid/net/NetworkQuotaInfo;->NO_LIMIT:J
-Landroid/net/NetworkRecommendationProvider$ServiceWrapper;->enforceCallingPermission()V
-Landroid/net/NetworkRecommendationProvider$ServiceWrapper;->execute(Ljava/lang/Runnable;)V
-Landroid/net/NetworkRecommendationProvider$ServiceWrapper;->mContext:Landroid/content/Context;
-Landroid/net/NetworkRecommendationProvider$ServiceWrapper;->mExecutor:Ljava/util/concurrent/Executor;
-Landroid/net/NetworkRecommendationProvider$ServiceWrapper;->mHandler:Landroid/os/Handler;
-Landroid/net/NetworkRecommendationProvider$ServiceWrapper;->requestScores([Landroid/net/NetworkKey;)V
-Landroid/net/NetworkRecommendationProvider;->mService:Landroid/os/IBinder;
-Landroid/net/NetworkRecommendationProvider;->TAG:Ljava/lang/String;
-Landroid/net/NetworkRecommendationProvider;->VERBOSE:Z
-Landroid/net/NetworkRequest$Builder;->addUnwantedCapability(I)Landroid/net/NetworkRequest$Builder;
-Landroid/net/NetworkRequest$Builder;->mNetworkCapabilities:Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkRequest$Builder;->setCapabilities(Landroid/net/NetworkCapabilities;)Landroid/net/NetworkRequest$Builder;
-Landroid/net/NetworkRequest$Builder;->setLinkDownstreamBandwidthKbps(I)Landroid/net/NetworkRequest$Builder;
-Landroid/net/NetworkRequest$Builder;->setLinkUpstreamBandwidthKbps(I)Landroid/net/NetworkRequest$Builder;
-Landroid/net/NetworkRequest$Builder;->setUids(Ljava/util/Set;)Landroid/net/NetworkRequest$Builder;
-Landroid/net/NetworkRequest$Type;->BACKGROUND_REQUEST:Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkRequest$Type;->LISTEN:Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkRequest$Type;->NONE:Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkRequest$Type;->REQUEST:Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkRequest$Type;->TRACK_DEFAULT:Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkRequest$Type;->valueOf(Ljava/lang/String;)Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkRequest$Type;->values()[Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkRequest;-><init>(Landroid/net/NetworkCapabilities;IILandroid/net/NetworkRequest$Type;)V
-Landroid/net/NetworkRequest;-><init>(Landroid/net/NetworkRequest;)V
-Landroid/net/NetworkRequest;->hasUnwantedCapability(I)Z
-Landroid/net/NetworkRequest;->isBackgroundRequest()Z
-Landroid/net/NetworkRequest;->isForegroundRequest()Z
-Landroid/net/NetworkRequest;->isListen()Z
-Landroid/net/NetworkRequest;->isRequest()Z
-Landroid/net/NetworkRequest;->type:Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkRequest;->typeToProtoEnum(Landroid/net/NetworkRequest$Type;)I
-Landroid/net/NetworkRequest;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V
-Landroid/net/NetworkRequestProto;-><init>()V
-Landroid/net/NetworkRequestProto;->LEGACY_TYPE:J
-Landroid/net/NetworkRequestProto;->NETWORK_CAPABILITIES:J
-Landroid/net/NetworkRequestProto;->REQUEST_ID:J
-Landroid/net/NetworkRequestProto;->TYPE:J
-Landroid/net/NetworkRequestProto;->TYPE_BACKGROUND_REQUEST:I
-Landroid/net/NetworkRequestProto;->TYPE_LISTEN:I
-Landroid/net/NetworkRequestProto;->TYPE_NONE:I
-Landroid/net/NetworkRequestProto;->TYPE_REQUEST:I
-Landroid/net/NetworkRequestProto;->TYPE_TRACK_DEFAULT:I
-Landroid/net/NetworkRequestProto;->TYPE_UNKNOWN:I
-Landroid/net/NetworkScoreManager;-><init>(Landroid/content/Context;)V
-Landroid/net/NetworkScoreManager;->CACHE_FILTER_CURRENT_NETWORK:I
-Landroid/net/NetworkScoreManager;->CACHE_FILTER_NONE:I
-Landroid/net/NetworkScoreManager;->CACHE_FILTER_SCAN_RESULTS:I
-Landroid/net/NetworkScoreManager;->getActiveScorer()Landroid/net/NetworkScorerAppData;
-Landroid/net/NetworkScoreManager;->getAllValidScorers()Ljava/util/List;
-Landroid/net/NetworkScoreManager;->isCallerActiveScorer(I)Z
-Landroid/net/NetworkScoreManager;->mContext:Landroid/content/Context;
-Landroid/net/NetworkScoreManager;->mService:Landroid/net/INetworkScoreService;
-Landroid/net/NetworkScoreManager;->NETWORK_AVAILABLE_NOTIFICATION_CHANNEL_ID_META_DATA:Ljava/lang/String;
-Landroid/net/NetworkScoreManager;->RECOMMENDATIONS_ENABLED_FORCED_OFF:I
-Landroid/net/NetworkScoreManager;->RECOMMENDATIONS_ENABLED_OFF:I
-Landroid/net/NetworkScoreManager;->RECOMMENDATIONS_ENABLED_ON:I
-Landroid/net/NetworkScoreManager;->RECOMMENDATION_SERVICE_LABEL_META_DATA:Ljava/lang/String;
-Landroid/net/NetworkScoreManager;->registerNetworkScoreCache(ILandroid/net/INetworkScoreCache;)V
-Landroid/net/NetworkScoreManager;->registerNetworkScoreCache(ILandroid/net/INetworkScoreCache;I)V
-Landroid/net/NetworkScoreManager;->requestScores([Landroid/net/NetworkKey;)Z
-Landroid/net/NetworkScoreManager;->unregisterNetworkScoreCache(ILandroid/net/INetworkScoreCache;)V
-Landroid/net/NetworkScoreManager;->USE_OPEN_WIFI_PACKAGE_META_DATA:Ljava/lang/String;
-Landroid/net/NetworkScorerAppData;-><init>(ILandroid/content/ComponentName;Ljava/lang/String;Landroid/content/ComponentName;Ljava/lang/String;)V
-Landroid/net/NetworkScorerAppData;-><init>(Landroid/os/Parcel;)V
-Landroid/net/NetworkScorerAppData;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/NetworkScorerAppData;->getEnableUseOpenWifiActivity()Landroid/content/ComponentName;
-Landroid/net/NetworkScorerAppData;->getNetworkAvailableNotificationChannelId()Ljava/lang/String;
-Landroid/net/NetworkScorerAppData;->getRecommendationServiceComponent()Landroid/content/ComponentName;
-Landroid/net/NetworkScorerAppData;->getRecommendationServiceLabel()Ljava/lang/String;
-Landroid/net/NetworkScorerAppData;->getRecommendationServicePackageName()Ljava/lang/String;
-Landroid/net/NetworkScorerAppData;->mEnableUseOpenWifiActivity:Landroid/content/ComponentName;
-Landroid/net/NetworkScorerAppData;->mNetworkAvailableNotificationChannelId:Ljava/lang/String;
-Landroid/net/NetworkScorerAppData;->mRecommendationService:Landroid/content/ComponentName;
-Landroid/net/NetworkScorerAppData;->mRecommendationServiceLabel:Ljava/lang/String;
-Landroid/net/NetworkScorerAppData;->packageUid:I
-Landroid/net/NetworkSpecifier;-><init>()V
-Landroid/net/NetworkSpecifier;->assertValidFromUid(I)V
-Landroid/net/NetworkSpecifier;->satisfiedBy(Landroid/net/NetworkSpecifier;)Z
-Landroid/net/NetworkState;-><init>(Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;Landroid/net/Network;Ljava/lang/String;Ljava/lang/String;)V
-Landroid/net/NetworkState;->EMPTY:Landroid/net/NetworkState;
-Landroid/net/NetworkState;->linkProperties:Landroid/net/LinkProperties;
-Landroid/net/NetworkState;->networkCapabilities:Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkState;->networkId:Ljava/lang/String;
-Landroid/net/NetworkState;->networkInfo:Landroid/net/NetworkInfo;
-Landroid/net/NetworkState;->SANITY_CHECK_ROAMING:Z
-Landroid/net/NetworkState;->subscriberId:Ljava/lang/String;
-Landroid/net/NetworkStats$Entry;-><init>(JJJJJ)V
-Landroid/net/NetworkStats$Entry;-><init>(Ljava/lang/String;IIIIIIJJJJJ)V
-Landroid/net/NetworkStats$Entry;-><init>(Ljava/lang/String;IIIJJJJJ)V
-Landroid/net/NetworkStats$Entry;->add(Landroid/net/NetworkStats$Entry;)V
-Landroid/net/NetworkStats$Entry;->defaultNetwork:I
-Landroid/net/NetworkStats$Entry;->isEmpty()Z
-Landroid/net/NetworkStats$Entry;->isNegative()Z
-Landroid/net/NetworkStats$Entry;->metered:I
-Landroid/net/NetworkStats$Entry;->operations:J
-Landroid/net/NetworkStats$Entry;->roaming:I
-Landroid/net/NetworkStats$NonMonotonicObserver;->foundNonMonotonic(Landroid/net/NetworkStats;ILandroid/net/NetworkStats;ILjava/lang/Object;)V
-Landroid/net/NetworkStats$NonMonotonicObserver;->foundNonMonotonic(Landroid/net/NetworkStats;ILjava/lang/Object;)V
-Landroid/net/NetworkStats;->addIfaceValues(Ljava/lang/String;JJJJ)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->addTrafficToApplications(ILjava/lang/String;Ljava/lang/String;Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;)Landroid/net/NetworkStats$Entry;
-Landroid/net/NetworkStats;->addValues(Landroid/net/NetworkStats$Entry;)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->addValues(Ljava/lang/String;IIIIIIJJJJJ)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->addValues(Ljava/lang/String;IIIJJJJJ)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->apply464xlatAdjustments(Landroid/net/NetworkStats;Landroid/net/NetworkStats;Ljava/util/Map;)V
-Landroid/net/NetworkStats;->apply464xlatAdjustments(Ljava/util/Map;)V
-Landroid/net/NetworkStats;->CLATD_INTERFACE_PREFIX:Ljava/lang/String;
-Landroid/net/NetworkStats;->clear()V
-Landroid/net/NetworkStats;->combineValues(Ljava/lang/String;IIIJJJJJ)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->combineValues(Ljava/lang/String;IIJJJJJ)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->deductTrafficFromVpnApp(ILjava/lang/String;Landroid/net/NetworkStats$Entry;)V
-Landroid/net/NetworkStats;->defaultNetworkToString(I)Ljava/lang/String;
-Landroid/net/NetworkStats;->DEFAULT_NETWORK_ALL:I
-Landroid/net/NetworkStats;->DEFAULT_NETWORK_NO:I
-Landroid/net/NetworkStats;->DEFAULT_NETWORK_YES:I
-Landroid/net/NetworkStats;->dump(Ljava/lang/String;Ljava/io/PrintWriter;)V
-Landroid/net/NetworkStats;->elapsedRealtime:J
-Landroid/net/NetworkStats;->filter(I[Ljava/lang/String;I)V
-Landroid/net/NetworkStats;->findIndex(Ljava/lang/String;IIIIII)I
-Landroid/net/NetworkStats;->findIndexHinted(Ljava/lang/String;IIIIIII)I
-Landroid/net/NetworkStats;->getElapsedRealtime()J
-Landroid/net/NetworkStats;->getElapsedRealtimeAge()J
-Landroid/net/NetworkStats;->getTotal(Landroid/net/NetworkStats$Entry;Ljava/util/HashSet;)Landroid/net/NetworkStats$Entry;
-Landroid/net/NetworkStats;->getTotal(Landroid/net/NetworkStats$Entry;Ljava/util/HashSet;IZ)Landroid/net/NetworkStats$Entry;
-Landroid/net/NetworkStats;->getTotalPackets()J
-Landroid/net/NetworkStats;->getUniqueIfaces()[Ljava/lang/String;
-Landroid/net/NetworkStats;->groupedByIface()Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->groupedByUid()Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->IFACE_ALL:Ljava/lang/String;
-Landroid/net/NetworkStats;->INTERFACES_ALL:[Ljava/lang/String;
-Landroid/net/NetworkStats;->internalSize()I
-Landroid/net/NetworkStats;->IPV4V6_HEADER_DELTA:I
-Landroid/net/NetworkStats;->meteredToString(I)Ljava/lang/String;
-Landroid/net/NetworkStats;->METERED_ALL:I
-Landroid/net/NetworkStats;->METERED_NO:I
-Landroid/net/NetworkStats;->METERED_YES:I
-Landroid/net/NetworkStats;->migrateTun(ILjava/lang/String;Ljava/lang/String;)Z
-Landroid/net/NetworkStats;->roamingToString(I)Ljava/lang/String;
-Landroid/net/NetworkStats;->ROAMING_ALL:I
-Landroid/net/NetworkStats;->ROAMING_NO:I
-Landroid/net/NetworkStats;->ROAMING_YES:I
-Landroid/net/NetworkStats;->setElapsedRealtime(J)V
-Landroid/net/NetworkStats;->setMatches(II)Z
-Landroid/net/NetworkStats;->setToCheckinString(I)Ljava/lang/String;
-Landroid/net/NetworkStats;->setToString(I)Ljava/lang/String;
-Landroid/net/NetworkStats;->setValues(ILandroid/net/NetworkStats$Entry;)V
-Landroid/net/NetworkStats;->SET_ALL:I
-Landroid/net/NetworkStats;->SET_DBG_VPN_IN:I
-Landroid/net/NetworkStats;->SET_DBG_VPN_OUT:I
-Landroid/net/NetworkStats;->SET_DEBUG_START:I
-Landroid/net/NetworkStats;->SET_DEFAULT:I
-Landroid/net/NetworkStats;->SET_FOREGROUND:I
-Landroid/net/NetworkStats;->spliceOperationsFrom(Landroid/net/NetworkStats;)V
-Landroid/net/NetworkStats;->STATS_PER_IFACE:I
-Landroid/net/NetworkStats;->STATS_PER_UID:I
-Landroid/net/NetworkStats;->subtract(Landroid/net/NetworkStats;)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->subtract(Landroid/net/NetworkStats;Landroid/net/NetworkStats;Landroid/net/NetworkStats$NonMonotonicObserver;Ljava/lang/Object;)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->subtract(Landroid/net/NetworkStats;Landroid/net/NetworkStats;Landroid/net/NetworkStats$NonMonotonicObserver;Ljava/lang/Object;Landroid/net/NetworkStats;)Landroid/net/NetworkStats;
-Landroid/net/NetworkStats;->TAG:Ljava/lang/String;
-Landroid/net/NetworkStats;->tagToString(I)Ljava/lang/String;
-Landroid/net/NetworkStats;->TAG_ALL:I
-Landroid/net/NetworkStats;->TAG_NONE:I
-Landroid/net/NetworkStats;->tunAdjustmentInit(ILjava/lang/String;Ljava/lang/String;Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;)V
-Landroid/net/NetworkStats;->tunGetPool(Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;)Landroid/net/NetworkStats$Entry;
-Landroid/net/NetworkStats;->tunSubtract(ILandroid/net/NetworkStats;Landroid/net/NetworkStats$Entry;)V
-Landroid/net/NetworkStats;->UID_ALL:I
-Landroid/net/NetworkStats;->withoutUids([I)Landroid/net/NetworkStats;
-Landroid/net/NetworkStatsHistory$DataStreamUtils;-><init>()V
-Landroid/net/NetworkStatsHistory$DataStreamUtils;->readFullLongArray(Ljava/io/DataInputStream;)[J
-Landroid/net/NetworkStatsHistory$DataStreamUtils;->readVarLong(Ljava/io/DataInputStream;)J
-Landroid/net/NetworkStatsHistory$DataStreamUtils;->readVarLongArray(Ljava/io/DataInputStream;)[J
-Landroid/net/NetworkStatsHistory$DataStreamUtils;->writeVarLong(Ljava/io/DataOutputStream;J)V
-Landroid/net/NetworkStatsHistory$DataStreamUtils;->writeVarLongArray(Ljava/io/DataOutputStream;[JI)V
-Landroid/net/NetworkStatsHistory$Entry;-><init>()V
-Landroid/net/NetworkStatsHistory$Entry;->activeTime:J
-Landroid/net/NetworkStatsHistory$Entry;->operations:J
-Landroid/net/NetworkStatsHistory$Entry;->UNKNOWN:J
-Landroid/net/NetworkStatsHistory$ParcelUtils;-><init>()V
-Landroid/net/NetworkStatsHistory$ParcelUtils;->readLongArray(Landroid/os/Parcel;)[J
-Landroid/net/NetworkStatsHistory$ParcelUtils;->writeLongArray(Landroid/os/Parcel;[JI)V
-Landroid/net/NetworkStatsHistory;-><init>(JI)V
-Landroid/net/NetworkStatsHistory;-><init>(JII)V
-Landroid/net/NetworkStatsHistory;-><init>(Landroid/net/NetworkStatsHistory;J)V
-Landroid/net/NetworkStatsHistory;-><init>(Ljava/io/DataInputStream;)V
-Landroid/net/NetworkStatsHistory;->activeTime:[J
-Landroid/net/NetworkStatsHistory;->addLong([JIJ)V
-Landroid/net/NetworkStatsHistory;->bucketCount:I
-Landroid/net/NetworkStatsHistory;->bucketDuration:J
-Landroid/net/NetworkStatsHistory;->bucketStart:[J
-Landroid/net/NetworkStatsHistory;->clear()V
-Landroid/net/NetworkStatsHistory;->dump(Lcom/android/internal/util/IndentingPrintWriter;Z)V
-Landroid/net/NetworkStatsHistory;->dumpCheckin(Ljava/io/PrintWriter;)V
-Landroid/net/NetworkStatsHistory;->ensureBuckets(JJ)V
-Landroid/net/NetworkStatsHistory;->estimateResizeBuckets(J)I
-Landroid/net/NetworkStatsHistory;->FIELD_ACTIVE_TIME:I
-Landroid/net/NetworkStatsHistory;->FIELD_ALL:I
-Landroid/net/NetworkStatsHistory;->FIELD_OPERATIONS:I
-Landroid/net/NetworkStatsHistory;->FIELD_RX_BYTES:I
-Landroid/net/NetworkStatsHistory;->FIELD_RX_PACKETS:I
-Landroid/net/NetworkStatsHistory;->FIELD_TX_BYTES:I
-Landroid/net/NetworkStatsHistory;->FIELD_TX_PACKETS:I
-Landroid/net/NetworkStatsHistory;->generateRandom(JJJ)V
-Landroid/net/NetworkStatsHistory;->generateRandom(JJJJJJJLjava/util/Random;)V
-Landroid/net/NetworkStatsHistory;->getBucketDuration()J
-Landroid/net/NetworkStatsHistory;->getIndexAfter(J)I
-Landroid/net/NetworkStatsHistory;->getLong([JIJ)J
-Landroid/net/NetworkStatsHistory;->getTotalBytes()J
-Landroid/net/NetworkStatsHistory;->insertBucket(IJ)V
-Landroid/net/NetworkStatsHistory;->intersects(JJ)Z
-Landroid/net/NetworkStatsHistory;->operations:[J
-Landroid/net/NetworkStatsHistory;->randomLong(Ljava/util/Random;JJ)J
-Landroid/net/NetworkStatsHistory;->recordData(JJJJ)V
-Landroid/net/NetworkStatsHistory;->recordData(JJLandroid/net/NetworkStats$Entry;)V
-Landroid/net/NetworkStatsHistory;->recordHistory(Landroid/net/NetworkStatsHistory;JJ)V
-Landroid/net/NetworkStatsHistory;->removeBucketsBefore(J)V
-Landroid/net/NetworkStatsHistory;->rxBytes:[J
-Landroid/net/NetworkStatsHistory;->rxPackets:[J
-Landroid/net/NetworkStatsHistory;->setLong([JIJ)V
-Landroid/net/NetworkStatsHistory;->setValues(ILandroid/net/NetworkStatsHistory$Entry;)V
-Landroid/net/NetworkStatsHistory;->totalBytes:J
-Landroid/net/NetworkStatsHistory;->txBytes:[J
-Landroid/net/NetworkStatsHistory;->txPackets:[J
-Landroid/net/NetworkStatsHistory;->VERSION_ADD_ACTIVE:I
-Landroid/net/NetworkStatsHistory;->VERSION_ADD_PACKETS:I
-Landroid/net/NetworkStatsHistory;->VERSION_INIT:I
-Landroid/net/NetworkStatsHistory;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V
-Landroid/net/NetworkStatsHistory;->writeToProto(Landroid/util/proto/ProtoOutputStream;J[JI)V
-Landroid/net/NetworkStatsHistory;->writeToStream(Ljava/io/DataOutputStream;)V
-Landroid/net/NetworkTemplate;-><init>(ILjava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
-Landroid/net/NetworkTemplate;-><init>(ILjava/lang/String;[Ljava/lang/String;Ljava/lang/String;III)V
-Landroid/net/NetworkTemplate;-><init>(Landroid/os/Parcel;)V
-Landroid/net/NetworkTemplate;->BACKUP_VERSION:I
-Landroid/net/NetworkTemplate;->buildTemplateBluetooth()Landroid/net/NetworkTemplate;
-Landroid/net/NetworkTemplate;->buildTemplateProxy()Landroid/net/NetworkTemplate;
-Landroid/net/NetworkTemplate;->buildTemplateWifi(Ljava/lang/String;)Landroid/net/NetworkTemplate;
-Landroid/net/NetworkTemplate;->forceAllNetworkTypes()V
-Landroid/net/NetworkTemplate;->getBytesForBackup()[B
-Landroid/net/NetworkTemplate;->getMatchRuleName(I)Ljava/lang/String;
-Landroid/net/NetworkTemplate;->getNetworkId()Ljava/lang/String;
-Landroid/net/NetworkTemplate;->getNetworkTemplateFromBackup(Ljava/io/DataInputStream;)Landroid/net/NetworkTemplate;
-Landroid/net/NetworkTemplate;->isKnownMatchRule(I)Z
-Landroid/net/NetworkTemplate;->isMatchRuleMobile()Z
-Landroid/net/NetworkTemplate;->isPersistable()Z
-Landroid/net/NetworkTemplate;->matches(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesBluetooth(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesDefaultNetwork(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesEthernet(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesMetered(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesMobile(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesMobileWildcard(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesProxy(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesRoaming(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesSubscriberId(Ljava/lang/String;)Z
-Landroid/net/NetworkTemplate;->matchesWifi(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->matchesWifiWildcard(Landroid/net/NetworkIdentity;)Z
-Landroid/net/NetworkTemplate;->MATCH_BLUETOOTH:I
-Landroid/net/NetworkTemplate;->MATCH_ETHERNET:I
-Landroid/net/NetworkTemplate;->MATCH_MOBILE:I
-Landroid/net/NetworkTemplate;->MATCH_MOBILE_WILDCARD:I
-Landroid/net/NetworkTemplate;->MATCH_PROXY:I
-Landroid/net/NetworkTemplate;->MATCH_WIFI:I
-Landroid/net/NetworkTemplate;->MATCH_WIFI_WILDCARD:I
-Landroid/net/NetworkTemplate;->mDefaultNetwork:I
-Landroid/net/NetworkTemplate;->mMatchRule:I
-Landroid/net/NetworkTemplate;->mMatchSubscriberIds:[Ljava/lang/String;
-Landroid/net/NetworkTemplate;->mMetered:I
-Landroid/net/NetworkTemplate;->mNetworkId:Ljava/lang/String;
-Landroid/net/NetworkTemplate;->mRoaming:I
-Landroid/net/NetworkTemplate;->mSubscriberId:Ljava/lang/String;
-Landroid/net/NetworkTemplate;->sForceAllNetworkTypes:Z
-Landroid/net/NetworkTemplate;->TAG:Ljava/lang/String;
-Landroid/net/NetworkUtils;-><init>()V
-Landroid/net/NetworkUtils;->addressTypeMatches(Ljava/net/InetAddress;Ljava/net/InetAddress;)Z
-Landroid/net/NetworkUtils;->bindProcessToNetwork(I)Z
-Landroid/net/NetworkUtils;->bindProcessToNetworkForHostResolution(I)Z
-Landroid/net/NetworkUtils;->bindSocketToNetwork(II)I
-Landroid/net/NetworkUtils;->deduplicatePrefixSet(Ljava/util/TreeSet;)Ljava/util/TreeSet;
-Landroid/net/NetworkUtils;->getBoundNetworkForProcess()I
-Landroid/net/NetworkUtils;->getNetworkPart(Ljava/net/InetAddress;I)Ljava/net/InetAddress;
-Landroid/net/NetworkUtils;->hexToInet6Address(Ljava/lang/String;)Ljava/net/InetAddress;
-Landroid/net/NetworkUtils;->inetAddressToInt(Ljava/net/Inet4Address;)I
-Landroid/net/NetworkUtils;->makeStrings(Ljava/util/Collection;)[Ljava/lang/String;
-Landroid/net/NetworkUtils;->maskRawAddress([BI)V
-Landroid/net/NetworkUtils;->netmaskIntToPrefixLength(I)I
-Landroid/net/NetworkUtils;->parcelInetAddress(Landroid/os/Parcel;Ljava/net/InetAddress;I)V
-Landroid/net/NetworkUtils;->parseIpAndMask(Ljava/lang/String;)Landroid/util/Pair;
-Landroid/net/NetworkUtils;->protectFromVpn(I)Z
-Landroid/net/NetworkUtils;->queryUserAccess(II)Z
-Landroid/net/NetworkUtils;->routedIPv4AddressCount(Ljava/util/TreeSet;)J
-Landroid/net/NetworkUtils;->routedIPv6AddressCount(Ljava/util/TreeSet;)Ljava/math/BigInteger;
-Landroid/net/NetworkUtils;->setupRaSocket(Ljava/io/FileDescriptor;I)V
-Landroid/net/NetworkUtils;->TAG:Ljava/lang/String;
-Landroid/net/NetworkUtils;->unparcelInetAddress(Landroid/os/Parcel;)Ljava/net/InetAddress;
-Landroid/net/NetworkWatchlistManager;-><init>(Landroid/content/Context;)V
-Landroid/net/NetworkWatchlistManager;-><init>(Landroid/content/Context;Lcom/android/internal/net/INetworkWatchlistManager;)V
-Landroid/net/NetworkWatchlistManager;->getWatchlistConfigHash()[B
-Landroid/net/NetworkWatchlistManager;->mContext:Landroid/content/Context;
-Landroid/net/NetworkWatchlistManager;->mNetworkWatchlistManager:Lcom/android/internal/net/INetworkWatchlistManager;
-Landroid/net/NetworkWatchlistManager;->reloadWatchlist()V
-Landroid/net/NetworkWatchlistManager;->reportWatchlistIfNecessary()V
-Landroid/net/NetworkWatchlistManager;->SHARED_MEMORY_TAG:Ljava/lang/String;
-Landroid/net/NetworkWatchlistManager;->TAG:Ljava/lang/String;
 Landroid/net/nsd/DnsSdTxtRecord;-><init>()V
 Landroid/net/nsd/DnsSdTxtRecord;-><init>(Landroid/net/nsd/DnsSdTxtRecord;)V
 Landroid/net/nsd/DnsSdTxtRecord;-><init>([B)V
@@ -37733,43 +36556,6 @@
 Landroid/net/Proxy;->setHttpProxySystemProperty(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)V
 Landroid/net/Proxy;->TAG:Ljava/lang/String;
 Landroid/net/Proxy;->validate(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
-Landroid/net/ProxyInfo;-><init>(Landroid/net/ProxyInfo;)V
-Landroid/net/ProxyInfo;-><init>(Landroid/net/Uri;)V
-Landroid/net/ProxyInfo;-><init>(Landroid/net/Uri;I)V
-Landroid/net/ProxyInfo;-><init>(Ljava/lang/String;)V
-Landroid/net/ProxyInfo;-><init>(Ljava/lang/String;ILjava/lang/String;[Ljava/lang/String;)V
-Landroid/net/ProxyInfo;->getExclusionListAsString()Ljava/lang/String;
-Landroid/net/ProxyInfo;->getSocketAddress()Ljava/net/InetSocketAddress;
-Landroid/net/ProxyInfo;->isValid()Z
-Landroid/net/ProxyInfo;->LOCAL_EXCL_LIST:Ljava/lang/String;
-Landroid/net/ProxyInfo;->LOCAL_HOST:Ljava/lang/String;
-Landroid/net/ProxyInfo;->LOCAL_PORT:I
-Landroid/net/ProxyInfo;->makeProxy()Ljava/net/Proxy;
-Landroid/net/ProxyInfo;->mExclusionList:Ljava/lang/String;
-Landroid/net/ProxyInfo;->mHost:Ljava/lang/String;
-Landroid/net/ProxyInfo;->mPacFileUrl:Landroid/net/Uri;
-Landroid/net/ProxyInfo;->mParsedExclusionList:[Ljava/lang/String;
-Landroid/net/ProxyInfo;->mPort:I
-Landroid/net/ProxyInfo;->setExclusionList(Ljava/lang/String;)V
-Landroid/net/RouteInfo;-><init>(Landroid/net/IpPrefix;)V
-Landroid/net/RouteInfo;-><init>(Landroid/net/IpPrefix;I)V
-Landroid/net/RouteInfo;-><init>(Landroid/net/IpPrefix;Ljava/net/InetAddress;)V
-Landroid/net/RouteInfo;-><init>(Landroid/net/IpPrefix;Ljava/net/InetAddress;Ljava/lang/String;I)V
-Landroid/net/RouteInfo;-><init>(Landroid/net/LinkAddress;)V
-Landroid/net/RouteInfo;->getDestinationLinkAddress()Landroid/net/LinkAddress;
-Landroid/net/RouteInfo;->getType()I
-Landroid/net/RouteInfo;->isHostRoute()Z
-Landroid/net/RouteInfo;->isIPv4Default()Z
-Landroid/net/RouteInfo;->isIPv6Default()Z
-Landroid/net/RouteInfo;->makeHostRoute(Ljava/net/InetAddress;Ljava/lang/String;)Landroid/net/RouteInfo;
-Landroid/net/RouteInfo;->makeHostRoute(Ljava/net/InetAddress;Ljava/net/InetAddress;Ljava/lang/String;)Landroid/net/RouteInfo;
-Landroid/net/RouteInfo;->mDestination:Landroid/net/IpPrefix;
-Landroid/net/RouteInfo;->mHasGateway:Z
-Landroid/net/RouteInfo;->mInterface:Ljava/lang/String;
-Landroid/net/RouteInfo;->mType:I
-Landroid/net/RouteInfo;->RTN_THROW:I
-Landroid/net/RouteInfo;->RTN_UNICAST:I
-Landroid/net/RouteInfo;->RTN_UNREACHABLE:I
 Landroid/net/RssiCurve;-><init>(Landroid/os/Parcel;)V
 Landroid/net/RssiCurve;->DEFAULT_ACTIVE_NETWORK_RSSI_BOOST:I
 Landroid/net/rtp/AudioCodec;-><init>(ILjava/lang/String;Ljava/lang/String;)V
@@ -38040,11 +36826,6 @@
 Landroid/net/SSLSessionCache;-><init>(Ljava/lang/Object;)V
 Landroid/net/SSLSessionCache;->install(Landroid/net/SSLSessionCache;Ljavax/net/ssl/SSLContext;)V
 Landroid/net/SSLSessionCache;->TAG:Ljava/lang/String;
-Landroid/net/StaticIpConfiguration;-><init>(Landroid/net/StaticIpConfiguration;)V
-Landroid/net/StaticIpConfiguration;->clear()V
-Landroid/net/StaticIpConfiguration;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/StaticIpConfiguration;->readFromParcel(Landroid/net/StaticIpConfiguration;Landroid/os/Parcel;)V
-Landroid/net/StaticIpConfiguration;->toLinkProperties(Ljava/lang/String;)Landroid/net/LinkProperties;
 Landroid/net/StringNetworkSpecifier;-><init>(Ljava/lang/String;)V
 Landroid/net/StringNetworkSpecifier;->CREATOR:Landroid/os/Parcelable$Creator;
 Landroid/net/StringNetworkSpecifier;->satisfiedBy(Landroid/net/NetworkSpecifier;)Z
@@ -38083,15 +36864,6 @@
 Landroid/net/TrafficStats;->TYPE_TX_PACKETS:I
 Landroid/net/TrafficStats;->UID_REMOVED:I
 Landroid/net/TrafficStats;->UID_TETHERING:I
-Landroid/net/UidRange;-><init>(II)V
-Landroid/net/UidRange;->contains(I)Z
-Landroid/net/UidRange;->containsRange(Landroid/net/UidRange;)Z
-Landroid/net/UidRange;->count()I
-Landroid/net/UidRange;->createForUser(I)Landroid/net/UidRange;
-Landroid/net/UidRange;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/UidRange;->getStartUser()I
-Landroid/net/UidRange;->start:I
-Landroid/net/UidRange;->stop:I
 Landroid/net/Uri$AbstractHierarchicalUri;-><init>()V
 Landroid/net/Uri$AbstractHierarchicalUri;->getUserInfoPart()Landroid/net/Uri$Part;
 Landroid/net/Uri$AbstractHierarchicalUri;->host:Ljava/lang/String;
@@ -38253,837 +37025,6 @@
 Landroid/net/WebAddress;->setAuthInfo(Ljava/lang/String;)V
 Landroid/net/WebAddress;->setPort(I)V
 Landroid/net/WebAddress;->setScheme(Ljava/lang/String;)V
-Landroid/net/wifi/AnqpInformationElement;-><init>(II[B)V
-Landroid/net/wifi/AnqpInformationElement;->ANQP_3GPP_NETWORK:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_CAPABILITY_LIST:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_CIVIC_LOC:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_DOM_NAME:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_EMERGENCY_ALERT:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_EMERGENCY_NAI:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_EMERGENCY_NUMBER:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_GEO_LOC:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_IP_ADDR_AVAILABILITY:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_LOC_URI:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_NAI_REALM:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_NEIGHBOR_REPORT:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_NWK_AUTH_TYPE:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_QUERY_LIST:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_ROAMING_CONSORTIUM:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_TDLS_CAP:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_VENDOR_SPEC:I
-Landroid/net/wifi/AnqpInformationElement;->ANQP_VENUE_NAME:I
-Landroid/net/wifi/AnqpInformationElement;->getElementId()I
-Landroid/net/wifi/AnqpInformationElement;->getPayload()[B
-Landroid/net/wifi/AnqpInformationElement;->getVendorId()I
-Landroid/net/wifi/AnqpInformationElement;->HOTSPOT20_VENDOR_ID:I
-Landroid/net/wifi/AnqpInformationElement;->HS_CAPABILITY_LIST:I
-Landroid/net/wifi/AnqpInformationElement;->HS_CONN_CAPABILITY:I
-Landroid/net/wifi/AnqpInformationElement;->HS_FRIENDLY_NAME:I
-Landroid/net/wifi/AnqpInformationElement;->HS_ICON_FILE:I
-Landroid/net/wifi/AnqpInformationElement;->HS_ICON_REQUEST:I
-Landroid/net/wifi/AnqpInformationElement;->HS_NAI_HOME_REALM_QUERY:I
-Landroid/net/wifi/AnqpInformationElement;->HS_OPERATING_CLASS:I
-Landroid/net/wifi/AnqpInformationElement;->HS_OSU_PROVIDERS:I
-Landroid/net/wifi/AnqpInformationElement;->HS_QUERY_LIST:I
-Landroid/net/wifi/AnqpInformationElement;->HS_WAN_METRICS:I
-Landroid/net/wifi/AnqpInformationElement;->mElementId:I
-Landroid/net/wifi/AnqpInformationElement;->mPayload:[B
-Landroid/net/wifi/AnqpInformationElement;->mVendorId:I
-Landroid/net/wifi/aware/Characteristics;-><init>(Landroid/os/Bundle;)V
-Landroid/net/wifi/aware/Characteristics;->KEY_MAX_MATCH_FILTER_LENGTH:Ljava/lang/String;
-Landroid/net/wifi/aware/Characteristics;->KEY_MAX_SERVICE_NAME_LENGTH:Ljava/lang/String;
-Landroid/net/wifi/aware/Characteristics;->KEY_MAX_SERVICE_SPECIFIC_INFO_LENGTH:Ljava/lang/String;
-Landroid/net/wifi/aware/Characteristics;->mCharacteristics:Landroid/os/Bundle;
-Landroid/net/wifi/aware/ConfigRequest$Builder;-><init>()V
-Landroid/net/wifi/aware/ConfigRequest$Builder;->build()Landroid/net/wifi/aware/ConfigRequest;
-Landroid/net/wifi/aware/ConfigRequest$Builder;->mClusterHigh:I
-Landroid/net/wifi/aware/ConfigRequest$Builder;->mClusterLow:I
-Landroid/net/wifi/aware/ConfigRequest$Builder;->mDiscoveryWindowInterval:[I
-Landroid/net/wifi/aware/ConfigRequest$Builder;->mMasterPreference:I
-Landroid/net/wifi/aware/ConfigRequest$Builder;->mSupport5gBand:Z
-Landroid/net/wifi/aware/ConfigRequest$Builder;->setClusterHigh(I)Landroid/net/wifi/aware/ConfigRequest$Builder;
-Landroid/net/wifi/aware/ConfigRequest$Builder;->setClusterLow(I)Landroid/net/wifi/aware/ConfigRequest$Builder;
-Landroid/net/wifi/aware/ConfigRequest$Builder;->setDiscoveryWindowInterval(II)Landroid/net/wifi/aware/ConfigRequest$Builder;
-Landroid/net/wifi/aware/ConfigRequest$Builder;->setMasterPreference(I)Landroid/net/wifi/aware/ConfigRequest$Builder;
-Landroid/net/wifi/aware/ConfigRequest$Builder;->setSupport5gBand(Z)Landroid/net/wifi/aware/ConfigRequest$Builder;
-Landroid/net/wifi/aware/ConfigRequest;-><init>(ZIII[I)V
-Landroid/net/wifi/aware/ConfigRequest;->CLUSTER_ID_MAX:I
-Landroid/net/wifi/aware/ConfigRequest;->CLUSTER_ID_MIN:I
-Landroid/net/wifi/aware/ConfigRequest;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/aware/ConfigRequest;->DW_DISABLE:I
-Landroid/net/wifi/aware/ConfigRequest;->DW_INTERVAL_NOT_INIT:I
-Landroid/net/wifi/aware/ConfigRequest;->mClusterHigh:I
-Landroid/net/wifi/aware/ConfigRequest;->mClusterLow:I
-Landroid/net/wifi/aware/ConfigRequest;->mDiscoveryWindowInterval:[I
-Landroid/net/wifi/aware/ConfigRequest;->mMasterPreference:I
-Landroid/net/wifi/aware/ConfigRequest;->mSupport5gBand:Z
-Landroid/net/wifi/aware/ConfigRequest;->NAN_BAND_24GHZ:I
-Landroid/net/wifi/aware/ConfigRequest;->NAN_BAND_5GHZ:I
-Landroid/net/wifi/aware/ConfigRequest;->validate()V
-Landroid/net/wifi/aware/DiscoverySession;-><init>(Landroid/net/wifi/aware/WifiAwareManager;II)V
-Landroid/net/wifi/aware/DiscoverySession;->DBG:Z
-Landroid/net/wifi/aware/DiscoverySession;->getClientId()I
-Landroid/net/wifi/aware/DiscoverySession;->getMaxSendRetryCount()I
-Landroid/net/wifi/aware/DiscoverySession;->getSessionId()I
-Landroid/net/wifi/aware/DiscoverySession;->MAX_SEND_RETRY_COUNT:I
-Landroid/net/wifi/aware/DiscoverySession;->mClientId:I
-Landroid/net/wifi/aware/DiscoverySession;->mCloseGuard:Ldalvik/system/CloseGuard;
-Landroid/net/wifi/aware/DiscoverySession;->mMgr:Ljava/lang/ref/WeakReference;
-Landroid/net/wifi/aware/DiscoverySession;->mSessionId:I
-Landroid/net/wifi/aware/DiscoverySession;->mTerminated:Z
-Landroid/net/wifi/aware/DiscoverySession;->sendMessage(Landroid/net/wifi/aware/PeerHandle;I[BI)V
-Landroid/net/wifi/aware/DiscoverySession;->setTerminated()V
-Landroid/net/wifi/aware/DiscoverySession;->TAG:Ljava/lang/String;
-Landroid/net/wifi/aware/DiscoverySession;->VDBG:Z
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onMatch(I[B[B)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onMatchWithDistance(I[B[BI)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onMessageReceived(I[B)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onMessageSendFail(II)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onMessageSendSuccess(I)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onSessionConfigFail(I)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onSessionConfigSuccess()V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onSessionStarted(I)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub$Proxy;->onSessionTerminated(I)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;-><init>()V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onMatch:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onMatchWithDistance:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onMessageReceived:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onMessageSendFail:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onMessageSendSuccess:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onSessionConfigFail:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onSessionConfigSuccess:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onSessionStarted:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback$Stub;->TRANSACTION_onSessionTerminated:I
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onMatch(I[B[B)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onMatchWithDistance(I[B[BI)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onMessageReceived(I[B)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onMessageSendFail(II)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onMessageSendSuccess(I)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onSessionConfigFail(I)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onSessionConfigSuccess()V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onSessionStarted(I)V
-Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;->onSessionTerminated(I)V
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub$Proxy;->onConnectFail(I)V
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub$Proxy;->onConnectSuccess(I)V
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub$Proxy;->onIdentityChanged([B)V
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub;-><init>()V
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/aware/IWifiAwareEventCallback;
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub;->TRANSACTION_onConnectFail:I
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub;->TRANSACTION_onConnectSuccess:I
-Landroid/net/wifi/aware/IWifiAwareEventCallback$Stub;->TRANSACTION_onIdentityChanged:I
-Landroid/net/wifi/aware/IWifiAwareEventCallback;->onConnectFail(I)V
-Landroid/net/wifi/aware/IWifiAwareEventCallback;->onConnectSuccess(I)V
-Landroid/net/wifi/aware/IWifiAwareEventCallback;->onIdentityChanged([B)V
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider$Stub$Proxy;->macAddress(Ljava/util/Map;)V
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider$Stub;-><init>()V
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/aware/IWifiAwareMacAddressProvider;
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider$Stub;->TRANSACTION_macAddress:I
-Landroid/net/wifi/aware/IWifiAwareMacAddressProvider;->macAddress(Ljava/util/Map;)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->connect(Landroid/os/IBinder;Ljava/lang/String;Landroid/net/wifi/aware/IWifiAwareEventCallback;Landroid/net/wifi/aware/ConfigRequest;Z)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->disconnect(ILandroid/os/IBinder;)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->getCharacteristics()Landroid/net/wifi/aware/Characteristics;
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->isUsageEnabled()Z
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->publish(Ljava/lang/String;ILandroid/net/wifi/aware/PublishConfig;Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->requestMacAddresses(ILjava/util/List;Landroid/net/wifi/aware/IWifiAwareMacAddressProvider;)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->sendMessage(III[BII)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->subscribe(Ljava/lang/String;ILandroid/net/wifi/aware/SubscribeConfig;Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->terminateSession(II)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->updatePublish(IILandroid/net/wifi/aware/PublishConfig;)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub$Proxy;->updateSubscribe(IILandroid/net/wifi/aware/SubscribeConfig;)V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;-><init>()V
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/aware/IWifiAwareManager;
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_connect:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_disconnect:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_getCharacteristics:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_isUsageEnabled:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_publish:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_requestMacAddresses:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_sendMessage:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_subscribe:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_terminateSession:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_updatePublish:I
-Landroid/net/wifi/aware/IWifiAwareManager$Stub;->TRANSACTION_updateSubscribe:I
-Landroid/net/wifi/aware/IWifiAwareManager;->connect(Landroid/os/IBinder;Ljava/lang/String;Landroid/net/wifi/aware/IWifiAwareEventCallback;Landroid/net/wifi/aware/ConfigRequest;Z)V
-Landroid/net/wifi/aware/IWifiAwareManager;->disconnect(ILandroid/os/IBinder;)V
-Landroid/net/wifi/aware/IWifiAwareManager;->getCharacteristics()Landroid/net/wifi/aware/Characteristics;
-Landroid/net/wifi/aware/IWifiAwareManager;->isUsageEnabled()Z
-Landroid/net/wifi/aware/IWifiAwareManager;->publish(Ljava/lang/String;ILandroid/net/wifi/aware/PublishConfig;Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;)V
-Landroid/net/wifi/aware/IWifiAwareManager;->requestMacAddresses(ILjava/util/List;Landroid/net/wifi/aware/IWifiAwareMacAddressProvider;)V
-Landroid/net/wifi/aware/IWifiAwareManager;->sendMessage(III[BII)V
-Landroid/net/wifi/aware/IWifiAwareManager;->subscribe(Ljava/lang/String;ILandroid/net/wifi/aware/SubscribeConfig;Landroid/net/wifi/aware/IWifiAwareDiscoverySessionCallback;)V
-Landroid/net/wifi/aware/IWifiAwareManager;->terminateSession(II)V
-Landroid/net/wifi/aware/IWifiAwareManager;->updatePublish(IILandroid/net/wifi/aware/PublishConfig;)V
-Landroid/net/wifi/aware/IWifiAwareManager;->updateSubscribe(IILandroid/net/wifi/aware/SubscribeConfig;)V
-Landroid/net/wifi/aware/PeerHandle;-><init>(I)V
-Landroid/net/wifi/aware/PeerHandle;->peerId:I
-Landroid/net/wifi/aware/PublishConfig$Builder;->mEnableRanging:Z
-Landroid/net/wifi/aware/PublishConfig$Builder;->mEnableTerminateNotification:Z
-Landroid/net/wifi/aware/PublishConfig$Builder;->mMatchFilter:[B
-Landroid/net/wifi/aware/PublishConfig$Builder;->mPublishType:I
-Landroid/net/wifi/aware/PublishConfig$Builder;->mServiceName:[B
-Landroid/net/wifi/aware/PublishConfig$Builder;->mServiceSpecificInfo:[B
-Landroid/net/wifi/aware/PublishConfig$Builder;->mTtlSec:I
-Landroid/net/wifi/aware/PublishConfig;-><init>([B[B[BIIZZ)V
-Landroid/net/wifi/aware/PublishConfig;->assertValid(Landroid/net/wifi/aware/Characteristics;Z)V
-Landroid/net/wifi/aware/PublishConfig;->mEnableRanging:Z
-Landroid/net/wifi/aware/PublishConfig;->mEnableTerminateNotification:Z
-Landroid/net/wifi/aware/PublishConfig;->mMatchFilter:[B
-Landroid/net/wifi/aware/PublishConfig;->mPublishType:I
-Landroid/net/wifi/aware/PublishConfig;->mServiceName:[B
-Landroid/net/wifi/aware/PublishConfig;->mServiceSpecificInfo:[B
-Landroid/net/wifi/aware/PublishConfig;->mTtlSec:I
-Landroid/net/wifi/aware/PublishDiscoverySession;-><init>(Landroid/net/wifi/aware/WifiAwareManager;II)V
-Landroid/net/wifi/aware/PublishDiscoverySession;->TAG:Ljava/lang/String;
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mEnableTerminateNotification:Z
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mMatchFilter:[B
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mMaxDistanceMm:I
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mMaxDistanceMmSet:Z
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mMinDistanceMm:I
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mMinDistanceMmSet:Z
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mServiceName:[B
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mServiceSpecificInfo:[B
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mSubscribeType:I
-Landroid/net/wifi/aware/SubscribeConfig$Builder;->mTtlSec:I
-Landroid/net/wifi/aware/SubscribeConfig;-><init>([B[B[BIIZZIZI)V
-Landroid/net/wifi/aware/SubscribeConfig;->assertValid(Landroid/net/wifi/aware/Characteristics;Z)V
-Landroid/net/wifi/aware/SubscribeConfig;->mEnableTerminateNotification:Z
-Landroid/net/wifi/aware/SubscribeConfig;->mMatchFilter:[B
-Landroid/net/wifi/aware/SubscribeConfig;->mMaxDistanceMm:I
-Landroid/net/wifi/aware/SubscribeConfig;->mMaxDistanceMmSet:Z
-Landroid/net/wifi/aware/SubscribeConfig;->mMinDistanceMm:I
-Landroid/net/wifi/aware/SubscribeConfig;->mMinDistanceMmSet:Z
-Landroid/net/wifi/aware/SubscribeConfig;->mServiceName:[B
-Landroid/net/wifi/aware/SubscribeConfig;->mServiceSpecificInfo:[B
-Landroid/net/wifi/aware/SubscribeConfig;->mSubscribeType:I
-Landroid/net/wifi/aware/SubscribeConfig;->mTtlSec:I
-Landroid/net/wifi/aware/SubscribeDiscoverySession;-><init>(Landroid/net/wifi/aware/WifiAwareManager;II)V
-Landroid/net/wifi/aware/SubscribeDiscoverySession;->TAG:Ljava/lang/String;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;-><init>(II)V
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->addHeader(II)V
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->allocate(I)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->allocateAndPut(Ljava/util/List;)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->checkLength(I)V
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->getActualLength()I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->getArray()[B
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->mArray:[B
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->mArrayLength:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->mLengthSize:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->mPosition:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->mTypeSize:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->putByte(IB)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->putByteArray(I[B)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->putByteArray(I[BII)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->putInt(II)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->putShort(IS)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->putString(ILjava/lang/String;)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->putZeroLengthElement(I)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;->wrap([B)Landroid/net/wifi/aware/TlvBufferUtils$TlvConstructor;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;-><init>(II[BI)V
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;->getByte()B
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;->getInt()I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;->getShort()S
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;->getString()Ljava/lang/String;
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;->length:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;->offset:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;->refArray:[B
-Landroid/net/wifi/aware/TlvBufferUtils$TlvElement;->type:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvIterable;-><init>(II[B)V
-Landroid/net/wifi/aware/TlvBufferUtils$TlvIterable;->mArray:[B
-Landroid/net/wifi/aware/TlvBufferUtils$TlvIterable;->mArrayLength:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvIterable;->mLengthSize:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvIterable;->mTypeSize:I
-Landroid/net/wifi/aware/TlvBufferUtils$TlvIterable;->toList()Ljava/util/List;
-Landroid/net/wifi/aware/TlvBufferUtils;-><init>()V
-Landroid/net/wifi/aware/TlvBufferUtils;->isValid([BII)Z
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier$ByteArrayWrapper;-><init>([B)V
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier$ByteArrayWrapper;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier$ByteArrayWrapper;->mData:[B
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;-><init>()V
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;-><init>(Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;)V
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;-><init>([Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;)V
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->assertValidFromUid(I)V
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->convert(Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;)Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier$ByteArrayWrapper;
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->initialize()V
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->isEmpty()Z
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->mDigester:Ljava/security/MessageDigest;
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->mNetworkSpecifiers:Ljava/util/Set;
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->satisfiedBy(Landroid/net/NetworkSpecifier;)Z
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->satisfiesAwareNetworkSpecifier(Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;)Z
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->TAG:Ljava/lang/String;
-Landroid/net/wifi/aware/WifiAwareAgentNetworkSpecifier;->VDBG:Z
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;-><init>(Landroid/net/wifi/aware/WifiAwareManager;Landroid/os/Looper;ZLandroid/net/wifi/aware/DiscoverySessionCallback;I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_MATCH:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_MATCH_WITH_DISTANCE:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_MESSAGE_RECEIVED:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_MESSAGE_SEND_FAIL:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_MESSAGE_SEND_SUCCESS:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_SESSION_CONFIG_FAIL:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_SESSION_CONFIG_SUCCESS:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_SESSION_STARTED:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->CALLBACK_SESSION_TERMINATED:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->mAwareManager:Ljava/lang/ref/WeakReference;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->mClientId:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->MESSAGE_BUNDLE_KEY_MESSAGE2:Ljava/lang/String;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->MESSAGE_BUNDLE_KEY_MESSAGE:Ljava/lang/String;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->mHandler:Landroid/os/Handler;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->mIsPublish:Z
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->mOriginalCallback:Landroid/net/wifi/aware/DiscoverySessionCallback;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->mSession:Landroid/net/wifi/aware/DiscoverySession;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onMatch(I[B[B)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onMatchCommon(II[B[BI)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onMatchWithDistance(I[B[BI)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onMessageReceived(I[B)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onMessageSendFail(II)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onMessageSendSuccess(I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onProxySessionStarted(I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onProxySessionTerminated(I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onSessionConfigFail(I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onSessionConfigSuccess()V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onSessionStarted(I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareDiscoverySessionCallbackProxy;->onSessionTerminated(I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;-><init>(Landroid/net/wifi/aware/WifiAwareManager;Landroid/os/Looper;Landroid/os/Binder;Landroid/net/wifi/aware/AttachCallback;Landroid/net/wifi/aware/IdentityChangedListener;)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->CALLBACK_CONNECT_FAIL:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->CALLBACK_CONNECT_SUCCESS:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->CALLBACK_IDENTITY_CHANGED:I
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->mAwareManager:Ljava/lang/ref/WeakReference;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->mBinder:Landroid/os/Binder;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->mHandler:Landroid/os/Handler;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->mLooper:Landroid/os/Looper;
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->onConnectFail(I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->onConnectSuccess(I)V
-Landroid/net/wifi/aware/WifiAwareManager$WifiAwareEventCallbackProxy;->onIdentityChanged([B)V
-Landroid/net/wifi/aware/WifiAwareManager;-><init>(Landroid/content/Context;Landroid/net/wifi/aware/IWifiAwareManager;)V
-Landroid/net/wifi/aware/WifiAwareManager;->attach(Landroid/os/Handler;Landroid/net/wifi/aware/ConfigRequest;Landroid/net/wifi/aware/AttachCallback;Landroid/net/wifi/aware/IdentityChangedListener;)V
-Landroid/net/wifi/aware/WifiAwareManager;->createNetworkSpecifier(IIILandroid/net/wifi/aware/PeerHandle;[BLjava/lang/String;)Landroid/net/NetworkSpecifier;
-Landroid/net/wifi/aware/WifiAwareManager;->createNetworkSpecifier(II[B[BLjava/lang/String;)Landroid/net/NetworkSpecifier;
-Landroid/net/wifi/aware/WifiAwareManager;->DBG:Z
-Landroid/net/wifi/aware/WifiAwareManager;->disconnect(ILandroid/os/Binder;)V
-Landroid/net/wifi/aware/WifiAwareManager;->mContext:Landroid/content/Context;
-Landroid/net/wifi/aware/WifiAwareManager;->mLock:Ljava/lang/Object;
-Landroid/net/wifi/aware/WifiAwareManager;->mService:Landroid/net/wifi/aware/IWifiAwareManager;
-Landroid/net/wifi/aware/WifiAwareManager;->publish(ILandroid/os/Looper;Landroid/net/wifi/aware/PublishConfig;Landroid/net/wifi/aware/DiscoverySessionCallback;)V
-Landroid/net/wifi/aware/WifiAwareManager;->sendMessage(IILandroid/net/wifi/aware/PeerHandle;[BII)V
-Landroid/net/wifi/aware/WifiAwareManager;->subscribe(ILandroid/os/Looper;Landroid/net/wifi/aware/SubscribeConfig;Landroid/net/wifi/aware/DiscoverySessionCallback;)V
-Landroid/net/wifi/aware/WifiAwareManager;->TAG:Ljava/lang/String;
-Landroid/net/wifi/aware/WifiAwareManager;->terminateSession(II)V
-Landroid/net/wifi/aware/WifiAwareManager;->updatePublish(IILandroid/net/wifi/aware/PublishConfig;)V
-Landroid/net/wifi/aware/WifiAwareManager;->updateSubscribe(IILandroid/net/wifi/aware/SubscribeConfig;)V
-Landroid/net/wifi/aware/WifiAwareManager;->VDBG:Z
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;-><init>(IIIII[B[BLjava/lang/String;I)V
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->assertValidFromUid(I)V
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->clientId:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->isOutOfBand()Z
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->NETWORK_SPECIFIER_TYPE_IB:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->NETWORK_SPECIFIER_TYPE_IB_ANY_PEER:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->NETWORK_SPECIFIER_TYPE_MAX_VALID:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->NETWORK_SPECIFIER_TYPE_OOB:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->NETWORK_SPECIFIER_TYPE_OOB_ANY_PEER:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->passphrase:Ljava/lang/String;
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->peerId:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->peerMac:[B
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->pmk:[B
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->requestorUid:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->role:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->satisfiedBy(Landroid/net/NetworkSpecifier;)Z
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->sessionId:I
-Landroid/net/wifi/aware/WifiAwareNetworkSpecifier;->type:I
-Landroid/net/wifi/aware/WifiAwareSession;-><init>(Landroid/net/wifi/aware/WifiAwareManager;Landroid/os/Binder;I)V
-Landroid/net/wifi/aware/WifiAwareSession;->DBG:Z
-Landroid/net/wifi/aware/WifiAwareSession;->getClientId()I
-Landroid/net/wifi/aware/WifiAwareSession;->mBinder:Landroid/os/Binder;
-Landroid/net/wifi/aware/WifiAwareSession;->mClientId:I
-Landroid/net/wifi/aware/WifiAwareSession;->mCloseGuard:Ldalvik/system/CloseGuard;
-Landroid/net/wifi/aware/WifiAwareSession;->mMgr:Ljava/lang/ref/WeakReference;
-Landroid/net/wifi/aware/WifiAwareSession;->mTerminated:Z
-Landroid/net/wifi/aware/WifiAwareSession;->TAG:Ljava/lang/String;
-Landroid/net/wifi/aware/WifiAwareSession;->VDBG:Z
-Landroid/net/wifi/aware/WifiAwareUtils;-><init>()V
-Landroid/net/wifi/aware/WifiAwareUtils;->isLegacyVersion(Landroid/content/Context;I)Z
-Landroid/net/wifi/aware/WifiAwareUtils;->validatePassphrase(Ljava/lang/String;)Z
-Landroid/net/wifi/aware/WifiAwareUtils;->validatePmk([B)Z
-Landroid/net/wifi/aware/WifiAwareUtils;->validateServiceName([B)V
-Landroid/net/wifi/BatchedScanResult;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/BatchedScanResult;->TAG:Ljava/lang/String;
-Landroid/net/wifi/EAPConstants;-><init>()V
-Landroid/net/wifi/EAPConstants;->EAP_3Com:I
-Landroid/net/wifi/EAPConstants;->EAP_ActiontecWireless:I
-Landroid/net/wifi/EAPConstants;->EAP_AKA:I
-Landroid/net/wifi/EAPConstants;->EAP_AKA_PRIME:I
-Landroid/net/wifi/EAPConstants;->EAP_EKE:I
-Landroid/net/wifi/EAPConstants;->EAP_FAST:I
-Landroid/net/wifi/EAPConstants;->EAP_GPSK:I
-Landroid/net/wifi/EAPConstants;->EAP_HTTPDigest:I
-Landroid/net/wifi/EAPConstants;->EAP_IKEv2:I
-Landroid/net/wifi/EAPConstants;->EAP_KEA:I
-Landroid/net/wifi/EAPConstants;->EAP_KEA_VALIDATE:I
-Landroid/net/wifi/EAPConstants;->EAP_LEAP:I
-Landroid/net/wifi/EAPConstants;->EAP_Link:I
-Landroid/net/wifi/EAPConstants;->EAP_MD5:I
-Landroid/net/wifi/EAPConstants;->EAP_MOBAC:I
-Landroid/net/wifi/EAPConstants;->EAP_MSCHAPv2:I
-Landroid/net/wifi/EAPConstants;->EAP_OTP:I
-Landroid/net/wifi/EAPConstants;->EAP_PAX:I
-Landroid/net/wifi/EAPConstants;->EAP_PEAP:I
-Landroid/net/wifi/EAPConstants;->EAP_POTP:I
-Landroid/net/wifi/EAPConstants;->EAP_PSK:I
-Landroid/net/wifi/EAPConstants;->EAP_PWD:I
-Landroid/net/wifi/EAPConstants;->EAP_RSA:I
-Landroid/net/wifi/EAPConstants;->EAP_SAKE:I
-Landroid/net/wifi/EAPConstants;->EAP_SIM:I
-Landroid/net/wifi/EAPConstants;->EAP_SPEKE:I
-Landroid/net/wifi/EAPConstants;->EAP_TEAP:I
-Landroid/net/wifi/EAPConstants;->EAP_TLS:I
-Landroid/net/wifi/EAPConstants;->EAP_TTLS:I
-Landroid/net/wifi/EAPConstants;->EAP_ZLXEAP:I
-Landroid/net/wifi/hotspot2/ConfigParser$MimeHeader;-><init>()V
-Landroid/net/wifi/hotspot2/ConfigParser$MimeHeader;->boundary:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser$MimeHeader;->contentType:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser$MimeHeader;->encodingType:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser$MimePart;-><init>()V
-Landroid/net/wifi/hotspot2/ConfigParser$MimePart;->data:[B
-Landroid/net/wifi/hotspot2/ConfigParser$MimePart;->isLast:Z
-Landroid/net/wifi/hotspot2/ConfigParser$MimePart;->type:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;-><init>()V
-Landroid/net/wifi/hotspot2/ConfigParser;->BOUNDARY:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->CONTENT_TRANSFER_ENCODING:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->CONTENT_TYPE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->createPasspointConfig(Ljava/util/Map;)Landroid/net/wifi/hotspot2/PasspointConfiguration;
-Landroid/net/wifi/hotspot2/ConfigParser;->ENCODING_BASE64:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->parseCACert([B)Ljava/security/cert/X509Certificate;
-Landroid/net/wifi/hotspot2/ConfigParser;->parseContentType(Ljava/lang/String;)Landroid/util/Pair;
-Landroid/net/wifi/hotspot2/ConfigParser;->parseHeaders(Ljava/io/LineNumberReader;)Landroid/net/wifi/hotspot2/ConfigParser$MimeHeader;
-Landroid/net/wifi/hotspot2/ConfigParser;->parseMimeMultipartMessage(Ljava/io/LineNumberReader;)Ljava/util/Map;
-Landroid/net/wifi/hotspot2/ConfigParser;->parseMimePart(Ljava/io/LineNumberReader;Ljava/lang/String;)Landroid/net/wifi/hotspot2/ConfigParser$MimePart;
-Landroid/net/wifi/hotspot2/ConfigParser;->parsePkcs12([B)Landroid/util/Pair;
-Landroid/net/wifi/hotspot2/ConfigParser;->readHeaders(Ljava/io/LineNumberReader;)Ljava/util/Map;
-Landroid/net/wifi/hotspot2/ConfigParser;->TAG:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->TYPE_CA_CERT:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->TYPE_MULTIPART_MIXED:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->TYPE_PASSPOINT_PROFILE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->TYPE_PKCS12:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/ConfigParser;->TYPE_WIFI_CONFIG:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub$Proxy;->onProvisioningFailure(I)V
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub$Proxy;->onProvisioningStatus(I)V
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub;-><init>()V
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/hotspot2/IProvisioningCallback;
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub;->TRANSACTION_onProvisioningFailure:I
-Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub;->TRANSACTION_onProvisioningStatus:I
-Landroid/net/wifi/hotspot2/IProvisioningCallback;->onProvisioningFailure(I)V
-Landroid/net/wifi/hotspot2/IProvisioningCallback;->onProvisioningStatus(I)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$InternalNode;-><init>(Ljava/lang/String;Ljava/util/List;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$InternalNode;->getChildren()Ljava/util/List;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$InternalNode;->getValue()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$InternalNode;->isLeaf()Z
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$InternalNode;->mChildren:Ljava/util/List;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$LeafNode;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$LeafNode;->getChildren()Ljava/util/List;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$LeafNode;->getValue()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$LeafNode;->isLeaf()Z
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$LeafNode;->mValue:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$ParsingException;-><init>(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;-><init>(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;->getChildren()Ljava/util/List;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;->getName()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;->getValue()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;->isLeaf()Z
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;->mName:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;-><init>()V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->buildPpsNode(Landroid/net/wifi/hotspot2/omadm/XMLNode;)Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->convertFromLongList(Ljava/util/List;)[J
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->getPpsNodeValue(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_AAA_SERVER_TRUST_ROOT:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_ABLE_TO_SHARE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_CERTIFICATE_TYPE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_CERT_SHA256_FINGERPRINT:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_CERT_URL:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_CHECK_AAA_SERVER_CERT_STATUS:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_COUNTRY:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_CREATION_DATE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_CREDENTIAL:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_CREDENTIAL_PRIORITY:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_DATA_LIMIT:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_DIGITAL_CERTIFICATE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_DOWNLINK_BANDWIDTH:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_EAP_METHOD:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_EAP_TYPE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_EXPIRATION_DATE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_EXTENSION:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_FQDN:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_FQDN_MATCH:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_FRIENDLY_NAME:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_HESSID:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_HOMESP:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_HOME_OI:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_HOME_OI_LIST:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_HOME_OI_REQUIRED:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_ICON_URL:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_INNER_EAP_TYPE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_INNER_METHOD:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_INNER_VENDOR_ID:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_INNER_VENDOR_TYPE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_IP_PROTOCOL:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_MACHINE_MANAGED:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_MAXIMUM_BSS_LOAD_VALUE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_MIN_BACKHAUL_THRESHOLD:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_NETWORK_ID:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_NETWORK_TYPE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_OTHER:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_OTHER_HOME_PARTNERS:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_PASSWORD:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_PER_PROVIDER_SUBSCRIPTION:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_POLICY:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_POLICY_UPDATE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_PORT_NUMBER:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_PREFERRED_ROAMING_PARTNER_LIST:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_PRIORITY:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_REALM:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_REQUIRED_PROTO_PORT_TUPLE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_RESTRICTION:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_ROAMING_CONSORTIUM_OI:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_SIM:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_SIM_IMSI:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_SOFT_TOKEN_APP:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_SP_EXCLUSION_LIST:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_SSID:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_START_DATE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_SUBSCRIPTION_PARAMETER:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_SUBSCRIPTION_UPDATE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_TIME_LIMIT:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_TRUST_ROOT:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_TYPE_OF_SUBSCRIPTION:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_UPDATE_IDENTIFIER:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_UPDATE_INTERVAL:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_UPDATE_METHOD:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_UPLINK_BANDWIDTH:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_URI:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_USAGE_LIMITS:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_USAGE_TIME_PERIOD:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_USERNAME:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_USERNAME_PASSWORD:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_VENDOR_ID:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->NODE_VENDOR_TYPE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseAAAServerTrustRootList(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Ljava/util/Map;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseCertificateCredential(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseCredential(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/pps/Credential;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseDate(Ljava/lang/String;)J
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseEAPMethod(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseHexString(Ljava/lang/String;)[B
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseHomeOIInstance(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/util/Pair;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseHomeOIList(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/util/Pair;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseHomeSP(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/pps/HomeSp;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseInteger(Ljava/lang/String;)I
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseLong(Ljava/lang/String;I)J
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseMinBackhaulThreshold(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;Landroid/net/wifi/hotspot2/pps/Policy;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseMinBackhaulThresholdInstance(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;Landroid/net/wifi/hotspot2/pps/Policy;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseNetworkIdInstance(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/util/Pair;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseNetworkIds(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Ljava/util/Map;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseOtherHomePartnerInstance(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseOtherHomePartners(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)[Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parsePolicy(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/pps/Policy;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parsePpsInstance(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/PasspointConfiguration;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parsePpsNode(Landroid/net/wifi/hotspot2/omadm/XMLNode;)Landroid/net/wifi/hotspot2/PasspointConfiguration;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parsePreferredRoamingPartner(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parsePreferredRoamingPartnerList(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Ljava/util/List;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseProtoPortTuple(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/util/Pair;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseRequiredProtoPortTuple(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Ljava/util/Map;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseRoamingConsortiumOI(Ljava/lang/String;)[J
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseSimCredential(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseSpExclusionInstance(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseSpExclusionList(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)[Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseSubscriptionParameter(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;Landroid/net/wifi/hotspot2/PasspointConfiguration;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseTrustRoot(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/util/Pair;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseUpdateParameter(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/pps/UpdateParameter;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseUpdateUserCredential(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/util/Pair;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseUrn(Landroid/net/wifi/hotspot2/omadm/XMLNode;)Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseUsageLimits(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;Landroid/net/wifi/hotspot2/PasspointConfiguration;)V
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->parseUserCredential(Landroid/net/wifi/hotspot2/omadm/PpsMoParser$PPSNode;)Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->PPS_MO_URN:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG_DDF_NAME:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG_MANAGEMENT_TREE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG_NODE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG_NODE_NAME:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG_RT_PROPERTIES:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG_TYPE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG_VALUE:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/PpsMoParser;->TAG_VER_DTD:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;-><init>(Landroid/net/wifi/hotspot2/omadm/XMLNode;Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->addChild(Landroid/net/wifi/hotspot2/omadm/XMLNode;)V
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->addText(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->close()V
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->getChildren()Ljava/util/List;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->getParent()Landroid/net/wifi/hotspot2/omadm/XMLNode;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->getTag()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->getText()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->mChildren:Ljava/util/List;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->mParent:Landroid/net/wifi/hotspot2/omadm/XMLNode;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->mTag:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->mText:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/omadm/XMLNode;->mTextBuilder:Ljava/lang/StringBuilder;
-Landroid/net/wifi/hotspot2/omadm/XMLParser;-><init>()V
-Landroid/net/wifi/hotspot2/omadm/XMLParser;->mCurrent:Landroid/net/wifi/hotspot2/omadm/XMLNode;
-Landroid/net/wifi/hotspot2/omadm/XMLParser;->mRoot:Landroid/net/wifi/hotspot2/omadm/XMLNode;
-Landroid/net/wifi/hotspot2/omadm/XMLParser;->parse(Ljava/lang/String;)Landroid/net/wifi/hotspot2/omadm/XMLNode;
-Landroid/net/wifi/hotspot2/OsuProvider;-><init>(Landroid/net/wifi/hotspot2/OsuProvider;)V
-Landroid/net/wifi/hotspot2/OsuProvider;-><init>(Landroid/net/wifi/WifiSsid;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;Ljava/lang/String;Ljava/util/List;Landroid/graphics/drawable/Icon;)V
-Landroid/net/wifi/hotspot2/OsuProvider;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/hotspot2/OsuProvider;->getFriendlyName()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/OsuProvider;->getIcon()Landroid/graphics/drawable/Icon;
-Landroid/net/wifi/hotspot2/OsuProvider;->getMethodList()Ljava/util/List;
-Landroid/net/wifi/hotspot2/OsuProvider;->getNetworkAccessIdentifier()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/OsuProvider;->getOsuSsid()Landroid/net/wifi/WifiSsid;
-Landroid/net/wifi/hotspot2/OsuProvider;->getServerUri()Landroid/net/Uri;
-Landroid/net/wifi/hotspot2/OsuProvider;->getServiceDescription()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/OsuProvider;->METHOD_OMA_DM:I
-Landroid/net/wifi/hotspot2/OsuProvider;->METHOD_SOAP_XML_SPP:I
-Landroid/net/wifi/hotspot2/OsuProvider;->mFriendlyName:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/OsuProvider;->mIcon:Landroid/graphics/drawable/Icon;
-Landroid/net/wifi/hotspot2/OsuProvider;->mMethodList:Ljava/util/List;
-Landroid/net/wifi/hotspot2/OsuProvider;->mNetworkAccessIdentifier:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/OsuProvider;->mOsuSsid:Landroid/net/wifi/WifiSsid;
-Landroid/net/wifi/hotspot2/OsuProvider;->mServerUri:Landroid/net/Uri;
-Landroid/net/wifi/hotspot2/OsuProvider;->mServiceDescription:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->CERTIFICATE_SHA256_BYTES:I
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getCredentialPriority()I
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getPolicy()Landroid/net/wifi/hotspot2/pps/Policy;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getSubscriptionCreationTimeInMillis()J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getSubscriptionExpirationTimeInMillis()J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getSubscriptionType()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getSubscriptionUpdate()Landroid/net/wifi/hotspot2/pps/UpdateParameter;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getTrustRootCertList()Ljava/util/Map;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getUpdateIdentifier()I
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getUsageLimitDataLimit()J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getUsageLimitStartTimeInMillis()J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getUsageLimitTimeLimitInMinutes()J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->getUsageLimitUsageTimePeriodInMinutes()J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->isTrustRootCertListEquals(Ljava/util/Map;Ljava/util/Map;)Z
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->MAX_URL_BYTES:I
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mCredential:Landroid/net/wifi/hotspot2/pps/Credential;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mCredentialPriority:I
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mHomeSp:Landroid/net/wifi/hotspot2/pps/HomeSp;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mPolicy:Landroid/net/wifi/hotspot2/pps/Policy;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mSubscriptionCreationTimeInMillis:J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mSubscriptionExpirationTimeInMillis:J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mSubscriptionType:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mSubscriptionUpdate:Landroid/net/wifi/hotspot2/pps/UpdateParameter;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mTrustRootCertList:Ljava/util/Map;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mUpdateIdentifier:I
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mUsageLimitDataLimit:J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mUsageLimitStartTimeInMillis:J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mUsageLimitTimeLimitInMinutes:J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->mUsageLimitUsageTimePeriodInMinutes:J
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->NULL_VALUE:I
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setCredentialPriority(I)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setPolicy(Landroid/net/wifi/hotspot2/pps/Policy;)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setSubscriptionCreationTimeInMillis(J)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setSubscriptionExpirationTimeInMillis(J)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setSubscriptionType(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setSubscriptionUpdate(Landroid/net/wifi/hotspot2/pps/UpdateParameter;)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setTrustRootCertList(Ljava/util/Map;)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setUpdateIdentifier(I)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setUsageLimitDataLimit(J)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setUsageLimitStartTimeInMillis(J)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setUsageLimitTimeLimitInMinutes(J)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->setUsageLimitUsageTimePeriodInMinutes(J)V
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->TAG:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->validate()Z
-Landroid/net/wifi/hotspot2/PasspointConfiguration;->writeTrustRootCerts(Landroid/os/Parcel;Ljava/util/Map;)V
-Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;->CERT_SHA256_FINGER_PRINT_LENGTH:I
-Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;->CERT_TYPE_X509V3:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;->mCertSha256Fingerprint:[B
-Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;->mCertType:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;->validate()Z
-Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;->MAX_IMSI_LENGTH:I
-Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;->mEapType:I
-Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;->mImsi:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;->validate()Z
-Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;->verifyImsi()Z
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->AUTH_METHOD_MSCHAP:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->AUTH_METHOD_MSCHAPV2:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->AUTH_METHOD_PAP:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->getAbleToShare()Z
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->getMachineManaged()Z
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->getSoftTokenApp()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->mAbleToShare:Z
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->MAX_PASSWORD_BYTES:I
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->MAX_USERNAME_BYTES:I
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->mEapType:I
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->mMachineManaged:Z
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->mNonEapInnerMethod:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->mPassword:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->mSoftTokenApp:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->mUsername:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->setAbleToShare(Z)V
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->setMachineManaged(Z)V
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->setSoftTokenApp(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->SUPPORTED_AUTH:Ljava/util/Set;
-Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;->validate()Z
-Landroid/net/wifi/hotspot2/pps/Credential;->getCheckAaaServerCertStatus()Z
-Landroid/net/wifi/hotspot2/pps/Credential;->getCreationTimeInMillis()J
-Landroid/net/wifi/hotspot2/pps/Credential;->getExpirationTimeInMillis()J
-Landroid/net/wifi/hotspot2/pps/Credential;->isPrivateKeyEquals(Ljava/security/PrivateKey;Ljava/security/PrivateKey;)Z
-Landroid/net/wifi/hotspot2/pps/Credential;->isX509CertificateEquals(Ljava/security/cert/X509Certificate;Ljava/security/cert/X509Certificate;)Z
-Landroid/net/wifi/hotspot2/pps/Credential;->isX509CertificatesEquals([Ljava/security/cert/X509Certificate;[Ljava/security/cert/X509Certificate;)Z
-Landroid/net/wifi/hotspot2/pps/Credential;->MAX_REALM_BYTES:I
-Landroid/net/wifi/hotspot2/pps/Credential;->mCaCertificate:Ljava/security/cert/X509Certificate;
-Landroid/net/wifi/hotspot2/pps/Credential;->mCertCredential:Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;
-Landroid/net/wifi/hotspot2/pps/Credential;->mCheckAaaServerCertStatus:Z
-Landroid/net/wifi/hotspot2/pps/Credential;->mClientCertificateChain:[Ljava/security/cert/X509Certificate;
-Landroid/net/wifi/hotspot2/pps/Credential;->mClientPrivateKey:Ljava/security/PrivateKey;
-Landroid/net/wifi/hotspot2/pps/Credential;->mCreationTimeInMillis:J
-Landroid/net/wifi/hotspot2/pps/Credential;->mExpirationTimeInMillis:J
-Landroid/net/wifi/hotspot2/pps/Credential;->mRealm:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential;->mSimCredential:Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;
-Landroid/net/wifi/hotspot2/pps/Credential;->mUserCredential:Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;
-Landroid/net/wifi/hotspot2/pps/Credential;->setCheckAaaServerCertStatus(Z)V
-Landroid/net/wifi/hotspot2/pps/Credential;->setCreationTimeInMillis(J)V
-Landroid/net/wifi/hotspot2/pps/Credential;->setExpirationTimeInMillis(J)V
-Landroid/net/wifi/hotspot2/pps/Credential;->TAG:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Credential;->validate()Z
-Landroid/net/wifi/hotspot2/pps/Credential;->verifyCertCredential()Z
-Landroid/net/wifi/hotspot2/pps/Credential;->verifySha256Fingerprint([Ljava/security/cert/X509Certificate;[B)Z
-Landroid/net/wifi/hotspot2/pps/Credential;->verifySimCredential()Z
-Landroid/net/wifi/hotspot2/pps/Credential;->verifyUserCredential()Z
-Landroid/net/wifi/hotspot2/pps/HomeSp;->getHomeNetworkIds()Ljava/util/Map;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->getIconUrl()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->getMatchAllOis()[J
-Landroid/net/wifi/hotspot2/pps/HomeSp;->getMatchAnyOis()[J
-Landroid/net/wifi/hotspot2/pps/HomeSp;->getOtherHomePartners()[Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->MAX_SSID_BYTES:I
-Landroid/net/wifi/hotspot2/pps/HomeSp;->mFqdn:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->mFriendlyName:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->mHomeNetworkIds:Ljava/util/Map;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->mIconUrl:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->mMatchAllOis:[J
-Landroid/net/wifi/hotspot2/pps/HomeSp;->mMatchAnyOis:[J
-Landroid/net/wifi/hotspot2/pps/HomeSp;->mOtherHomePartners:[Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->mRoamingConsortiumOis:[J
-Landroid/net/wifi/hotspot2/pps/HomeSp;->NULL_VALUE:I
-Landroid/net/wifi/hotspot2/pps/HomeSp;->setHomeNetworkIds(Ljava/util/Map;)V
-Landroid/net/wifi/hotspot2/pps/HomeSp;->setIconUrl(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/HomeSp;->setMatchAllOis([J)V
-Landroid/net/wifi/hotspot2/pps/HomeSp;->setMatchAnyOis([J)V
-Landroid/net/wifi/hotspot2/pps/HomeSp;->setOtherHomePartners([Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/HomeSp;->TAG:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/HomeSp;->validate()Z
-Landroid/net/wifi/hotspot2/pps/HomeSp;->writeHomeNetworkIds(Landroid/os/Parcel;Ljava/util/Map;)V
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;-><init>()V
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;-><init>(Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;)V
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->getCountries()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->getFqdn()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->getFqdnExactMatch()Z
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->getPriority()I
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->mCountries:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->mFqdn:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->mFqdnExactMatch:Z
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->mPriority:I
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->setCountries(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->setFqdn(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->setFqdnExactMatch(Z)V
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->setPriority(I)V
-Landroid/net/wifi/hotspot2/pps/Policy$RoamingPartner;->validate()Z
-Landroid/net/wifi/hotspot2/pps/Policy;-><init>()V
-Landroid/net/wifi/hotspot2/pps/Policy;-><init>(Landroid/net/wifi/hotspot2/pps/Policy;)V
-Landroid/net/wifi/hotspot2/pps/Policy;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/hotspot2/pps/Policy;->getExcludedSsidList()[Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Policy;->getMaximumBssLoadValue()I
-Landroid/net/wifi/hotspot2/pps/Policy;->getMinHomeDownlinkBandwidth()J
-Landroid/net/wifi/hotspot2/pps/Policy;->getMinHomeUplinkBandwidth()J
-Landroid/net/wifi/hotspot2/pps/Policy;->getMinRoamingDownlinkBandwidth()J
-Landroid/net/wifi/hotspot2/pps/Policy;->getMinRoamingUplinkBandwidth()J
-Landroid/net/wifi/hotspot2/pps/Policy;->getPolicyUpdate()Landroid/net/wifi/hotspot2/pps/UpdateParameter;
-Landroid/net/wifi/hotspot2/pps/Policy;->getPreferredRoamingPartnerList()Ljava/util/List;
-Landroid/net/wifi/hotspot2/pps/Policy;->getRequiredProtoPortMap()Ljava/util/Map;
-Landroid/net/wifi/hotspot2/pps/Policy;->MAX_EXCLUSION_SSIDS:I
-Landroid/net/wifi/hotspot2/pps/Policy;->MAX_PORT_STRING_BYTES:I
-Landroid/net/wifi/hotspot2/pps/Policy;->MAX_SSID_BYTES:I
-Landroid/net/wifi/hotspot2/pps/Policy;->mExcludedSsidList:[Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Policy;->mMaximumBssLoadValue:I
-Landroid/net/wifi/hotspot2/pps/Policy;->mMinHomeDownlinkBandwidth:J
-Landroid/net/wifi/hotspot2/pps/Policy;->mMinHomeUplinkBandwidth:J
-Landroid/net/wifi/hotspot2/pps/Policy;->mMinRoamingDownlinkBandwidth:J
-Landroid/net/wifi/hotspot2/pps/Policy;->mMinRoamingUplinkBandwidth:J
-Landroid/net/wifi/hotspot2/pps/Policy;->mPolicyUpdate:Landroid/net/wifi/hotspot2/pps/UpdateParameter;
-Landroid/net/wifi/hotspot2/pps/Policy;->mPreferredRoamingPartnerList:Ljava/util/List;
-Landroid/net/wifi/hotspot2/pps/Policy;->mRequiredProtoPortMap:Ljava/util/Map;
-Landroid/net/wifi/hotspot2/pps/Policy;->NULL_VALUE:I
-Landroid/net/wifi/hotspot2/pps/Policy;->setExcludedSsidList([Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/Policy;->setMaximumBssLoadValue(I)V
-Landroid/net/wifi/hotspot2/pps/Policy;->setMinHomeDownlinkBandwidth(J)V
-Landroid/net/wifi/hotspot2/pps/Policy;->setMinHomeUplinkBandwidth(J)V
-Landroid/net/wifi/hotspot2/pps/Policy;->setMinRoamingDownlinkBandwidth(J)V
-Landroid/net/wifi/hotspot2/pps/Policy;->setMinRoamingUplinkBandwidth(J)V
-Landroid/net/wifi/hotspot2/pps/Policy;->setPolicyUpdate(Landroid/net/wifi/hotspot2/pps/UpdateParameter;)V
-Landroid/net/wifi/hotspot2/pps/Policy;->setPreferredRoamingPartnerList(Ljava/util/List;)V
-Landroid/net/wifi/hotspot2/pps/Policy;->setRequiredProtoPortMap(Ljava/util/Map;)V
-Landroid/net/wifi/hotspot2/pps/Policy;->TAG:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/Policy;->validate()Z
-Landroid/net/wifi/hotspot2/pps/Policy;->writeProtoPortMap(Landroid/os/Parcel;Ljava/util/Map;)V
-Landroid/net/wifi/hotspot2/pps/Policy;->writeRoamingPartnerList(Landroid/os/Parcel;ILjava/util/List;)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;-><init>()V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;-><init>(Landroid/net/wifi/hotspot2/pps/UpdateParameter;)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->CERTIFICATE_SHA256_BYTES:I
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->getBase64EncodedPassword()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->getRestriction()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->getServerUri()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->getTrustRootCertSha256Fingerprint()[B
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->getTrustRootCertUrl()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->getUpdateIntervalInMinutes()J
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->getUpdateMethod()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->getUsername()Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->MAX_PASSWORD_BYTES:I
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->MAX_URI_BYTES:I
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->MAX_URL_BYTES:I
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->MAX_USERNAME_BYTES:I
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->mBase64EncodedPassword:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->mRestriction:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->mServerUri:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->mTrustRootCertSha256Fingerprint:[B
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->mTrustRootCertUrl:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->mUpdateIntervalInMinutes:J
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->mUpdateMethod:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->mUsername:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->setBase64EncodedPassword(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->setRestriction(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->setServerUri(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->setTrustRootCertSha256Fingerprint([B)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->setTrustRootCertUrl(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->setUpdateIntervalInMinutes(J)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->setUpdateMethod(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->setUsername(Ljava/lang/String;)V
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->TAG:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->UPDATE_CHECK_INTERVAL_NEVER:J
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->UPDATE_METHOD_OMADM:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->UPDATE_METHOD_SSP:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->UPDATE_RESTRICTION_HOMESP:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->UPDATE_RESTRICTION_ROAMING_PARTNER:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->UPDATE_RESTRICTION_UNRESTRICTED:Ljava/lang/String;
-Landroid/net/wifi/hotspot2/pps/UpdateParameter;->validate()Z
 Landroid/net/wifi/hotspot2/ProvisioningCallback;-><init>()V
 Landroid/net/wifi/hotspot2/ProvisioningCallback;->onProvisioningFailure(I)V
 Landroid/net/wifi/hotspot2/ProvisioningCallback;->onProvisioningStatus(I)V
@@ -39099,539 +37040,6 @@
 Landroid/net/wifi/hotspot2/ProvisioningCallback;->OSU_STATUS_PROVIDER_VERIFIED:I
 Landroid/net/wifi/hotspot2/ProvisioningCallback;->OSU_STATUS_SERVER_CONNECTED:I
 Landroid/net/wifi/hotspot2/ProvisioningCallback;->OSU_STATUS_SERVER_VALIDATED:I
-Landroid/net/wifi/ISoftApCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/ISoftApCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/ISoftApCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/ISoftApCallback$Stub$Proxy;->onNumClientsChanged(I)V
-Landroid/net/wifi/ISoftApCallback$Stub$Proxy;->onStateChanged(II)V
-Landroid/net/wifi/ISoftApCallback$Stub;-><init>()V
-Landroid/net/wifi/ISoftApCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/ISoftApCallback;
-Landroid/net/wifi/ISoftApCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/ISoftApCallback$Stub;->TRANSACTION_onNumClientsChanged:I
-Landroid/net/wifi/ISoftApCallback$Stub;->TRANSACTION_onStateChanged:I
-Landroid/net/wifi/ISoftApCallback;->onNumClientsChanged(I)V
-Landroid/net/wifi/ISoftApCallback;->onStateChanged(II)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->acquireMulticastLock(Landroid/os/IBinder;Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->acquireWifiLock(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/WorkSource;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->addOrUpdateNetwork(Landroid/net/wifi/WifiConfiguration;Ljava/lang/String;)I
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->addOrUpdatePasspointConfiguration(Landroid/net/wifi/hotspot2/PasspointConfiguration;Ljava/lang/String;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->deauthenticateNetwork(JZ)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->disableEphemeralNetwork(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->disableNetwork(ILjava/lang/String;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->disconnect(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->enableNetwork(IZLjava/lang/String;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->enableTdls(Ljava/lang/String;Z)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->enableTdlsWithMacAddress(Ljava/lang/String;Z)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->enableVerboseLogging(I)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->enableWifiConnectivityManager(Z)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->factoryReset(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getAllMatchingWifiConfigs(Landroid/net/wifi/ScanResult;)Ljava/util/List;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getConfiguredNetworks()Landroid/content/pm/ParceledListSlice;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getConnectionInfo(Ljava/lang/String;)Landroid/net/wifi/WifiInfo;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getCountryCode()Ljava/lang/String;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getCurrentNetwork()Landroid/net/Network;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getCurrentNetworkWpsNfcConfigurationToken()Ljava/lang/String;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getDhcpInfo()Landroid/net/DhcpInfo;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getMatchingOsuProviders(Landroid/net/wifi/ScanResult;)Ljava/util/List;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getMatchingWifiConfig(Landroid/net/wifi/ScanResult;)Landroid/net/wifi/WifiConfiguration;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getPasspointConfigurations()Ljava/util/List;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getPrivilegedConfiguredNetworks()Landroid/content/pm/ParceledListSlice;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getScanResults(Ljava/lang/String;)Ljava/util/List;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getSupportedFeatures()I
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getVerboseLoggingLevel()I
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getWifiApConfiguration()Landroid/net/wifi/WifiConfiguration;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getWifiApEnabledState()I
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getWifiEnabledState()I
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->getWifiServiceMessenger(Ljava/lang/String;)Landroid/os/Messenger;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->initializeMulticastFiltering()V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->isDualBandSupported()Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->isMulticastEnabled()Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->isScanAlwaysAvailable()Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->matchProviderWithCurrentNetwork(Ljava/lang/String;)I
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->needs5GHzToAnyApBandConversion()Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->queryPasspointIcon(JLjava/lang/String;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->reassociate(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->reconnect(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->registerSoftApCallback(Landroid/os/IBinder;Landroid/net/wifi/ISoftApCallback;I)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->releaseMulticastLock()V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->releaseWifiLock(Landroid/os/IBinder;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->removeNetwork(ILjava/lang/String;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->removePasspointConfiguration(Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->reportActivityInfo()Landroid/net/wifi/WifiActivityEnergyInfo;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->requestActivityInfo(Landroid/os/ResultReceiver;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->restoreBackupData([B)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->restoreSupplicantBackupData([B[B)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->retrieveBackupData()[B
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->setCountryCode(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->setWifiApConfiguration(Landroid/net/wifi/WifiConfiguration;Ljava/lang/String;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->setWifiEnabled(Ljava/lang/String;Z)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->startLocalOnlyHotspot(Landroid/os/Messenger;Landroid/os/IBinder;Ljava/lang/String;)I
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->startScan(Ljava/lang/String;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->startSoftAp(Landroid/net/wifi/WifiConfiguration;)Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->startSubscriptionProvisioning(Landroid/net/wifi/hotspot2/OsuProvider;Landroid/net/wifi/hotspot2/IProvisioningCallback;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->startWatchLocalOnlyHotspot(Landroid/os/Messenger;Landroid/os/IBinder;)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->stopLocalOnlyHotspot()V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->stopSoftAp()Z
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->stopWatchLocalOnlyHotspot()V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->unregisterSoftApCallback(I)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->updateInterfaceIpState(Ljava/lang/String;I)V
-Landroid/net/wifi/IWifiManager$Stub$Proxy;->updateWifiLockWorkSource(Landroid/os/IBinder;Landroid/os/WorkSource;)V
-Landroid/net/wifi/IWifiManager$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_acquireMulticastLock:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_acquireWifiLock:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_addOrUpdateNetwork:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_addOrUpdatePasspointConfiguration:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_deauthenticateNetwork:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_disableEphemeralNetwork:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_disableNetwork:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_disconnect:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_enableNetwork:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_enableTdls:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_enableTdlsWithMacAddress:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_enableVerboseLogging:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_enableWifiConnectivityManager:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_factoryReset:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getAllMatchingWifiConfigs:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getConfiguredNetworks:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getConnectionInfo:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getCountryCode:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getCurrentNetwork:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getCurrentNetworkWpsNfcConfigurationToken:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getDhcpInfo:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getMatchingOsuProviders:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getMatchingWifiConfig:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getPasspointConfigurations:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getPrivilegedConfiguredNetworks:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getSupportedFeatures:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getVerboseLoggingLevel:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getWifiApConfiguration:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getWifiApEnabledState:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getWifiEnabledState:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getWifiServiceMessenger:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_initializeMulticastFiltering:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_isDualBandSupported:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_isMulticastEnabled:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_isScanAlwaysAvailable:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_matchProviderWithCurrentNetwork:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_needs5GHzToAnyApBandConversion:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_queryPasspointIcon:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_reassociate:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_reconnect:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_registerSoftApCallback:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_releaseMulticastLock:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_releaseWifiLock:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_removeNetwork:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_removePasspointConfiguration:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_reportActivityInfo:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_requestActivityInfo:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_restoreBackupData:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_restoreSupplicantBackupData:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_retrieveBackupData:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_setCountryCode:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_setWifiApConfiguration:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_setWifiEnabled:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_startLocalOnlyHotspot:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_startScan:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_startSoftAp:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_startSubscriptionProvisioning:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_startWatchLocalOnlyHotspot:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_stopLocalOnlyHotspot:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_stopSoftAp:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_stopWatchLocalOnlyHotspot:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_unregisterSoftApCallback:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_updateInterfaceIpState:I
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_updateWifiLockWorkSource:I
-Landroid/net/wifi/IWifiManager;->acquireMulticastLock(Landroid/os/IBinder;Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager;->acquireWifiLock(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/WorkSource;)Z
-Landroid/net/wifi/IWifiManager;->addOrUpdateNetwork(Landroid/net/wifi/WifiConfiguration;Ljava/lang/String;)I
-Landroid/net/wifi/IWifiManager;->addOrUpdatePasspointConfiguration(Landroid/net/wifi/hotspot2/PasspointConfiguration;Ljava/lang/String;)Z
-Landroid/net/wifi/IWifiManager;->deauthenticateNetwork(JZ)V
-Landroid/net/wifi/IWifiManager;->disableEphemeralNetwork(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager;->disableNetwork(ILjava/lang/String;)Z
-Landroid/net/wifi/IWifiManager;->disconnect(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager;->enableNetwork(IZLjava/lang/String;)Z
-Landroid/net/wifi/IWifiManager;->enableTdls(Ljava/lang/String;Z)V
-Landroid/net/wifi/IWifiManager;->enableTdlsWithMacAddress(Ljava/lang/String;Z)V
-Landroid/net/wifi/IWifiManager;->enableVerboseLogging(I)V
-Landroid/net/wifi/IWifiManager;->enableWifiConnectivityManager(Z)V
-Landroid/net/wifi/IWifiManager;->factoryReset(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager;->getAllMatchingWifiConfigs(Landroid/net/wifi/ScanResult;)Ljava/util/List;
-Landroid/net/wifi/IWifiManager;->getConfiguredNetworks()Landroid/content/pm/ParceledListSlice;
-Landroid/net/wifi/IWifiManager;->getConnectionInfo(Ljava/lang/String;)Landroid/net/wifi/WifiInfo;
-Landroid/net/wifi/IWifiManager;->getCountryCode()Ljava/lang/String;
-Landroid/net/wifi/IWifiManager;->getCurrentNetworkWpsNfcConfigurationToken()Ljava/lang/String;
-Landroid/net/wifi/IWifiManager;->getDhcpInfo()Landroid/net/DhcpInfo;
-Landroid/net/wifi/IWifiManager;->getMatchingOsuProviders(Landroid/net/wifi/ScanResult;)Ljava/util/List;
-Landroid/net/wifi/IWifiManager;->getMatchingWifiConfig(Landroid/net/wifi/ScanResult;)Landroid/net/wifi/WifiConfiguration;
-Landroid/net/wifi/IWifiManager;->getPasspointConfigurations()Ljava/util/List;
-Landroid/net/wifi/IWifiManager;->getPrivilegedConfiguredNetworks()Landroid/content/pm/ParceledListSlice;
-Landroid/net/wifi/IWifiManager;->getScanResults(Ljava/lang/String;)Ljava/util/List;
-Landroid/net/wifi/IWifiManager;->getSupportedFeatures()I
-Landroid/net/wifi/IWifiManager;->getVerboseLoggingLevel()I
-Landroid/net/wifi/IWifiManager;->getWifiEnabledState()I
-Landroid/net/wifi/IWifiManager;->getWifiServiceMessenger(Ljava/lang/String;)Landroid/os/Messenger;
-Landroid/net/wifi/IWifiManager;->initializeMulticastFiltering()V
-Landroid/net/wifi/IWifiManager;->isDualBandSupported()Z
-Landroid/net/wifi/IWifiManager;->isMulticastEnabled()Z
-Landroid/net/wifi/IWifiManager;->isScanAlwaysAvailable()Z
-Landroid/net/wifi/IWifiManager;->matchProviderWithCurrentNetwork(Ljava/lang/String;)I
-Landroid/net/wifi/IWifiManager;->needs5GHzToAnyApBandConversion()Z
-Landroid/net/wifi/IWifiManager;->queryPasspointIcon(JLjava/lang/String;)V
-Landroid/net/wifi/IWifiManager;->reassociate(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager;->reconnect(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager;->registerSoftApCallback(Landroid/os/IBinder;Landroid/net/wifi/ISoftApCallback;I)V
-Landroid/net/wifi/IWifiManager;->releaseMulticastLock()V
-Landroid/net/wifi/IWifiManager;->releaseWifiLock(Landroid/os/IBinder;)Z
-Landroid/net/wifi/IWifiManager;->removeNetwork(ILjava/lang/String;)Z
-Landroid/net/wifi/IWifiManager;->removePasspointConfiguration(Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/net/wifi/IWifiManager;->reportActivityInfo()Landroid/net/wifi/WifiActivityEnergyInfo;
-Landroid/net/wifi/IWifiManager;->requestActivityInfo(Landroid/os/ResultReceiver;)V
-Landroid/net/wifi/IWifiManager;->restoreBackupData([B)V
-Landroid/net/wifi/IWifiManager;->restoreSupplicantBackupData([B[B)V
-Landroid/net/wifi/IWifiManager;->retrieveBackupData()[B
-Landroid/net/wifi/IWifiManager;->setCountryCode(Ljava/lang/String;)V
-Landroid/net/wifi/IWifiManager;->setWifiApConfiguration(Landroid/net/wifi/WifiConfiguration;Ljava/lang/String;)Z
-Landroid/net/wifi/IWifiManager;->setWifiEnabled(Ljava/lang/String;Z)Z
-Landroid/net/wifi/IWifiManager;->startLocalOnlyHotspot(Landroid/os/Messenger;Landroid/os/IBinder;Ljava/lang/String;)I
-Landroid/net/wifi/IWifiManager;->startScan(Ljava/lang/String;)Z
-Landroid/net/wifi/IWifiManager;->startSoftAp(Landroid/net/wifi/WifiConfiguration;)Z
-Landroid/net/wifi/IWifiManager;->startSubscriptionProvisioning(Landroid/net/wifi/hotspot2/OsuProvider;Landroid/net/wifi/hotspot2/IProvisioningCallback;)V
-Landroid/net/wifi/IWifiManager;->startWatchLocalOnlyHotspot(Landroid/os/Messenger;Landroid/os/IBinder;)V
-Landroid/net/wifi/IWifiManager;->stopLocalOnlyHotspot()V
-Landroid/net/wifi/IWifiManager;->stopSoftAp()Z
-Landroid/net/wifi/IWifiManager;->stopWatchLocalOnlyHotspot()V
-Landroid/net/wifi/IWifiManager;->unregisterSoftApCallback(I)V
-Landroid/net/wifi/IWifiManager;->updateInterfaceIpState(Ljava/lang/String;I)V
-Landroid/net/wifi/IWifiManager;->updateWifiLockWorkSource(Landroid/os/IBinder;Landroid/os/WorkSource;)V
-Landroid/net/wifi/IWifiScanner$Stub$Proxy;->getAvailableChannels(I)Landroid/os/Bundle;
-Landroid/net/wifi/IWifiScanner$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/IWifiScanner$Stub$Proxy;->getMessenger()Landroid/os/Messenger;
-Landroid/net/wifi/IWifiScanner$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/IWifiScanner$Stub;->TRANSACTION_getAvailableChannels:I
-Landroid/net/wifi/IWifiScanner$Stub;->TRANSACTION_getMessenger:I
-Landroid/net/wifi/IWifiScanner;->getAvailableChannels(I)Landroid/os/Bundle;
-Landroid/net/wifi/IWifiScanner;->getMessenger()Landroid/os/Messenger;
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;->checkConfigureWifiDisplayPermission()V
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;->close(Landroid/os/IBinder;)V
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;->getMessenger(Landroid/os/IBinder;)Landroid/os/Messenger;
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;->getP2pStateMachineMessenger()Landroid/os/Messenger;
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;->setMiracastMode(I)V
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;-><init>()V
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;->TRANSACTION_checkConfigureWifiDisplayPermission:I
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;->TRANSACTION_close:I
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;->TRANSACTION_getMessenger:I
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;->TRANSACTION_getP2pStateMachineMessenger:I
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;->TRANSACTION_setMiracastMode:I
-Landroid/net/wifi/p2p/IWifiP2pManager;->checkConfigureWifiDisplayPermission()V
-Landroid/net/wifi/p2p/IWifiP2pManager;->close(Landroid/os/IBinder;)V
-Landroid/net/wifi/p2p/IWifiP2pManager;->getMessenger(Landroid/os/IBinder;)Landroid/os/Messenger;
-Landroid/net/wifi/p2p/IWifiP2pManager;->getP2pStateMachineMessenger()Landroid/os/Messenger;
-Landroid/net/wifi/p2p/IWifiP2pManager;->setMiracastMode(I)V
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;-><init>(Ljava/util/List;)V
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;->compressDnsName(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;->createPtrServiceQuery(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;->createTxtServiceQuery(Ljava/lang/String;Ljava/lang/String;Landroid/net/nsd/DnsSdTxtRecord;)Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;->DNS_TYPE_PTR:I
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;->DNS_TYPE_TXT:I
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;->sVmPacket:Ljava/util/Map;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;->VERSION_1:I
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest;-><init>()V
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest;-><init>(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest;-><init>(Ljava/lang/String;II)V
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;-><init>(IILandroid/net/wifi/p2p/WifiP2pDevice;[B)V
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->getDnsQueryName()Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->getDnsType()I
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->getInstanceName()Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->getTxtRecord()Ljava/util/Map;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->getVersion()I
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->mDnsQueryName:Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->mDnsType:I
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->mInstanceName:Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->mTxtRecord:Ljava/util/HashMap;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->mVersion:I
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->newInstance(IILandroid/net/wifi/p2p/WifiP2pDevice;[B)Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->parse()Z
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->readDnsName(Ljava/io/DataInputStream;)Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->readTxtData(Ljava/io/DataInputStream;)Z
-Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;->sVmpack:Ljava/util/Map;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceInfo;->bin2HexStr([B)Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceInfo;->getSupplicantQueryList()Ljava/util/List;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceInfo;->SERVICE_TYPE_WS_DISCOVERY:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;-><init>(IIILjava/lang/String;)V
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;->getSupplicantQuery()Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;->getTransactionId()I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;->mLength:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;->mProtocolType:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;->mQuery:Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;->mTransId:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;->setTransactionId(I)V
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;->validateQuery(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse$Status;-><init>()V
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse$Status;->BAD_REQUEST:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse$Status;->REQUESTED_INFORMATION_NOT_AVAILABLE:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse$Status;->SERVICE_PROTOCOL_NOT_AVAILABLE:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse$Status;->SUCCESS:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse$Status;->toString(I)Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;-><init>(IIILandroid/net/wifi/p2p/WifiP2pDevice;[B)V
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->getRawData()[B
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->getServiceType()I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->getSrcDevice()Landroid/net/wifi/p2p/WifiP2pDevice;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->getStatus()I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->getTransactionId()I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->hexStr2Bin(Ljava/lang/String;)[B
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->MAX_BUF_SIZE:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->mData:[B
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->mDevice:Landroid/net/wifi/p2p/WifiP2pDevice;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->mServiceType:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->mStatus:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->mTransId:I
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->newInstance(Ljava/lang/String;[B)Ljava/util/List;
-Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;->setSrcDevice(Landroid/net/wifi/p2p/WifiP2pDevice;)V
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfo;-><init>(Ljava/util/List;)V
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfo;->createSupplicantQuery(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfo;->VERSION_1_0:I
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest;-><init>()V
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest;-><init>(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;-><init>(IILandroid/net/wifi/p2p/WifiP2pDevice;[B)V
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;->getUniqueServiceNames()Ljava/util/List;
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;->getVersion()I
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;->mUniqueServiceNames:Ljava/util/List;
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;->mVersion:I
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;->newInstance(IILandroid/net/wifi/p2p/WifiP2pDevice;[B)Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;
-Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;->parse()Z
-Landroid/net/wifi/p2p/WifiP2pConfig;->invalidate()V
-Landroid/net/wifi/p2p/WifiP2pConfig;->MAX_GROUP_OWNER_INTENT:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->detailedDevicePattern:Ljava/util/regex/Pattern;
-Landroid/net/wifi/p2p/WifiP2pDevice;->DEVICE_CAPAB_CLIENT_DISCOVERABILITY:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->DEVICE_CAPAB_CONCURRENT_OPER:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->DEVICE_CAPAB_DEVICE_LIMIT:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->DEVICE_CAPAB_INFRA_MANAGED:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->DEVICE_CAPAB_INVITATION_PROCEDURE:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->DEVICE_CAPAB_SERVICE_DISCOVERY:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->GROUP_CAPAB_CROSS_CONN:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->GROUP_CAPAB_GROUP_FORMATION:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->GROUP_CAPAB_GROUP_LIMIT:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->GROUP_CAPAB_GROUP_OWNER:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->GROUP_CAPAB_INTRA_BSS_DIST:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->GROUP_CAPAB_PERSISTENT_GROUP:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->GROUP_CAPAB_PERSISTENT_RECONN:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->isDeviceLimit()Z
-Landroid/net/wifi/p2p/WifiP2pDevice;->isGroupLimit()Z
-Landroid/net/wifi/p2p/WifiP2pDevice;->isInvitationCapable()Z
-Landroid/net/wifi/p2p/WifiP2pDevice;->parseHex(Ljava/lang/String;)I
-Landroid/net/wifi/p2p/WifiP2pDevice;->TAG:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pDevice;->threeTokenPattern:Ljava/util/regex/Pattern;
-Landroid/net/wifi/p2p/WifiP2pDevice;->twoTokenPattern:Ljava/util/regex/Pattern;
-Landroid/net/wifi/p2p/WifiP2pDevice;->updateSupplicantDetails(Landroid/net/wifi/p2p/WifiP2pDevice;)V
-Landroid/net/wifi/p2p/WifiP2pDevice;->WPS_CONFIG_DISPLAY:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->WPS_CONFIG_KEYPAD:I
-Landroid/net/wifi/p2p/WifiP2pDevice;->WPS_CONFIG_PUSHBUTTON:I
-Landroid/net/wifi/p2p/WifiP2pDeviceList;-><init>(Ljava/util/ArrayList;)V
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->clear()Z
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->isGroupOwner(Ljava/lang/String;)Z
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->mDevices:Ljava/util/HashMap;
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->remove(Landroid/net/wifi/p2p/WifiP2pDevice;)Z
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->remove(Landroid/net/wifi/p2p/WifiP2pDeviceList;)Z
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->updateGroupCapability(Ljava/lang/String;I)V
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->updateStatus(Ljava/lang/String;I)V
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->updateSupplicantDetails(Landroid/net/wifi/p2p/WifiP2pDevice;)V
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->validateDevice(Landroid/net/wifi/p2p/WifiP2pDevice;)V
-Landroid/net/wifi/p2p/WifiP2pDeviceList;->validateDeviceAddress(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/WifiP2pGroup;->addClient(Landroid/net/wifi/p2p/WifiP2pDevice;)V
-Landroid/net/wifi/p2p/WifiP2pGroup;->addClient(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/WifiP2pGroup;->contains(Landroid/net/wifi/p2p/WifiP2pDevice;)Z
-Landroid/net/wifi/p2p/WifiP2pGroup;->groupStartedPattern:Ljava/util/regex/Pattern;
-Landroid/net/wifi/p2p/WifiP2pGroup;->mClients:Ljava/util/List;
-Landroid/net/wifi/p2p/WifiP2pGroup;->mInterface:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pGroup;->mIsGroupOwner:Z
-Landroid/net/wifi/p2p/WifiP2pGroup;->mNetId:I
-Landroid/net/wifi/p2p/WifiP2pGroup;->mNetworkName:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pGroup;->mOwner:Landroid/net/wifi/p2p/WifiP2pDevice;
-Landroid/net/wifi/p2p/WifiP2pGroup;->mPassphrase:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pGroup;->PERSISTENT_NET_ID:I
-Landroid/net/wifi/p2p/WifiP2pGroup;->removeClient(Landroid/net/wifi/p2p/WifiP2pDevice;)Z
-Landroid/net/wifi/p2p/WifiP2pGroup;->removeClient(Ljava/lang/String;)Z
-Landroid/net/wifi/p2p/WifiP2pGroup;->setNetworkName(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/WifiP2pGroup;->setOwner(Landroid/net/wifi/p2p/WifiP2pDevice;)V
-Landroid/net/wifi/p2p/WifiP2pGroup;->setPassphrase(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/WifiP2pGroupList$GroupDeleteListener;->onDeleteGroup(I)V
-Landroid/net/wifi/p2p/WifiP2pGroupList;-><init>()V
-Landroid/net/wifi/p2p/WifiP2pGroupList;->add(Landroid/net/wifi/p2p/WifiP2pGroup;)V
-Landroid/net/wifi/p2p/WifiP2pGroupList;->clear()Z
-Landroid/net/wifi/p2p/WifiP2pGroupList;->contains(I)Z
-Landroid/net/wifi/p2p/WifiP2pGroupList;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/p2p/WifiP2pGroupList;->CREDENTIAL_MAX_NUM:I
-Landroid/net/wifi/p2p/WifiP2pGroupList;->getNetworkId(Ljava/lang/String;)I
-Landroid/net/wifi/p2p/WifiP2pGroupList;->getNetworkId(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/net/wifi/p2p/WifiP2pGroupList;->getOwnerAddr(I)Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pGroupList;->isClearCalled:Z
-Landroid/net/wifi/p2p/WifiP2pGroupList;->mListener:Landroid/net/wifi/p2p/WifiP2pGroupList$GroupDeleteListener;
-Landroid/net/wifi/p2p/WifiP2pGroupList;->remove(I)V
-Landroid/net/wifi/p2p/WifiP2pGroupList;->remove(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;-><init>(Landroid/content/Context;Landroid/os/Looper;Landroid/net/wifi/p2p/WifiP2pManager$ChannelListener;Landroid/os/Binder;Landroid/net/wifi/p2p/WifiP2pManager;)V
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->getListener(I)Ljava/lang/Object;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->handleDnsSdServiceResponse(Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse;)V
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->handleServiceResponse(Landroid/net/wifi/p2p/nsd/WifiP2pServiceResponse;)V
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->handleUpnpServiceResponse(Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse;)V
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->INVALID_LISTENER_KEY:I
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mBinder:Landroid/os/Binder;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mChannelListener:Landroid/net/wifi/p2p/WifiP2pManager$ChannelListener;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mCloseGuard:Ldalvik/system/CloseGuard;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mContext:Landroid/content/Context;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mDnsSdServRspListener:Landroid/net/wifi/p2p/WifiP2pManager$DnsSdServiceResponseListener;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mDnsSdTxtListener:Landroid/net/wifi/p2p/WifiP2pManager$DnsSdTxtRecordListener;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mHandler:Landroid/net/wifi/p2p/WifiP2pManager$Channel$P2pHandler;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mListenerKey:I
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mListenerMap:Ljava/util/HashMap;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mListenerMapLock:Ljava/lang/Object;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mP2pManager:Landroid/net/wifi/p2p/WifiP2pManager;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mServRspListener:Landroid/net/wifi/p2p/WifiP2pManager$ServiceResponseListener;
-Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mUpnpServRspListener:Landroid/net/wifi/p2p/WifiP2pManager$UpnpServiceResponseListener;
-Landroid/net/wifi/p2p/WifiP2pManager$HandoverMessageListener;->onHandoverMessageAvailable(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/WifiP2pManager$PersistentGroupInfoListener;->onPersistentGroupInfoAvailable(Landroid/net/wifi/p2p/WifiP2pGroupList;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->ADD_LOCAL_SERVICE:I
-Landroid/net/wifi/p2p/WifiP2pManager;->ADD_LOCAL_SERVICE_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->ADD_LOCAL_SERVICE_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->ADD_SERVICE_REQUEST:I
-Landroid/net/wifi/p2p/WifiP2pManager;->ADD_SERVICE_REQUEST_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->ADD_SERVICE_REQUEST_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->BASE:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CALLING_PACKAGE:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pManager;->CANCEL_CONNECT:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CANCEL_CONNECT_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CANCEL_CONNECT_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->checkChannel(Landroid/net/wifi/p2p/WifiP2pManager$Channel;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->checkP2pConfig(Landroid/net/wifi/p2p/WifiP2pConfig;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->checkServiceInfo(Landroid/net/wifi/p2p/nsd/WifiP2pServiceInfo;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->checkServiceRequest(Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->CLEAR_LOCAL_SERVICES:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CLEAR_LOCAL_SERVICES_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CLEAR_LOCAL_SERVICES_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CLEAR_SERVICE_REQUESTS:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CLEAR_SERVICE_REQUESTS_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CLEAR_SERVICE_REQUESTS_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CONNECT:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CONNECT_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CONNECT_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CREATE_GROUP_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->CREATE_GROUP_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DELETE_PERSISTENT_GROUP:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DELETE_PERSISTENT_GROUP_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DELETE_PERSISTENT_GROUP_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DISCOVER_PEERS:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DISCOVER_PEERS_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DISCOVER_PEERS_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DISCOVER_SERVICES:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DISCOVER_SERVICES_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->DISCOVER_SERVICES_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->EXTRA_HANDOVER_MESSAGE:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pManager;->getMessenger(Landroid/os/Binder;)Landroid/os/Messenger;
-Landroid/net/wifi/p2p/WifiP2pManager;->getNfcHandoverRequest(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$HandoverMessageListener;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->getNfcHandoverSelect(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$HandoverMessageListener;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->getP2pStateMachineMessenger()Landroid/os/Messenger;
-Landroid/net/wifi/p2p/WifiP2pManager;->GET_HANDOVER_REQUEST:I
-Landroid/net/wifi/p2p/WifiP2pManager;->GET_HANDOVER_SELECT:I
-Landroid/net/wifi/p2p/WifiP2pManager;->initalizeChannel(Landroid/content/Context;Landroid/os/Looper;Landroid/net/wifi/p2p/WifiP2pManager$ChannelListener;Landroid/os/Messenger;Landroid/os/Binder;)Landroid/net/wifi/p2p/WifiP2pManager$Channel;
-Landroid/net/wifi/p2p/WifiP2pManager;->initializeInternal(Landroid/content/Context;Landroid/os/Looper;Landroid/net/wifi/p2p/WifiP2pManager$ChannelListener;)Landroid/net/wifi/p2p/WifiP2pManager$Channel;
-Landroid/net/wifi/p2p/WifiP2pManager;->initiatorReportNfcHandover(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Ljava/lang/String;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->INITIATOR_REPORT_NFC_HANDOVER:I
-Landroid/net/wifi/p2p/WifiP2pManager;->listen(Landroid/net/wifi/p2p/WifiP2pManager$Channel;ZLandroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->MIRACAST_DISABLED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->MIRACAST_SINK:I
-Landroid/net/wifi/p2p/WifiP2pManager;->MIRACAST_SOURCE:I
-Landroid/net/wifi/p2p/WifiP2pManager;->mService:Landroid/net/wifi/p2p/IWifiP2pManager;
-Landroid/net/wifi/p2p/WifiP2pManager;->PING:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_GROUP:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_GROUP_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_GROUP_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_LOCAL_SERVICE:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_LOCAL_SERVICE_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_LOCAL_SERVICE_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_SERVICE_REQUEST:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_SERVICE_REQUEST_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REMOVE_SERVICE_REQUEST_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REPORT_NFC_HANDOVER_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REPORT_NFC_HANDOVER_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REQUEST_CONNECTION_INFO:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REQUEST_GROUP_INFO:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REQUEST_PEERS:I
-Landroid/net/wifi/p2p/WifiP2pManager;->REQUEST_PERSISTENT_GROUP_INFO:I
-Landroid/net/wifi/p2p/WifiP2pManager;->responderReportNfcHandover(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Ljava/lang/String;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V
-Landroid/net/wifi/p2p/WifiP2pManager;->RESPONDER_REPORT_NFC_HANDOVER:I
-Landroid/net/wifi/p2p/WifiP2pManager;->RESPONSE_CONNECTION_INFO:I
-Landroid/net/wifi/p2p/WifiP2pManager;->RESPONSE_GET_HANDOVER_MESSAGE:I
-Landroid/net/wifi/p2p/WifiP2pManager;->RESPONSE_GROUP_INFO:I
-Landroid/net/wifi/p2p/WifiP2pManager;->RESPONSE_PEERS:I
-Landroid/net/wifi/p2p/WifiP2pManager;->RESPONSE_PERSISTENT_GROUP_INFO:I
-Landroid/net/wifi/p2p/WifiP2pManager;->RESPONSE_SERVICE:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_CHANNEL:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_CHANNEL_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_CHANNEL_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_DEVICE_NAME:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_DEVICE_NAME_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_DEVICE_NAME_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_WFD_INFO:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_WFD_INFO_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->SET_WFD_INFO_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->START_LISTEN:I
-Landroid/net/wifi/p2p/WifiP2pManager;->START_LISTEN_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->START_LISTEN_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->START_WPS:I
-Landroid/net/wifi/p2p/WifiP2pManager;->START_WPS_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->START_WPS_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->STOP_DISCOVERY:I
-Landroid/net/wifi/p2p/WifiP2pManager;->STOP_DISCOVERY_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->STOP_DISCOVERY_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->STOP_LISTEN:I
-Landroid/net/wifi/p2p/WifiP2pManager;->STOP_LISTEN_FAILED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->STOP_LISTEN_SUCCEEDED:I
-Landroid/net/wifi/p2p/WifiP2pManager;->TAG:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pManager;->WIFI_P2P_PERSISTENT_GROUPS_CHANGED_ACTION:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pProvDiscEvent;-><init>(Ljava/lang/String;)V
-Landroid/net/wifi/p2p/WifiP2pProvDiscEvent;->ENTER_PIN:I
-Landroid/net/wifi/p2p/WifiP2pProvDiscEvent;->PBC_REQ:I
-Landroid/net/wifi/p2p/WifiP2pProvDiscEvent;->PBC_RSP:I
-Landroid/net/wifi/p2p/WifiP2pProvDiscEvent;->SHOW_PIN:I
-Landroid/net/wifi/p2p/WifiP2pProvDiscEvent;->TAG:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->COUPLED_SINK_SUPPORT_AT_SINK:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->COUPLED_SINK_SUPPORT_AT_SOURCE:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->DEVICE_TYPE:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->getControlPort()I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->getDeviceInfoHex()Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->getMaxThroughput()I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->isCoupledSinkSupportedAtSink()Z
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->isCoupledSinkSupportedAtSource()Z
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->isSessionAvailable()Z
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->mCtrlPort:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->mDeviceInfo:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->mMaxThroughput:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->mWfdEnabled:Z
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->PRIMARY_SINK:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->readFromParcel(Landroid/os/Parcel;)V
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->SECONDARY_SINK:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->SESSION_AVAILABLE:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->SESSION_AVAILABLE_BIT1:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->SESSION_AVAILABLE_BIT2:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->setCoupledSinkSupportAtSink(Z)V
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->setCoupledSinkSupportAtSource(Z)V
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->SOURCE_OR_PRIMARY_SINK:I
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->TAG:Ljava/lang/String;
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;->WFD_SOURCE:I
-Landroid/net/wifi/ParcelUtil;-><init>()V
-Landroid/net/wifi/ParcelUtil;->readCertificate(Landroid/os/Parcel;)Ljava/security/cert/X509Certificate;
-Landroid/net/wifi/ParcelUtil;->readCertificates(Landroid/os/Parcel;)[Ljava/security/cert/X509Certificate;
-Landroid/net/wifi/ParcelUtil;->readPrivateKey(Landroid/os/Parcel;)Ljava/security/PrivateKey;
-Landroid/net/wifi/ParcelUtil;->writeCertificate(Landroid/os/Parcel;Ljava/security/cert/X509Certificate;)V
-Landroid/net/wifi/ParcelUtil;->writeCertificates(Landroid/os/Parcel;[Ljava/security/cert/X509Certificate;)V
-Landroid/net/wifi/ParcelUtil;->writePrivateKey(Landroid/os/Parcel;Ljava/security/PrivateKey;)V
 Landroid/net/wifi/PasspointManagementObjectDefinition;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 Landroid/net/wifi/PasspointManagementObjectDefinition;->CREATOR:Landroid/os/Parcelable$Creator;
 Landroid/net/wifi/PasspointManagementObjectDefinition;->getBaseUri()Ljava/lang/String;
@@ -39647,121 +37055,6 @@
 Landroid/net/wifi/RssiPacketCountInfo;->rxgood:I
 Landroid/net/wifi/RssiPacketCountInfo;->txbad:I
 Landroid/net/wifi/RssiPacketCountInfo;->txgood:I
-Landroid/net/wifi/rtt/IRttCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/rtt/IRttCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/rtt/IRttCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/rtt/IRttCallback$Stub$Proxy;->onRangingFailure(I)V
-Landroid/net/wifi/rtt/IRttCallback$Stub$Proxy;->onRangingResults(Ljava/util/List;)V
-Landroid/net/wifi/rtt/IRttCallback$Stub;-><init>()V
-Landroid/net/wifi/rtt/IRttCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/rtt/IRttCallback;
-Landroid/net/wifi/rtt/IRttCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/rtt/IRttCallback$Stub;->TRANSACTION_onRangingFailure:I
-Landroid/net/wifi/rtt/IRttCallback$Stub;->TRANSACTION_onRangingResults:I
-Landroid/net/wifi/rtt/IRttCallback;->onRangingFailure(I)V
-Landroid/net/wifi/rtt/IRttCallback;->onRangingResults(Ljava/util/List;)V
-Landroid/net/wifi/rtt/IWifiRttManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/rtt/IWifiRttManager$Stub$Proxy;->cancelRanging(Landroid/os/WorkSource;)V
-Landroid/net/wifi/rtt/IWifiRttManager$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/net/wifi/rtt/IWifiRttManager$Stub$Proxy;->isAvailable()Z
-Landroid/net/wifi/rtt/IWifiRttManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/rtt/IWifiRttManager$Stub$Proxy;->startRanging(Landroid/os/IBinder;Ljava/lang/String;Landroid/os/WorkSource;Landroid/net/wifi/rtt/RangingRequest;Landroid/net/wifi/rtt/IRttCallback;)V
-Landroid/net/wifi/rtt/IWifiRttManager$Stub;-><init>()V
-Landroid/net/wifi/rtt/IWifiRttManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/rtt/IWifiRttManager;
-Landroid/net/wifi/rtt/IWifiRttManager$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/net/wifi/rtt/IWifiRttManager$Stub;->TRANSACTION_cancelRanging:I
-Landroid/net/wifi/rtt/IWifiRttManager$Stub;->TRANSACTION_isAvailable:I
-Landroid/net/wifi/rtt/IWifiRttManager$Stub;->TRANSACTION_startRanging:I
-Landroid/net/wifi/rtt/IWifiRttManager;->cancelRanging(Landroid/os/WorkSource;)V
-Landroid/net/wifi/rtt/IWifiRttManager;->isAvailable()Z
-Landroid/net/wifi/rtt/IWifiRttManager;->startRanging(Landroid/os/IBinder;Ljava/lang/String;Landroid/os/WorkSource;Landroid/net/wifi/rtt/RangingRequest;Landroid/net/wifi/rtt/IRttCallback;)V
-Landroid/net/wifi/rtt/RangingRequest$Builder;->mRttPeers:Ljava/util/List;
-Landroid/net/wifi/rtt/RangingRequest;-><init>(Ljava/util/List;)V
-Landroid/net/wifi/rtt/RangingRequest;->enforceValidity(Z)V
-Landroid/net/wifi/rtt/RangingRequest;->MAX_PEERS:I
-Landroid/net/wifi/rtt/RangingRequest;->mRttPeers:Ljava/util/List;
-Landroid/net/wifi/rtt/RangingResult;-><init>(ILandroid/net/MacAddress;IIIII[B[BJ)V
-Landroid/net/wifi/rtt/RangingResult;-><init>(ILandroid/net/wifi/aware/PeerHandle;IIIII[B[BJ)V
-Landroid/net/wifi/rtt/RangingResult;->EMPTY_BYTE_ARRAY:[B
-Landroid/net/wifi/rtt/RangingResult;->mDistanceMm:I
-Landroid/net/wifi/rtt/RangingResult;->mDistanceStdDevMm:I
-Landroid/net/wifi/rtt/RangingResult;->mLci:[B
-Landroid/net/wifi/rtt/RangingResult;->mLcr:[B
-Landroid/net/wifi/rtt/RangingResult;->mMac:Landroid/net/MacAddress;
-Landroid/net/wifi/rtt/RangingResult;->mNumAttemptedMeasurements:I
-Landroid/net/wifi/rtt/RangingResult;->mNumSuccessfulMeasurements:I
-Landroid/net/wifi/rtt/RangingResult;->mPeerHandle:Landroid/net/wifi/aware/PeerHandle;
-Landroid/net/wifi/rtt/RangingResult;->mRssi:I
-Landroid/net/wifi/rtt/RangingResult;->mStatus:I
-Landroid/net/wifi/rtt/RangingResult;->mTimestamp:J
-Landroid/net/wifi/rtt/RangingResult;->TAG:Ljava/lang/String;
-Landroid/net/wifi/rtt/ResponderConfig;-><init>(Landroid/net/MacAddress;Landroid/net/wifi/aware/PeerHandle;IZIIIII)V
-Landroid/net/wifi/rtt/ResponderConfig;->AWARE_BAND_2_DISCOVERY_CHANNEL:I
-Landroid/net/wifi/rtt/ResponderConfig;->isValid(Z)Z
-Landroid/net/wifi/rtt/ResponderConfig;->TAG:Ljava/lang/String;
-Landroid/net/wifi/rtt/ResponderConfig;->translateScanResultChannelWidth(I)I
-Landroid/net/wifi/rtt/WifiRttManager;-><init>(Landroid/content/Context;Landroid/net/wifi/rtt/IWifiRttManager;)V
-Landroid/net/wifi/rtt/WifiRttManager;->mContext:Landroid/content/Context;
-Landroid/net/wifi/rtt/WifiRttManager;->mService:Landroid/net/wifi/rtt/IWifiRttManager;
-Landroid/net/wifi/rtt/WifiRttManager;->TAG:Ljava/lang/String;
-Landroid/net/wifi/rtt/WifiRttManager;->VDBG:Z
-Landroid/net/wifi/RttManager$ParcelableRttParams;-><init>([Landroid/net/wifi/RttManager$RttParams;)V
-Landroid/net/wifi/RttManager$ParcelableRttParams;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/RttManager$ParcelableRttResults;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/RttManager$RttCapabilities;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/RttManager;-><init>(Landroid/content/Context;Landroid/net/wifi/rtt/WifiRttManager;)V
-Landroid/net/wifi/RttManager;->CMD_OP_REG_BINDER:I
-Landroid/net/wifi/RttManager;->DBG:Z
-Landroid/net/wifi/RttManager;->mContext:Landroid/content/Context;
-Landroid/net/wifi/RttManager;->mNewService:Landroid/net/wifi/rtt/WifiRttManager;
-Landroid/net/wifi/RttManager;->mRttCapabilities:Landroid/net/wifi/RttManager$RttCapabilities;
-Landroid/net/wifi/RttManager;->TAG:Ljava/lang/String;
-Landroid/net/wifi/ScanResult$InformationElement;-><init>()V
-Landroid/net/wifi/ScanResult$InformationElement;-><init>(Landroid/net/wifi/ScanResult$InformationElement;)V
-Landroid/net/wifi/ScanResult$InformationElement;->EID_HT_CAPABILITIES:I
-Landroid/net/wifi/ScanResult$InformationElement;->EID_VHT_CAPABILITIES:I
-Landroid/net/wifi/ScanResult$RadioChainInfo;-><init>()V
-Landroid/net/wifi/ScanResult$RadioChainInfo;->id:I
-Landroid/net/wifi/ScanResult$RadioChainInfo;->level:I
-Landroid/net/wifi/ScanResult;-><init>()V
-Landroid/net/wifi/ScanResult;-><init>(Landroid/net/wifi/ScanResult;)V
-Landroid/net/wifi/ScanResult;-><init>(Landroid/net/wifi/WifiSsid;Ljava/lang/String;JI[BLjava/lang/String;IIJ)V
-Landroid/net/wifi/ScanResult;-><init>(Landroid/net/wifi/WifiSsid;Ljava/lang/String;Ljava/lang/String;IIJII)V
-Landroid/net/wifi/ScanResult;-><init>(Landroid/net/wifi/WifiSsid;Ljava/lang/String;Ljava/lang/String;JILjava/lang/String;IIJIIIIIZ)V
-Landroid/net/wifi/ScanResult;-><init>(Ljava/lang/String;Ljava/lang/String;JILjava/lang/String;IIJIIIIIZ)V
-Landroid/net/wifi/ScanResult;->anqpElements:[Landroid/net/wifi/AnqpInformationElement;
-Landroid/net/wifi/ScanResult;->carrierApEapType:I
-Landroid/net/wifi/ScanResult;->carrierName:Ljava/lang/String;
-Landroid/net/wifi/ScanResult;->CIPHER_CCMP:I
-Landroid/net/wifi/ScanResult;->CIPHER_NONE:I
-Landroid/net/wifi/ScanResult;->CIPHER_NO_GROUP_ADDRESSED:I
-Landroid/net/wifi/ScanResult;->CIPHER_TKIP:I
-Landroid/net/wifi/ScanResult;->clearFlag(J)V
-Landroid/net/wifi/ScanResult;->FLAG_80211mc_RESPONDER:J
-Landroid/net/wifi/ScanResult;->FLAG_PASSPOINT_NETWORK:J
-Landroid/net/wifi/ScanResult;->is24GHz()Z
-Landroid/net/wifi/ScanResult;->is24GHz(I)Z
-Landroid/net/wifi/ScanResult;->is5GHz()Z
-Landroid/net/wifi/ScanResult;->is5GHz(I)Z
-Landroid/net/wifi/ScanResult;->isCarrierAp:Z
-Landroid/net/wifi/ScanResult;->KEY_MGMT_EAP:I
-Landroid/net/wifi/ScanResult;->KEY_MGMT_EAP_SHA256:I
-Landroid/net/wifi/ScanResult;->KEY_MGMT_FT_EAP:I
-Landroid/net/wifi/ScanResult;->KEY_MGMT_FT_PSK:I
-Landroid/net/wifi/ScanResult;->KEY_MGMT_NONE:I
-Landroid/net/wifi/ScanResult;->KEY_MGMT_OSEN:I
-Landroid/net/wifi/ScanResult;->KEY_MGMT_PSK:I
-Landroid/net/wifi/ScanResult;->KEY_MGMT_PSK_SHA256:I
-Landroid/net/wifi/ScanResult;->PROTOCOL_NONE:I
-Landroid/net/wifi/ScanResult;->PROTOCOL_OSEN:I
-Landroid/net/wifi/ScanResult;->PROTOCOL_WPA2:I
-Landroid/net/wifi/ScanResult;->PROTOCOL_WPA:I
-Landroid/net/wifi/ScanResult;->radioChainInfos:[Landroid/net/wifi/ScanResult$RadioChainInfo;
-Landroid/net/wifi/ScanResult;->setFlag(J)V
-Landroid/net/wifi/ScanResult;->UNSPECIFIED:I
-Landroid/net/wifi/SupplicantState;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/SupplicantState;->isConnecting(Landroid/net/wifi/SupplicantState;)Z
-Landroid/net/wifi/SupplicantState;->isDriverActive(Landroid/net/wifi/SupplicantState;)Z
-Landroid/net/wifi/SupplicantState;->isHandshakeState(Landroid/net/wifi/SupplicantState;)Z
 Landroid/net/wifi/WifiActivityEnergyInfo;-><init>(JIJ[JJJJJ)V
 Landroid/net/wifi/WifiActivityEnergyInfo;->CREATOR:Landroid/os/Parcelable$Creator;
 Landroid/net/wifi/WifiActivityEnergyInfo;->getControllerEnergyUsed()J
@@ -39785,460 +37078,6 @@
 Landroid/net/wifi/WifiActivityEnergyInfo;->STACK_STATE_STATE_ACTIVE:I
 Landroid/net/wifi/WifiActivityEnergyInfo;->STACK_STATE_STATE_IDLE:I
 Landroid/net/wifi/WifiActivityEnergyInfo;->STACK_STATE_STATE_SCANNING:I
-Landroid/net/wifi/WifiConfiguration$AuthAlgorithm;-><init>()V
-Landroid/net/wifi/WifiConfiguration$GroupCipher;-><init>()V
-Landroid/net/wifi/WifiConfiguration$GroupCipher;->GTK_NOT_USED:I
-Landroid/net/wifi/WifiConfiguration$KeyMgmt;-><init>()V
-Landroid/net/wifi/WifiConfiguration$KeyMgmt;->FT_EAP:I
-Landroid/net/wifi/WifiConfiguration$KeyMgmt;->FT_PSK:I
-Landroid/net/wifi/WifiConfiguration$KeyMgmt;->OSEN:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;-><init>()V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->clearDisableReasonCounter()V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->clearDisableReasonCounter(I)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->CONNECT_CHOICE_EXISTS:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->CONNECT_CHOICE_NOT_EXISTS:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->copy(Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_ASSOCIATION_REJECTION:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_AUTHENTICATION_FAILURE:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_AUTHENTICATION_NO_CREDENTIALS:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_BAD_LINK:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_BY_WIFI_MANAGER:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_BY_WRONG_PASSWORD:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_DHCP_FAILURE:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_DNS_FAILURE:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_DUE_TO_USER_SWITCH:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_NO_INTERNET_PERMANENT:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_NO_INTERNET_TEMPORARY:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_TLS_VERSION_MISMATCH:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->DISABLED_WPS_START:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getCandidate()Landroid/net/wifi/ScanResult;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getCandidateScore()I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getConnectChoice()Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getConnectChoiceTimestamp()J
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getDisableReasonCounter(I)I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getDisableTime()J
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getHasEverConnected()Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getNetworkDisableReasonString()Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getNetworkDisableReasonString(I)Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getNetworkSelectionBSSID()Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getNetworkSelectionDisableReason()I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getNetworkSelectionStatus()I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getNetworkStatusString()Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->getSeenInLastQualifiedNetworkSelection()Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->incrementDisableReasonCounter(I)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP:J
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->isDisabledByReason(I)Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->isNetworkEnabled()Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->isNetworkPermanentlyDisabled()Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->isNetworkTemporaryDisabled()Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->isNotRecommended()Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mCandidate:Landroid/net/wifi/ScanResult;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mCandidateScore:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mConnectChoice:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mConnectChoiceTimestamp:J
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mHasEverConnected:Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mNetworkSeclectionDisableCounter:[I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mNetworkSelectionBSSID:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mNetworkSelectionDisableReason:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mNotRecommended:Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mSeenInLastQualifiedNetworkSelection:Z
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mStatus:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->mTemporarilyDisabledTimestamp:J
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->NETWORK_SELECTION_DISABLED_MAX:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->NETWORK_SELECTION_DISABLED_STARTING_INDEX:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->NETWORK_SELECTION_ENABLE:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->NETWORK_SELECTION_ENABLED:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->NETWORK_SELECTION_PERMANENTLY_DISABLED:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->NETWORK_SELECTION_STATUS_MAX:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->NETWORK_SELECTION_TEMPORARY_DISABLED:I
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->QUALITY_NETWORK_SELECTION_DISABLE_REASON:[Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->QUALITY_NETWORK_SELECTION_STATUS:[Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->readFromParcel(Landroid/os/Parcel;)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setCandidate(Landroid/net/wifi/ScanResult;)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setCandidateScore(I)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setConnectChoice(Ljava/lang/String;)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setConnectChoiceTimestamp(J)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setDisableReasonCounter(II)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setDisableTime(J)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setHasEverConnected(Z)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setNetworkSelectionBSSID(Ljava/lang/String;)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setNetworkSelectionDisableReason(I)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setNetworkSelectionStatus(I)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setNotRecommended(Z)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->setSeenInLastQualifiedNetworkSelection(Z)V
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;->writeToParcel(Landroid/os/Parcel;)V
-Landroid/net/wifi/WifiConfiguration$PairwiseCipher;-><init>()V
-Landroid/net/wifi/WifiConfiguration$Protocol;-><init>()V
-Landroid/net/wifi/WifiConfiguration$Protocol;->OSEN:I
-Landroid/net/wifi/WifiConfiguration$RecentFailure;-><init>()V
-Landroid/net/wifi/WifiConfiguration$RecentFailure;->clear()V
-Landroid/net/wifi/WifiConfiguration$RecentFailure;->getAssociationStatus()I
-Landroid/net/wifi/WifiConfiguration$RecentFailure;->mAssociationStatus:I
-Landroid/net/wifi/WifiConfiguration$RecentFailure;->NONE:I
-Landroid/net/wifi/WifiConfiguration$RecentFailure;->setAssociationStatus(I)V
-Landroid/net/wifi/WifiConfiguration$RecentFailure;->STATUS_AP_UNABLE_TO_HANDLE_NEW_STA:I
-Landroid/net/wifi/WifiConfiguration$Status;-><init>()V
-Landroid/net/wifi/WifiConfiguration;->AP_BAND_2GHZ:I
-Landroid/net/wifi/WifiConfiguration;->AP_BAND_5GHZ:I
-Landroid/net/wifi/WifiConfiguration;->AP_BAND_ANY:I
-Landroid/net/wifi/WifiConfiguration;->BACKUP_VERSION:I
-Landroid/net/wifi/WifiConfiguration;->bssidVarName:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->configKey()Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->configKey(Z)Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->creationTime:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->dhcpServer:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->didSelfAdd:Z
-Landroid/net/wifi/WifiConfiguration;->dtimInterval:I
-Landroid/net/wifi/WifiConfiguration;->ephemeral:Z
-Landroid/net/wifi/WifiConfiguration;->getBytesForBackup()[B
-Landroid/net/wifi/WifiConfiguration;->getKeyIdForCredentials(Landroid/net/wifi/WifiConfiguration;)Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->getMoTree()Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->getNetworkSelectionStatus()Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;
-Landroid/net/wifi/WifiConfiguration;->getOrCreateRandomizedMacAddress()Landroid/net/MacAddress;
-Landroid/net/wifi/WifiConfiguration;->getRandomizedMacAddress()Landroid/net/MacAddress;
-Landroid/net/wifi/WifiConfiguration;->getWifiConfigFromBackup(Ljava/io/DataInputStream;)Landroid/net/wifi/WifiConfiguration;
-Landroid/net/wifi/WifiConfiguration;->hiddenSSIDVarName:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->HOME_NETWORK_RSSI_BOOST:I
-Landroid/net/wifi/WifiConfiguration;->INVALID_NETWORK_ID:I
-Landroid/net/wifi/WifiConfiguration;->isLegacyPasspointConfig:Z
-Landroid/net/wifi/WifiConfiguration;->isLinked(Landroid/net/wifi/WifiConfiguration;)Z
-Landroid/net/wifi/WifiConfiguration;->isMetered(Landroid/net/wifi/WifiConfiguration;Landroid/net/wifi/WifiInfo;)Z
-Landroid/net/wifi/WifiConfiguration;->isOpenNetwork()Z
-Landroid/net/wifi/WifiConfiguration;->isValidMacAddressForRandomization(Landroid/net/MacAddress;)Z
-Landroid/net/wifi/WifiConfiguration;->lastConnected:J
-Landroid/net/wifi/WifiConfiguration;->lastDisconnected:J
-Landroid/net/wifi/WifiConfiguration;->linkedConfigurations:Ljava/util/HashMap;
-Landroid/net/wifi/WifiConfiguration;->LOCAL_ONLY_NETWORK_ID:I
-Landroid/net/wifi/WifiConfiguration;->MAXIMUM_RANDOM_MAC_GENERATION_RETRY:I
-Landroid/net/wifi/WifiConfiguration;->mCachedConfigKey:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->meteredOverride:I
-Landroid/net/wifi/WifiConfiguration;->METERED_OVERRIDE_METERED:I
-Landroid/net/wifi/WifiConfiguration;->METERED_OVERRIDE_NONE:I
-Landroid/net/wifi/WifiConfiguration;->METERED_OVERRIDE_NOT_METERED:I
-Landroid/net/wifi/WifiConfiguration;->mNetworkSelectionStatus:Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;
-Landroid/net/wifi/WifiConfiguration;->mPasspointManagementObjectTree:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->mRandomizedMacAddress:Landroid/net/MacAddress;
-Landroid/net/wifi/WifiConfiguration;->peerWifiConfiguration:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->pmfVarName:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->priorityVarName:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->pskVarName:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->readBitSet(Landroid/os/Parcel;)Ljava/util/BitSet;
-Landroid/net/wifi/WifiConfiguration;->recentFailure:Landroid/net/wifi/WifiConfiguration$RecentFailure;
-Landroid/net/wifi/WifiConfiguration;->requirePMF:Z
-Landroid/net/wifi/WifiConfiguration;->setNetworkSelectionStatus(Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;)V
-Landroid/net/wifi/WifiConfiguration;->setPasspointManagementObjectTree(Ljava/lang/String;)V
-Landroid/net/wifi/WifiConfiguration;->setRandomizedMacAddress(Landroid/net/MacAddress;)V
-Landroid/net/wifi/WifiConfiguration;->ssidVarName:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->TAG:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->trimStringForKeyId(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->UNKNOWN_UID:I
-Landroid/net/wifi/WifiConfiguration;->updateIdentiferVarName:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->updateIdentifier:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->updateTime:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->userApproved:I
-Landroid/net/wifi/WifiConfiguration;->userApprovedAsString(I)Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->USER_APPROVED:I
-Landroid/net/wifi/WifiConfiguration;->USER_BANNED:I
-Landroid/net/wifi/WifiConfiguration;->USER_PENDING:I
-Landroid/net/wifi/WifiConfiguration;->USER_UNSPECIFIED:I
-Landroid/net/wifi/WifiConfiguration;->wepTxKeyIdxVarName:Ljava/lang/String;
-Landroid/net/wifi/WifiConfiguration;->writeBitSet(Landroid/os/Parcel;Ljava/util/BitSet;)V
-Landroid/net/wifi/WifiEnterpriseConfig$Eap;-><init>()V
-Landroid/net/wifi/WifiEnterpriseConfig$Eap;->strings:[Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig$Phase2;-><init>()V
-Landroid/net/wifi/WifiEnterpriseConfig$Phase2;->AUTHEAP_PREFIX:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig$Phase2;->AUTH_PREFIX:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig$Phase2;->strings:[Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig$SupplicantLoader;->loadValue(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig$SupplicantSaver;->saveValue(Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/net/wifi/WifiEnterpriseConfig;->ALTSUBJECT_MATCH_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->ANON_IDENTITY_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->CA_CERT_ALIAS_DELIMITER:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->CA_CERT_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->CA_CERT_PREFIX:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->CA_PATH_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->CLIENT_CERT_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->CLIENT_CERT_PREFIX:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->convertToQuotedString(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->copyFrom(Landroid/net/wifi/WifiEnterpriseConfig;ZLjava/lang/String;)V
-Landroid/net/wifi/WifiEnterpriseConfig;->copyFromExternal(Landroid/net/wifi/WifiEnterpriseConfig;Ljava/lang/String;)V
-Landroid/net/wifi/WifiEnterpriseConfig;->decodeCaCertificateAlias(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->DOM_SUFFIX_MATCH_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->EAP_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->EMPTY_VALUE:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->encodeCaCertificateAlias(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->ENGINE_DISABLE:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->ENGINE_ENABLE:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->ENGINE_ID_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->ENGINE_ID_KEYSTORE:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->ENGINE_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->getCaCertificateAliases()[Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->getCaPath()Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->getClientPrivateKey()Ljava/security/PrivateKey;
-Landroid/net/wifi/WifiEnterpriseConfig;->getFieldValue(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->getFieldValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->getKeyId(Landroid/net/wifi/WifiEnterpriseConfig;)Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->getStringIndex([Ljava/lang/String;Ljava/lang/String;I)I
-Landroid/net/wifi/WifiEnterpriseConfig;->IDENTITY_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->isEapMethodValid()Z
-Landroid/net/wifi/WifiEnterpriseConfig;->KEYSTORES_URI:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->KEYSTORE_URI:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->loadFromSupplicant(Landroid/net/wifi/WifiEnterpriseConfig$SupplicantLoader;)V
-Landroid/net/wifi/WifiEnterpriseConfig;->mCaCerts:[Ljava/security/cert/X509Certificate;
-Landroid/net/wifi/WifiEnterpriseConfig;->mClientCertificateChain:[Ljava/security/cert/X509Certificate;
-Landroid/net/wifi/WifiEnterpriseConfig;->mClientPrivateKey:Ljava/security/PrivateKey;
-Landroid/net/wifi/WifiEnterpriseConfig;->mEapMethod:I
-Landroid/net/wifi/WifiEnterpriseConfig;->mPhase2Method:I
-Landroid/net/wifi/WifiEnterpriseConfig;->OPP_KEY_CACHING:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->PASSWORD_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->PHASE2_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->PLMN_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->PRIVATE_KEY_ID_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->REALM_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->removeDoubleQuotes(Ljava/lang/String;)Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->resetCaCertificate()V
-Landroid/net/wifi/WifiEnterpriseConfig;->resetClientKeyEntry()V
-Landroid/net/wifi/WifiEnterpriseConfig;->saveToSupplicant(Landroid/net/wifi/WifiEnterpriseConfig$SupplicantSaver;)Z
-Landroid/net/wifi/WifiEnterpriseConfig;->setCaCertificateAliases([Ljava/lang/String;)V
-Landroid/net/wifi/WifiEnterpriseConfig;->setCaPath(Ljava/lang/String;)V
-Landroid/net/wifi/WifiEnterpriseConfig;->setFieldValue(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/net/wifi/WifiEnterpriseConfig;->setFieldValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-Landroid/net/wifi/WifiEnterpriseConfig;->SUBJECT_MATCH_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->SUPPLICANT_CONFIG_KEYS:[Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->TAG:Ljava/lang/String;
-Landroid/net/wifi/WifiEnterpriseConfig;->UNQUOTED_KEYS:Ljava/util/List;
-Landroid/net/wifi/WifiInfo;-><init>(Landroid/net/wifi/WifiInfo;)V
-Landroid/net/wifi/WifiInfo;->hasRealMacAddress()Z
-Landroid/net/wifi/WifiInfo;->is24GHz()Z
-Landroid/net/wifi/WifiInfo;->MAX_RSSI:I
-Landroid/net/wifi/WifiInfo;->mEphemeral:Z
-Landroid/net/wifi/WifiInfo;->mFrequency:I
-Landroid/net/wifi/WifiInfo;->MIN_RSSI:I
-Landroid/net/wifi/WifiInfo;->mLinkSpeed:I
-Landroid/net/wifi/WifiInfo;->mMeteredHint:Z
-Landroid/net/wifi/WifiInfo;->mNetworkId:I
-Landroid/net/wifi/WifiInfo;->mRssi:I
-Landroid/net/wifi/WifiInfo;->mSupplicantState:Landroid/net/wifi/SupplicantState;
-Landroid/net/wifi/WifiInfo;->reset()V
-Landroid/net/wifi/WifiInfo;->rxSuccess:J
-Landroid/net/wifi/WifiInfo;->rxSuccessRate:D
-Landroid/net/wifi/WifiInfo;->setEphemeral(Z)V
-Landroid/net/wifi/WifiInfo;->setFrequency(I)V
-Landroid/net/wifi/WifiInfo;->setInetAddress(Ljava/net/InetAddress;)V
-Landroid/net/wifi/WifiInfo;->setMeteredHint(Z)V
-Landroid/net/wifi/WifiInfo;->setSSID(Landroid/net/wifi/WifiSsid;)V
-Landroid/net/wifi/WifiInfo;->stateMap:Ljava/util/EnumMap;
-Landroid/net/wifi/WifiInfo;->TAG:Ljava/lang/String;
-Landroid/net/wifi/WifiInfo;->txBad:J
-Landroid/net/wifi/WifiInfo;->txBadRate:D
-Landroid/net/wifi/WifiInfo;->txRetries:J
-Landroid/net/wifi/WifiInfo;->txRetriesRate:D
-Landroid/net/wifi/WifiInfo;->txSuccess:J
-Landroid/net/wifi/WifiInfo;->txSuccessRate:D
-Landroid/net/wifi/WifiInfo;->valueOf(Ljava/lang/String;)Landroid/net/wifi/SupplicantState;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallback;->REQUEST_REGISTERED:I
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallbackProxy;-><init>(Landroid/net/wifi/WifiManager;Landroid/os/Looper;Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallback;)V
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallbackProxy;->getMessenger()Landroid/os/Messenger;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallbackProxy;->mHandler:Landroid/os/Handler;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallbackProxy;->mLooper:Landroid/os/Looper;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallbackProxy;->mMessenger:Landroid/os/Messenger;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallbackProxy;->mWifiManager:Ljava/lang/ref/WeakReference;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallbackProxy;->notifyFailed(I)V
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserver;-><init>()V
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserver;->onRegistered(Landroid/net/wifi/WifiManager$LocalOnlyHotspotSubscription;)V
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserver;->onStarted(Landroid/net/wifi/WifiConfiguration;)V
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserver;->onStopped()V
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserverProxy;-><init>(Landroid/net/wifi/WifiManager;Landroid/os/Looper;Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserver;)V
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserverProxy;->getMessenger()Landroid/os/Messenger;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserverProxy;->mHandler:Landroid/os/Handler;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserverProxy;->mLooper:Landroid/os/Looper;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserverProxy;->mMessenger:Landroid/os/Messenger;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserverProxy;->mWifiManager:Ljava/lang/ref/WeakReference;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserverProxy;->registered()V
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotReservation;->mCloseGuard:Ldalvik/system/CloseGuard;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotReservation;->mConfig:Landroid/net/wifi/WifiConfiguration;
-Landroid/net/wifi/WifiManager$LocalOnlyHotspotSubscription;->mCloseGuard:Ldalvik/system/CloseGuard;
-Landroid/net/wifi/WifiManager$MulticastLock;->mBinder:Landroid/os/IBinder;
-Landroid/net/wifi/WifiManager$MulticastLock;->mHeld:Z
-Landroid/net/wifi/WifiManager$MulticastLock;->mRefCount:I
-Landroid/net/wifi/WifiManager$MulticastLock;->mRefCounted:Z
-Landroid/net/wifi/WifiManager$MulticastLock;->mTag:Ljava/lang/String;
-Landroid/net/wifi/WifiManager$ProvisioningCallbackProxy;-><init>(Landroid/os/Looper;Landroid/net/wifi/hotspot2/ProvisioningCallback;)V
-Landroid/net/wifi/WifiManager$ProvisioningCallbackProxy;->mCallback:Landroid/net/wifi/hotspot2/ProvisioningCallback;
-Landroid/net/wifi/WifiManager$ProvisioningCallbackProxy;->mHandler:Landroid/os/Handler;
-Landroid/net/wifi/WifiManager$ProvisioningCallbackProxy;->onProvisioningFailure(I)V
-Landroid/net/wifi/WifiManager$ProvisioningCallbackProxy;->onProvisioningStatus(I)V
-Landroid/net/wifi/WifiManager$ServiceHandler;->dispatchMessageToListeners(Landroid/os/Message;)V
-Landroid/net/wifi/WifiManager$SoftApCallback;->onNumClientsChanged(I)V
-Landroid/net/wifi/WifiManager$SoftApCallback;->onStateChanged(II)V
-Landroid/net/wifi/WifiManager$SoftApCallbackProxy;-><init>(Landroid/os/Looper;Landroid/net/wifi/WifiManager$SoftApCallback;)V
-Landroid/net/wifi/WifiManager$SoftApCallbackProxy;->mCallback:Landroid/net/wifi/WifiManager$SoftApCallback;
-Landroid/net/wifi/WifiManager$SoftApCallbackProxy;->mHandler:Landroid/os/Handler;
-Landroid/net/wifi/WifiManager$SoftApCallbackProxy;->onNumClientsChanged(I)V
-Landroid/net/wifi/WifiManager$SoftApCallbackProxy;->onStateChanged(II)V
-Landroid/net/wifi/WifiManager$TxPacketCountListener;->onFailure(I)V
-Landroid/net/wifi/WifiManager$TxPacketCountListener;->onSuccess(I)V
-Landroid/net/wifi/WifiManager$WifiLock;->mBinder:Landroid/os/IBinder;
-Landroid/net/wifi/WifiManager$WifiLock;->mHeld:Z
-Landroid/net/wifi/WifiManager$WifiLock;->mLockType:I
-Landroid/net/wifi/WifiManager$WifiLock;->mRefCount:I
-Landroid/net/wifi/WifiManager$WifiLock;->mRefCounted:Z
-Landroid/net/wifi/WifiManager$WifiLock;->mTag:Ljava/lang/String;
-Landroid/net/wifi/WifiManager$WifiLock;->mWorkSource:Landroid/os/WorkSource;
-Landroid/net/wifi/WifiManager;-><init>(Landroid/content/Context;Landroid/net/wifi/IWifiManager;Landroid/os/Looper;)V
-Landroid/net/wifi/WifiManager;->ACTION_PASSPOINT_DEAUTH_IMMINENT:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->ACTION_PASSPOINT_ICON:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->ACTION_PASSPOINT_OSU_PROVIDERS_LIST:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->ACTION_REQUEST_DISABLE:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->ACTION_REQUEST_ENABLE:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->addOrUpdateNetwork(Landroid/net/wifi/WifiConfiguration;)I
-Landroid/net/wifi/WifiManager;->BASE:I
-Landroid/net/wifi/WifiManager;->BATCHED_SCAN_RESULTS_AVAILABLE_ACTION:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->BUSY:I
-Landroid/net/wifi/WifiManager;->CANCEL_WPS:I
-Landroid/net/wifi/WifiManager;->CANCEL_WPS_FAILED:I
-Landroid/net/wifi/WifiManager;->CANCEL_WPS_SUCCEDED:I
-Landroid/net/wifi/WifiManager;->CONNECT_NETWORK:I
-Landroid/net/wifi/WifiManager;->CONNECT_NETWORK_FAILED:I
-Landroid/net/wifi/WifiManager;->CONNECT_NETWORK_SUCCEEDED:I
-Landroid/net/wifi/WifiManager;->DATA_ACTIVITY_IN:I
-Landroid/net/wifi/WifiManager;->DATA_ACTIVITY_INOUT:I
-Landroid/net/wifi/WifiManager;->DATA_ACTIVITY_NONE:I
-Landroid/net/wifi/WifiManager;->DATA_ACTIVITY_NOTIFICATION:I
-Landroid/net/wifi/WifiManager;->DATA_ACTIVITY_OUT:I
-Landroid/net/wifi/WifiManager;->deauthenticateNetwork(JZ)V
-Landroid/net/wifi/WifiManager;->DEFAULT_POOR_NETWORK_AVOIDANCE_ENABLED:Z
-Landroid/net/wifi/WifiManager;->disableEphemeralNetwork(Ljava/lang/String;)V
-Landroid/net/wifi/WifiManager;->DISABLE_NETWORK:I
-Landroid/net/wifi/WifiManager;->DISABLE_NETWORK_FAILED:I
-Landroid/net/wifi/WifiManager;->DISABLE_NETWORK_SUCCEEDED:I
-Landroid/net/wifi/WifiManager;->enableWifiConnectivityManager(Z)V
-Landroid/net/wifi/WifiManager;->ERROR:I
-Landroid/net/wifi/WifiManager;->ERROR_AUTH_FAILURE_EAP_FAILURE:I
-Landroid/net/wifi/WifiManager;->ERROR_AUTH_FAILURE_NONE:I
-Landroid/net/wifi/WifiManager;->ERROR_AUTH_FAILURE_TIMEOUT:I
-Landroid/net/wifi/WifiManager;->ERROR_AUTH_FAILURE_WRONG_PSWD:I
-Landroid/net/wifi/WifiManager;->EXTRA_ANQP_ELEMENT_DATA:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_BSSID_LONG:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_DELAY:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_ESS:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_FILENAME:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_ICON:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_LINK_PROPERTIES:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_NETWORK_CAPABILITIES:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_SCAN_AVAILABLE:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_SUBSCRIPTION_REMEDIATION_METHOD:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_SUPPLICANT_ERROR_REASON:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_URL:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_WIFI_AP_FAILURE_REASON:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_WIFI_AP_INTERFACE_NAME:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->EXTRA_WIFI_AP_MODE:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->factoryReset()V
-Landroid/net/wifi/WifiManager;->FORGET_NETWORK:I
-Landroid/net/wifi/WifiManager;->FORGET_NETWORK_FAILED:I
-Landroid/net/wifi/WifiManager;->FORGET_NETWORK_SUCCEEDED:I
-Landroid/net/wifi/WifiManager;->getAllMatchingWifiConfigs(Landroid/net/wifi/ScanResult;)Ljava/util/List;
-Landroid/net/wifi/WifiManager;->getChannel()Lcom/android/internal/util/AsyncChannel;
-Landroid/net/wifi/WifiManager;->getControllerActivityEnergyInfo(I)Landroid/net/wifi/WifiActivityEnergyInfo;
-Landroid/net/wifi/WifiManager;->getCurrentNetworkWpsNfcConfigurationToken()Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->getEnableAutoJoinWhenAssociated()Z
-Landroid/net/wifi/WifiManager;->getMatchingOsuProviders(Landroid/net/wifi/ScanResult;)Ljava/util/List;
-Landroid/net/wifi/WifiManager;->getSupportedFeatures()I
-Landroid/net/wifi/WifiManager;->getTxPacketCount(Landroid/net/wifi/WifiManager$TxPacketCountListener;)V
-Landroid/net/wifi/WifiManager;->HOTSPOT_FAILED:I
-Landroid/net/wifi/WifiManager;->HOTSPOT_OBSERVER_REGISTERED:I
-Landroid/net/wifi/WifiManager;->HOTSPOT_STARTED:I
-Landroid/net/wifi/WifiManager;->HOTSPOT_STOPPED:I
-Landroid/net/wifi/WifiManager;->IFACE_IP_MODE_CONFIGURATION_ERROR:I
-Landroid/net/wifi/WifiManager;->IFACE_IP_MODE_LOCAL_ONLY:I
-Landroid/net/wifi/WifiManager;->IFACE_IP_MODE_TETHERED:I
-Landroid/net/wifi/WifiManager;->IFACE_IP_MODE_UNSPECIFIED:I
-Landroid/net/wifi/WifiManager;->INVALID_ARGS:I
-Landroid/net/wifi/WifiManager;->INVALID_KEY:I
-Landroid/net/wifi/WifiManager;->IN_PROGRESS:I
-Landroid/net/wifi/WifiManager;->isAdditionalStaSupported()Z
-Landroid/net/wifi/WifiManager;->isDualModeSupported()Z
-Landroid/net/wifi/WifiManager;->isFeatureSupported(I)Z
-Landroid/net/wifi/WifiManager;->isMulticastEnabled()Z
-Landroid/net/wifi/WifiManager;->isOffChannelTdlsSupported()Z
-Landroid/net/wifi/WifiManager;->isPasspointSupported()Z
-Landroid/net/wifi/WifiManager;->isWifiAwareSupported()Z
-Landroid/net/wifi/WifiManager;->mAsyncChannel:Lcom/android/internal/util/AsyncChannel;
-Landroid/net/wifi/WifiManager;->matchProviderWithCurrentNetwork(Ljava/lang/String;)I
-Landroid/net/wifi/WifiManager;->MAX_ACTIVE_LOCKS:I
-Landroid/net/wifi/WifiManager;->mConnected:Ljava/util/concurrent/CountDownLatch;
-Landroid/net/wifi/WifiManager;->mContext:Landroid/content/Context;
-Landroid/net/wifi/WifiManager;->mListenerKey:I
-Landroid/net/wifi/WifiManager;->mListenerMap:Landroid/util/SparseArray;
-Landroid/net/wifi/WifiManager;->mListenerMapLock:Ljava/lang/Object;
-Landroid/net/wifi/WifiManager;->mLock:Ljava/lang/Object;
-Landroid/net/wifi/WifiManager;->mLOHSCallbackProxy:Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallbackProxy;
-Landroid/net/wifi/WifiManager;->mLOHSObserverProxy:Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserverProxy;
-Landroid/net/wifi/WifiManager;->mLooper:Landroid/os/Looper;
-Landroid/net/wifi/WifiManager;->mTargetSdkVersion:I
-Landroid/net/wifi/WifiManager;->NOT_AUTHORIZED:I
-Landroid/net/wifi/WifiManager;->putListener(Ljava/lang/Object;)I
-Landroid/net/wifi/WifiManager;->queryPasspointIcon(JLjava/lang/String;)V
-Landroid/net/wifi/WifiManager;->registerSoftApCallback(Landroid/net/wifi/WifiManager$SoftApCallback;Landroid/os/Handler;)V
-Landroid/net/wifi/WifiManager;->removeListener(I)Ljava/lang/Object;
-Landroid/net/wifi/WifiManager;->restoreBackupData([B)V
-Landroid/net/wifi/WifiManager;->restoreSupplicantBackupData([B[B)V
-Landroid/net/wifi/WifiManager;->retrieveBackupData()[B
-Landroid/net/wifi/WifiManager;->RSSI_PKTCNT_FETCH:I
-Landroid/net/wifi/WifiManager;->RSSI_PKTCNT_FETCH_FAILED:I
-Landroid/net/wifi/WifiManager;->RSSI_PKTCNT_FETCH_SUCCEEDED:I
-Landroid/net/wifi/WifiManager;->SAP_START_FAILURE_GENERAL:I
-Landroid/net/wifi/WifiManager;->SAP_START_FAILURE_NO_CHANNEL:I
-Landroid/net/wifi/WifiManager;->SAVE_NETWORK:I
-Landroid/net/wifi/WifiManager;->SAVE_NETWORK_FAILED:I
-Landroid/net/wifi/WifiManager;->SAVE_NETWORK_SUCCEEDED:I
-Landroid/net/wifi/WifiManager;->setCountryCode(Ljava/lang/String;)V
-Landroid/net/wifi/WifiManager;->setEnableAutoJoinWhenAssociated(Z)Z
-Landroid/net/wifi/WifiManager;->sServiceHandlerDispatchLock:Ljava/lang/Object;
-Landroid/net/wifi/WifiManager;->startSoftAp(Landroid/net/wifi/WifiConfiguration;)Z
-Landroid/net/wifi/WifiManager;->startSubscriptionProvisioning(Landroid/net/wifi/hotspot2/OsuProvider;Landroid/net/wifi/hotspot2/ProvisioningCallback;Landroid/os/Handler;)V
-Landroid/net/wifi/WifiManager;->START_WPS:I
-Landroid/net/wifi/WifiManager;->START_WPS_SUCCEEDED:I
-Landroid/net/wifi/WifiManager;->stopLocalOnlyHotspot()V
-Landroid/net/wifi/WifiManager;->stopSoftAp()Z
-Landroid/net/wifi/WifiManager;->TAG:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->unregisterLocalOnlyHotspotObserver()V
-Landroid/net/wifi/WifiManager;->unregisterSoftApCallback(Landroid/net/wifi/WifiManager$SoftApCallback;)V
-Landroid/net/wifi/WifiManager;->updateInterfaceIpState(Ljava/lang/String;I)V
-Landroid/net/wifi/WifiManager;->watchLocalOnlyHotspot(Landroid/net/wifi/WifiManager$LocalOnlyHotspotObserver;Landroid/os/Handler;)V
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_ADDITIONAL_STA:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_AP_STA:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_AWARE:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_BATCH_SCAN:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_CONFIG_NDO:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_CONTROL_ROAMING:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_D2AP_RTT:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_D2D_RTT:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_EPR:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_HAL_EPNO:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_IE_WHITELIST:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_INFRA:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_INFRA_5G:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_LINK_LAYER_STATS:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_LOGGER:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_MKEEP_ALIVE:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_MOBILE_HOTSPOT:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_P2P:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_PASSPOINT:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_PNO:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_RSSI_MONITOR:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_SCANNER:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_SCAN_RAND:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_TDLS:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_TDLS_OFFCHANNEL:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_TRANSMIT_POWER:I
-Landroid/net/wifi/WifiManager;->WIFI_FEATURE_TX_POWER_LIMIT:I
-Landroid/net/wifi/WifiManager;->WIFI_MODE_NO_LOCKS_HELD:I
-Landroid/net/wifi/WifiManager;->WIFI_SCAN_AVAILABLE:Ljava/lang/String;
-Landroid/net/wifi/WifiManager;->WPS_COMPLETED:I
-Landroid/net/wifi/WifiManager;->WPS_FAILED:I
-Landroid/net/wifi/WifiNetworkConnectionStatistics;->TAG:Ljava/lang/String;
 Landroid/net/wifi/WifiNetworkScoreCache$CacheListener;-><init>(Landroid/os/Handler;)V
 Landroid/net/wifi/WifiNetworkScoreCache$CacheListener;->mHandler:Landroid/os/Handler;
 Landroid/net/wifi/WifiNetworkScoreCache$CacheListener;->networkCacheUpdated(Ljava/util/List;)V
@@ -40268,116 +37107,6 @@
 Landroid/net/wifi/WifiNetworkScoreCache;->TAG:Ljava/lang/String;
 Landroid/net/wifi/WifiNetworkScoreCache;->unregisterListener()V
 Landroid/net/wifi/WifiNetworkScoreCache;->updateScores(Ljava/util/List;)V
-Landroid/net/wifi/WifiScanner$ChannelSpec;->dwellTimeMS:I
-Landroid/net/wifi/WifiScanner$ChannelSpec;->passive:Z
-Landroid/net/wifi/WifiScanner$HotlistSettings;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/WifiScanner$OperationResult;-><init>(ILjava/lang/String;)V
-Landroid/net/wifi/WifiScanner$OperationResult;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/WifiScanner$OperationResult;->description:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner$OperationResult;->reason:I
-Landroid/net/wifi/WifiScanner$ParcelableScanData;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/WifiScanner$ParcelableScanResults;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/WifiScanner$PnoScanListener;->onPnoNetworkFound([Landroid/net/wifi/ScanResult;)V
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;-><init>(Ljava/lang/String;)V
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->authBitField:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->AUTH_CODE_EAPOL:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->AUTH_CODE_OPEN:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->AUTH_CODE_PSK:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->flags:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->FLAG_A_BAND:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->FLAG_DIRECTED_SCAN:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->FLAG_G_BAND:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->FLAG_SAME_NETWORK:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->FLAG_STRICT_MATCH:B
-Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;->ssid:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner$PnoSettings;-><init>()V
-Landroid/net/wifi/WifiScanner$PnoSettings;->band5GHzBonus:I
-Landroid/net/wifi/WifiScanner$PnoSettings;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/WifiScanner$PnoSettings;->currentConnectionBonus:I
-Landroid/net/wifi/WifiScanner$PnoSettings;->initialScoreMax:I
-Landroid/net/wifi/WifiScanner$PnoSettings;->isConnected:Z
-Landroid/net/wifi/WifiScanner$PnoSettings;->min24GHzRssi:I
-Landroid/net/wifi/WifiScanner$PnoSettings;->min5GHzRssi:I
-Landroid/net/wifi/WifiScanner$PnoSettings;->networkList:[Landroid/net/wifi/WifiScanner$PnoSettings$PnoNetwork;
-Landroid/net/wifi/WifiScanner$PnoSettings;->sameNetworkBonus:I
-Landroid/net/wifi/WifiScanner$PnoSettings;->secureBonus:I
-Landroid/net/wifi/WifiScanner$ScanData;-><init>()V
-Landroid/net/wifi/WifiScanner$ScanData;-><init>(IIIZ[Landroid/net/wifi/ScanResult;)V
-Landroid/net/wifi/WifiScanner$ScanData;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/WifiScanner$ScanData;->getBucketsScanned()I
-Landroid/net/wifi/WifiScanner$ScanData;->isAllChannelsScanned()Z
-Landroid/net/wifi/WifiScanner$ScanData;->mAllChannelsScanned:Z
-Landroid/net/wifi/WifiScanner$ScanData;->mBucketsScanned:I
-Landroid/net/wifi/WifiScanner$ScanData;->mFlags:I
-Landroid/net/wifi/WifiScanner$ScanData;->mId:I
-Landroid/net/wifi/WifiScanner$ScanData;->mResults:[Landroid/net/wifi/ScanResult;
-Landroid/net/wifi/WifiScanner$ScanSettings$HiddenNetwork;-><init>(Ljava/lang/String;)V
-Landroid/net/wifi/WifiScanner$ScanSettings$HiddenNetwork;->ssid:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner$ScanSettings;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/WifiScanner$ScanSettings;->hiddenNetworks:[Landroid/net/wifi/WifiScanner$ScanSettings$HiddenNetwork;
-Landroid/net/wifi/WifiScanner$ScanSettings;->isPnoScan:Z
-Landroid/net/wifi/WifiScanner$ScanSettings;->type:I
-Landroid/net/wifi/WifiScanner$WifiChangeSettings;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/net/wifi/WifiScanner;-><init>(Landroid/content/Context;Landroid/net/wifi/IWifiScanner;Landroid/os/Looper;)V
-Landroid/net/wifi/WifiScanner;->addListener(Landroid/net/wifi/WifiScanner$ActionListener;)I
-Landroid/net/wifi/WifiScanner;->BASE:I
-Landroid/net/wifi/WifiScanner;->CMD_DEREGISTER_SCAN_LISTENER:I
-Landroid/net/wifi/WifiScanner;->CMD_FULL_SCAN_RESULT:I
-Landroid/net/wifi/WifiScanner;->CMD_GET_SCAN_RESULTS:I
-Landroid/net/wifi/WifiScanner;->CMD_GET_SINGLE_SCAN_RESULTS:I
-Landroid/net/wifi/WifiScanner;->CMD_OP_FAILED:I
-Landroid/net/wifi/WifiScanner;->CMD_OP_SUCCEEDED:I
-Landroid/net/wifi/WifiScanner;->CMD_PNO_NETWORK_FOUND:I
-Landroid/net/wifi/WifiScanner;->CMD_REGISTER_SCAN_LISTENER:I
-Landroid/net/wifi/WifiScanner;->CMD_SCAN_RESULT:I
-Landroid/net/wifi/WifiScanner;->CMD_SINGLE_SCAN_COMPLETED:I
-Landroid/net/wifi/WifiScanner;->CMD_START_BACKGROUND_SCAN:I
-Landroid/net/wifi/WifiScanner;->CMD_START_PNO_SCAN:I
-Landroid/net/wifi/WifiScanner;->CMD_START_SINGLE_SCAN:I
-Landroid/net/wifi/WifiScanner;->CMD_STOP_BACKGROUND_SCAN:I
-Landroid/net/wifi/WifiScanner;->CMD_STOP_PNO_SCAN:I
-Landroid/net/wifi/WifiScanner;->CMD_STOP_SINGLE_SCAN:I
-Landroid/net/wifi/WifiScanner;->DBG:Z
-Landroid/net/wifi/WifiScanner;->deregisterScanListener(Landroid/net/wifi/WifiScanner$ScanListener;)V
-Landroid/net/wifi/WifiScanner;->getAvailableChannels(I)Ljava/util/List;
-Landroid/net/wifi/WifiScanner;->getListener(I)Ljava/lang/Object;
-Landroid/net/wifi/WifiScanner;->getListenerKey(Ljava/lang/Object;)I
-Landroid/net/wifi/WifiScanner;->getSingleScanResults()Ljava/util/List;
-Landroid/net/wifi/WifiScanner;->GET_AVAILABLE_CHANNELS_EXTRA:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner;->INVALID_KEY:I
-Landroid/net/wifi/WifiScanner;->mAsyncChannel:Lcom/android/internal/util/AsyncChannel;
-Landroid/net/wifi/WifiScanner;->mContext:Landroid/content/Context;
-Landroid/net/wifi/WifiScanner;->mInternalHandler:Landroid/os/Handler;
-Landroid/net/wifi/WifiScanner;->mListenerKey:I
-Landroid/net/wifi/WifiScanner;->mListenerMap:Landroid/util/SparseArray;
-Landroid/net/wifi/WifiScanner;->mListenerMapLock:Ljava/lang/Object;
-Landroid/net/wifi/WifiScanner;->mService:Landroid/net/wifi/IWifiScanner;
-Landroid/net/wifi/WifiScanner;->PNO_PARAMS_PNO_SETTINGS_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner;->PNO_PARAMS_SCAN_SETTINGS_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner;->putListener(Ljava/lang/Object;)I
-Landroid/net/wifi/WifiScanner;->registerScanListener(Landroid/net/wifi/WifiScanner$ScanListener;)V
-Landroid/net/wifi/WifiScanner;->removeListener(I)Ljava/lang/Object;
-Landroid/net/wifi/WifiScanner;->removeListener(Ljava/lang/Object;)I
-Landroid/net/wifi/WifiScanner;->SCAN_PARAMS_SCAN_SETTINGS_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner;->SCAN_PARAMS_WORK_SOURCE_KEY:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner;->startConnectedPnoScan(Landroid/net/wifi/WifiScanner$ScanSettings;Landroid/net/wifi/WifiScanner$PnoSettings;Landroid/net/wifi/WifiScanner$PnoScanListener;)V
-Landroid/net/wifi/WifiScanner;->startDisconnectedPnoScan(Landroid/net/wifi/WifiScanner$ScanSettings;Landroid/net/wifi/WifiScanner$PnoSettings;Landroid/net/wifi/WifiScanner$PnoScanListener;)V
-Landroid/net/wifi/WifiScanner;->startPnoScan(Landroid/net/wifi/WifiScanner$ScanSettings;Landroid/net/wifi/WifiScanner$PnoSettings;I)V
-Landroid/net/wifi/WifiScanner;->stopPnoScan(Landroid/net/wifi/WifiScanner$ScanListener;)V
-Landroid/net/wifi/WifiScanner;->TAG:Ljava/lang/String;
-Landroid/net/wifi/WifiScanner;->TYPE_HIGH_ACCURACY:I
-Landroid/net/wifi/WifiScanner;->TYPE_LOW_LATENCY:I
-Landroid/net/wifi/WifiScanner;->TYPE_LOW_POWER:I
-Landroid/net/wifi/WifiScanner;->validateChannel()V
-Landroid/net/wifi/WifiSsid;-><init>()V
-Landroid/net/wifi/WifiSsid;->convertToBytes(Ljava/lang/String;)V
-Landroid/net/wifi/WifiSsid;->createFromByteArray([B)Landroid/net/wifi/WifiSsid;
-Landroid/net/wifi/WifiSsid;->createFromHex(Ljava/lang/String;)Landroid/net/wifi/WifiSsid;
-Landroid/net/wifi/WifiSsid;->getHexString()Ljava/lang/String;
-Landroid/net/wifi/WifiSsid;->HEX_RADIX:I
-Landroid/net/wifi/WifiSsid;->isArrayAllZeroes([B)Z
-Landroid/net/wifi/WifiSsid;->isHidden()Z
-Landroid/net/wifi/WifiSsid;->TAG:Ljava/lang/String;
 Landroid/net/wifi/WifiWakeReasonAndCounts;-><init>()V
 Landroid/net/wifi/WifiWakeReasonAndCounts;->cmdEventWakeCntArray:[I
 Landroid/net/wifi/WifiWakeReasonAndCounts;->CREATOR:Landroid/os/Parcelable$Creator;
@@ -43626,45 +40355,6 @@
 Landroid/os/IServiceManager;->LIST_SERVICES_TRANSACTION:I
 Landroid/os/IServiceManager;->setPermissionController(Landroid/os/IPermissionController;)V
 Landroid/os/IServiceManager;->SET_PERMISSION_CONTROLLER_TRANSACTION:I
-Landroid/os/IStatsCompanionService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->cancelAlarmForSubscriberTriggering()V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->cancelAnomalyAlarm()V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->cancelPullingAlarm()V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/os/IStatsCompanionService$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/os/IStatsCompanionService$Stub$Proxy;->pullData(I)[Landroid/os/StatsLogEventWrapper;
-Landroid/os/IStatsCompanionService$Stub$Proxy;->sendDataBroadcast(Landroid/os/IBinder;J)V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->sendSubscriberBroadcast(Landroid/os/IBinder;JJJJ[Ljava/lang/String;Landroid/os/StatsDimensionsValue;)V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->setAlarmForSubscriberTriggering(J)V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->setAnomalyAlarm(J)V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->setPullingAlarm(J)V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->statsdReady()V
-Landroid/os/IStatsCompanionService$Stub$Proxy;->triggerUidSnapshot()V
-Landroid/os/IStatsCompanionService$Stub;-><init>()V
-Landroid/os/IStatsCompanionService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IStatsCompanionService;
-Landroid/os/IStatsCompanionService$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_cancelAlarmForSubscriberTriggering:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_cancelAnomalyAlarm:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_cancelPullingAlarm:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_pullData:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_sendDataBroadcast:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_sendSubscriberBroadcast:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_setAlarmForSubscriberTriggering:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_setAnomalyAlarm:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_setPullingAlarm:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_statsdReady:I
-Landroid/os/IStatsCompanionService$Stub;->TRANSACTION_triggerUidSnapshot:I
-Landroid/os/IStatsCompanionService;->cancelAlarmForSubscriberTriggering()V
-Landroid/os/IStatsCompanionService;->cancelAnomalyAlarm()V
-Landroid/os/IStatsCompanionService;->cancelPullingAlarm()V
-Landroid/os/IStatsCompanionService;->pullData(I)[Landroid/os/StatsLogEventWrapper;
-Landroid/os/IStatsCompanionService;->sendDataBroadcast(Landroid/os/IBinder;J)V
-Landroid/os/IStatsCompanionService;->sendSubscriberBroadcast(Landroid/os/IBinder;JJJJ[Ljava/lang/String;Landroid/os/StatsDimensionsValue;)V
-Landroid/os/IStatsCompanionService;->setAlarmForSubscriberTriggering(J)V
-Landroid/os/IStatsCompanionService;->setAnomalyAlarm(J)V
-Landroid/os/IStatsCompanionService;->setPullingAlarm(J)V
-Landroid/os/IStatsCompanionService;->statsdReady()V
-Landroid/os/IStatsCompanionService;->triggerUidSnapshot()V
 Landroid/os/IStatsManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 Landroid/os/IStatsManager$Stub$Proxy;->addConfiguration(J[BLjava/lang/String;)V
 Landroid/os/IStatsManager$Stub$Proxy;->getData(JLjava/lang/String;)[B
@@ -45217,13 +41907,6 @@
 Landroid/os/SimpleClock;-><init>(Ljava/time/ZoneId;)V
 Landroid/os/SimpleClock;->zone:Ljava/time/ZoneId;
 Landroid/os/StatFs;->doStat(Ljava/lang/String;)Landroid/system/StructStatVfs;
-Landroid/os/StatsDimensionsValue;-><init>(Landroid/os/Parcel;)V
-Landroid/os/StatsDimensionsValue;->mField:I
-Landroid/os/StatsDimensionsValue;->mValue:Ljava/lang/Object;
-Landroid/os/StatsDimensionsValue;->mValueType:I
-Landroid/os/StatsDimensionsValue;->readValueFromParcel(ILandroid/os/Parcel;)Ljava/lang/Object;
-Landroid/os/StatsDimensionsValue;->TAG:Ljava/lang/String;
-Landroid/os/StatsDimensionsValue;->writeValueToParcel(ILjava/lang/Object;Landroid/os/Parcel;I)Z
 Landroid/os/StatsLogEventWrapper;-><init>(JII)V
 Landroid/os/StatsLogEventWrapper;-><init>(Landroid/os/Parcel;)V
 Landroid/os/StatsLogEventWrapper;->CREATOR:Landroid/os/Parcelable$Creator;
@@ -48671,33 +45354,6 @@
 Landroid/provider/FontsContract;->TAG:Ljava/lang/String;
 Landroid/provider/FontsContract;->THREAD_RENEWAL_THRESHOLD_MS:I
 Landroid/provider/LiveFolders;-><init>()V
-Landroid/provider/MediaStore$Audio$AudioColumns;->ALBUM_ARTIST:Ljava/lang/String;
-Landroid/provider/MediaStore$Audio$AudioColumns;->COMPILATION:Ljava/lang/String;
-Landroid/provider/MediaStore$Audio$AudioColumns;->GENRE:Ljava/lang/String;
-Landroid/provider/MediaStore$Audio$AudioColumns;->TITLE_RESOURCE_URI:Ljava/lang/String;
-Landroid/provider/MediaStore$Audio$Media;->EXTERNAL_PATHS:[Ljava/lang/String;
-Landroid/provider/MediaStore$Audio$Radio;-><init>()V
-Landroid/provider/MediaStore$Files;->getDirectoryUri(Ljava/lang/String;)Landroid/net/Uri;
-Landroid/provider/MediaStore$Images$Media;->StoreThumbnail(Landroid/content/ContentResolver;Landroid/graphics/Bitmap;JFFI)Landroid/graphics/Bitmap;
-Landroid/provider/MediaStore$InternalThumbnails;-><init>()V
-Landroid/provider/MediaStore$InternalThumbnails;->cancelThumbnailRequest(Landroid/content/ContentResolver;JLandroid/net/Uri;J)V
-Landroid/provider/MediaStore$InternalThumbnails;->DEFAULT_GROUP_ID:I
-Landroid/provider/MediaStore$InternalThumbnails;->FULL_SCREEN_KIND:I
-Landroid/provider/MediaStore$InternalThumbnails;->getMiniThumbFromFile(Landroid/database/Cursor;Landroid/net/Uri;Landroid/content/ContentResolver;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;
-Landroid/provider/MediaStore$InternalThumbnails;->getThumbnail(Landroid/content/ContentResolver;JJILandroid/graphics/BitmapFactory$Options;Landroid/net/Uri;Z)Landroid/graphics/Bitmap;
-Landroid/provider/MediaStore$InternalThumbnails;->MICRO_KIND:I
-Landroid/provider/MediaStore$InternalThumbnails;->MINI_KIND:I
-Landroid/provider/MediaStore$InternalThumbnails;->PROJECTION:[Ljava/lang/String;
-Landroid/provider/MediaStore$InternalThumbnails;->sThumbBuf:[B
-Landroid/provider/MediaStore$InternalThumbnails;->sThumbBufLock:Ljava/lang/Object;
-Landroid/provider/MediaStore$MediaColumns;->MEDIA_SCANNER_NEW_OBJECT_ID:Ljava/lang/String;
-Landroid/provider/MediaStore;->CONTENT_AUTHORITY_SLASH:Ljava/lang/String;
-Landroid/provider/MediaStore;->getDocumentUri(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/util/List;)Landroid/net/Uri;
-Landroid/provider/MediaStore;->getFilePath(Landroid/content/ContentResolver;Landroid/net/Uri;)Ljava/lang/String;
-Landroid/provider/MediaStore;->PARAM_DELETE_DATA:Ljava/lang/String;
-Landroid/provider/MediaStore;->RETRANSLATE_CALL:Ljava/lang/String;
-Landroid/provider/MediaStore;->TAG:Ljava/lang/String;
-Landroid/provider/MediaStore;->UNHIDE_CALL:Ljava/lang/String;
 Landroid/provider/MetadataReader;-><init>()V
 Landroid/provider/MetadataReader;->DEFAULT_EXIF_TAGS:[Ljava/lang/String;
 Landroid/provider/MetadataReader;->getExifData(Ljava/io/InputStream;[Ljava/lang/String;)Landroid/os/Bundle;
@@ -65005,412 +61661,6 @@
 Landroid/util/StateSet;->VIEW_STATE_SELECTED:I
 Landroid/util/StateSet;->VIEW_STATE_SETS:[[I
 Landroid/util/StateSet;->VIEW_STATE_WINDOW_FOCUSED:I
-Landroid/util/StatsLog;-><init>()V
-Landroid/util/StatsLog;->DEBUG:Z
-Landroid/util/StatsLog;->getIStatsManagerLocked()Landroid/os/IStatsManager;
-Landroid/util/StatsLog;->sService:Landroid/os/IStatsManager;
-Landroid/util/StatsLog;->TAG:Ljava/lang/String;
-Landroid/util/StatsLogInternal;-><init>()V
-Landroid/util/StatsLogInternal;->ACTIVITY_FOREGROUND_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->ACTIVITY_FOREGROUND_STATE_CHANGED__STATE__BACKGROUND:I
-Landroid/util/StatsLogInternal;->ACTIVITY_FOREGROUND_STATE_CHANGED__STATE__FOREGROUND:I
-Landroid/util/StatsLogInternal;->ANOMALY_DETECTED:I
-Landroid/util/StatsLogInternal;->ANROCCURRED__FOREGROUND_STATE__BACKGROUND:I
-Landroid/util/StatsLogInternal;->ANROCCURRED__FOREGROUND_STATE__FOREGROUND:I
-Landroid/util/StatsLogInternal;->ANROCCURRED__FOREGROUND_STATE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->ANROCCURRED__IS_INSTANT_APP__FALSE:I
-Landroid/util/StatsLogInternal;->ANROCCURRED__IS_INSTANT_APP__TRUE:I
-Landroid/util/StatsLogInternal;->ANROCCURRED__IS_INSTANT_APP__UNAVAILABLE:I
-Landroid/util/StatsLogInternal;->ANR_OCCURRED:I
-Landroid/util/StatsLogInternal;->APP_BREADCRUMB_REPORTED:I
-Landroid/util/StatsLogInternal;->APP_BREADCRUMB_REPORTED__STATE__START:I
-Landroid/util/StatsLogInternal;->APP_BREADCRUMB_REPORTED__STATE__STOP:I
-Landroid/util/StatsLogInternal;->APP_BREADCRUMB_REPORTED__STATE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->APP_BREADCRUMB_REPORTED__STATE__UNSPECIFIED:I
-Landroid/util/StatsLogInternal;->APP_CRASH_OCCURRED:I
-Landroid/util/StatsLogInternal;->APP_CRASH_OCCURRED__FOREGROUND_STATE__BACKGROUND:I
-Landroid/util/StatsLogInternal;->APP_CRASH_OCCURRED__FOREGROUND_STATE__FOREGROUND:I
-Landroid/util/StatsLogInternal;->APP_CRASH_OCCURRED__FOREGROUND_STATE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->APP_CRASH_OCCURRED__IS_INSTANT_APP__FALSE:I
-Landroid/util/StatsLogInternal;->APP_CRASH_OCCURRED__IS_INSTANT_APP__TRUE:I
-Landroid/util/StatsLogInternal;->APP_CRASH_OCCURRED__IS_INSTANT_APP__UNAVAILABLE:I
-Landroid/util/StatsLogInternal;->APP_DIED:I
-Landroid/util/StatsLogInternal;->APP_START_CANCELED:I
-Landroid/util/StatsLogInternal;->APP_START_CANCELED__TYPE__COLD:I
-Landroid/util/StatsLogInternal;->APP_START_CANCELED__TYPE__HOT:I
-Landroid/util/StatsLogInternal;->APP_START_CANCELED__TYPE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->APP_START_CANCELED__TYPE__WARM:I
-Landroid/util/StatsLogInternal;->APP_START_FULLY_DRAWN:I
-Landroid/util/StatsLogInternal;->APP_START_FULLY_DRAWN__TYPE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->APP_START_FULLY_DRAWN__TYPE__WITHOUT_BUNDLE:I
-Landroid/util/StatsLogInternal;->APP_START_FULLY_DRAWN__TYPE__WITH_BUNDLE:I
-Landroid/util/StatsLogInternal;->APP_START_MEMORY_STATE_CAPTURED:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__REASON__APP_TRANSITION_REASON_UNKNOWN:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__REASON__APP_TRANSITION_RECENTS_ANIM:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__REASON__APP_TRANSITION_SNAPSHOT:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__REASON__APP_TRANSITION_SPLASH_SCREEN:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__REASON__APP_TRANSITION_TIMEOUT:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__REASON__APP_TRANSITION_WINDOWS_DRAWN:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__TYPE__COLD:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__TYPE__HOT:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__TYPE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->APP_START_OCCURRED__TYPE__WARM:I
-Landroid/util/StatsLogInternal;->AUDIO_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->AUDIO_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->AUDIO_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->AUDIO_STATE_CHANGED__STATE__RESET:I
-Landroid/util/StatsLogInternal;->BATTERY_LEVEL_CHANGED:I
-Landroid/util/StatsLogInternal;->BATTERY_SAVER_MODE_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->BATTERY_SAVER_MODE_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->BATTERY_SAVER_MODE_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->BLE_SCAN_RESULT_RECEIVED:I
-Landroid/util/StatsLogInternal;->BLE_SCAN_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->BLE_SCAN_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->BLE_SCAN_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->BLE_SCAN_STATE_CHANGED__STATE__RESET:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ACTIVITY_INFO:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_BYTES_TRANSFER:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_CONNECTION_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_CONNECTION_STATE_CHANGED__STATE__CONNECTION_STATE_CONNECTED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_CONNECTION_STATE_CHANGED__STATE__CONNECTION_STATE_CONNECTING:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_CONNECTION_STATE_CHANGED__STATE__CONNECTION_STATE_DISCONNECTED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_CONNECTION_STATE_CHANGED__STATE__CONNECTION_STATE_DISCONNECTING:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_AIRPLANE_MODE:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_APPLICATION_REQUEST:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_CRASH:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_DISALLOWED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_RESTARTED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_RESTORE_USER_SETTING:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_START_ERROR:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_SYSTEM_BOOT:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_UNSPECIFIED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__REASON__ENABLE_DISABLE_REASON_USER_SWITCH:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__STATE__DISABLED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__STATE__ENABLED:I
-Landroid/util/StatsLogInternal;->BLUETOOTH_ENABLED_STATE_CHANGED__STATE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->BOOT_SEQUENCE_REPORTED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__ABORTED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__ACTIVE:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__CONNECTING:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__DIALING:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__DISCONNECTED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__DISCONNECTING:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__NEW:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__ON_HOLD:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__PULLING:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__RINGING:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__CALL_STATE__SELECT_PHONE_ACCOUNT:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__ANSWERED_ELSEWHERE:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__BUSY:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__CALL_PULLED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__CANCELED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__CONNECTION_MANAGER_NOT_SUPPORTED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__ERROR:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__LOCAL:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__MISSED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__OTHER:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__REJECTED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__REMOTE:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__RESTRICTED:I
-Landroid/util/StatsLogInternal;->CALL_STATE_CHANGED__DISCONNECT_CAUSE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->CAMERA_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->CAMERA_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->CAMERA_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->CAMERA_STATE_CHANGED__STATE__RESET:I
-Landroid/util/StatsLogInternal;->CHARGE_CYCLES_REPORTED:I
-Landroid/util/StatsLogInternal;->CHARGING_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->CHARGING_STATE_CHANGED__STATE__BATTERY_STATUS_CHARGING:I
-Landroid/util/StatsLogInternal;->CHARGING_STATE_CHANGED__STATE__BATTERY_STATUS_DISCHARGING:I
-Landroid/util/StatsLogInternal;->CHARGING_STATE_CHANGED__STATE__BATTERY_STATUS_FULL:I
-Landroid/util/StatsLogInternal;->CHARGING_STATE_CHANGED__STATE__BATTERY_STATUS_INVALID:I
-Landroid/util/StatsLogInternal;->CHARGING_STATE_CHANGED__STATE__BATTERY_STATUS_NOT_CHARGING:I
-Landroid/util/StatsLogInternal;->CHARGING_STATE_CHANGED__STATE__BATTERY_STATUS_UNKNOWN:I
-Landroid/util/StatsLogInternal;->CPU_ACTIVE_TIME:I
-Landroid/util/StatsLogInternal;->CPU_CLUSTER_TIME:I
-Landroid/util/StatsLogInternal;->CPU_TIME_PER_FREQ:I
-Landroid/util/StatsLogInternal;->CPU_TIME_PER_UID:I
-Landroid/util/StatsLogInternal;->CPU_TIME_PER_UID_FREQ:I
-Landroid/util/StatsLogInternal;->DAVEY_OCCURRED:I
-Landroid/util/StatsLogInternal;->DEVICE_IDLE_MODE_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->DEVICE_IDLE_MODE_STATE_CHANGED__STATE__DEVICE_IDLE_MODE_DEEP:I
-Landroid/util/StatsLogInternal;->DEVICE_IDLE_MODE_STATE_CHANGED__STATE__DEVICE_IDLE_MODE_LIGHT:I
-Landroid/util/StatsLogInternal;->DEVICE_IDLE_MODE_STATE_CHANGED__STATE__DEVICE_IDLE_MODE_OFF:I
-Landroid/util/StatsLogInternal;->DEVICE_IDLING_MODE_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->DEVICE_IDLING_MODE_STATE_CHANGED__STATE__DEVICE_IDLE_MODE_DEEP:I
-Landroid/util/StatsLogInternal;->DEVICE_IDLING_MODE_STATE_CHANGED__STATE__DEVICE_IDLE_MODE_LIGHT:I
-Landroid/util/StatsLogInternal;->DEVICE_IDLING_MODE_STATE_CHANGED__STATE__DEVICE_IDLE_MODE_OFF:I
-Landroid/util/StatsLogInternal;->DISK_SPACE:I
-Landroid/util/StatsLogInternal;->FLASHLIGHT_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->FLASHLIGHT_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->FLASHLIGHT_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->FLASHLIGHT_STATE_CHANGED__STATE__RESET:I
-Landroid/util/StatsLogInternal;->FOREGROUND_SERVICE_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER:I
-Landroid/util/StatsLogInternal;->FOREGROUND_SERVICE_STATE_CHANGED__STATE__EXIT:I
-Landroid/util/StatsLogInternal;->FULL_BATTERY_CAPACITY:I
-Landroid/util/StatsLogInternal;->GPS_SCAN_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->GPS_SCAN_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->GPS_SCAN_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->HARDWARE_FAILED:I
-Landroid/util/StatsLogInternal;->HARDWARE_FAILED__HARDWARE_TYPE__HARDWARE_FAILED_CODEC:I
-Landroid/util/StatsLogInternal;->HARDWARE_FAILED__HARDWARE_TYPE__HARDWARE_FAILED_FINGERPRINT:I
-Landroid/util/StatsLogInternal;->HARDWARE_FAILED__HARDWARE_TYPE__HARDWARE_FAILED_MICROPHONE:I
-Landroid/util/StatsLogInternal;->HARDWARE_FAILED__HARDWARE_TYPE__HARDWARE_FAILED_SPEAKER:I
-Landroid/util/StatsLogInternal;->HARDWARE_FAILED__HARDWARE_TYPE__HARDWARE_FAILED_UNKNOWN:I
-Landroid/util/StatsLogInternal;->ISOLATED_UID_CHANGED:I
-Landroid/util/StatsLogInternal;->ISOLATED_UID_CHANGED__EVENT__CREATED:I
-Landroid/util/StatsLogInternal;->ISOLATED_UID_CHANGED__EVENT__REMOVED:I
-Landroid/util/StatsLogInternal;->KERNEL_WAKELOCK:I
-Landroid/util/StatsLogInternal;->KERNEL_WAKEUP_REPORTED:I
-Landroid/util/StatsLogInternal;->KEYGUARD_BOUNCER_PASSWORD_ENTERED:I
-Landroid/util/StatsLogInternal;->KEYGUARD_BOUNCER_PASSWORD_ENTERED__RESULT__FAILURE:I
-Landroid/util/StatsLogInternal;->KEYGUARD_BOUNCER_PASSWORD_ENTERED__RESULT__SUCCESS:I
-Landroid/util/StatsLogInternal;->KEYGUARD_BOUNCER_PASSWORD_ENTERED__RESULT__UNKNOWN:I
-Landroid/util/StatsLogInternal;->KEYGUARD_BOUNCER_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->KEYGUARD_BOUNCER_STATE_CHANGED__STATE__HIDDEN:I
-Landroid/util/StatsLogInternal;->KEYGUARD_BOUNCER_STATE_CHANGED__STATE__SHOWN:I
-Landroid/util/StatsLogInternal;->KEYGUARD_BOUNCER_STATE_CHANGED__STATE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->KEYGUARD_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->KEYGUARD_STATE_CHANGED__STATE__HIDDEN:I
-Landroid/util/StatsLogInternal;->KEYGUARD_STATE_CHANGED__STATE__OCCLUDED:I
-Landroid/util/StatsLogInternal;->KEYGUARD_STATE_CHANGED__STATE__SHOWN:I
-Landroid/util/StatsLogInternal;->KEYGUARD_STATE_CHANGED__STATE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->LMK_KILL_OCCURRED:I
-Landroid/util/StatsLogInternal;->LMK_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->LMK_STATE_CHANGED__STATE__START:I
-Landroid/util/StatsLogInternal;->LMK_STATE_CHANGED__STATE__STOP:I
-Landroid/util/StatsLogInternal;->LMK_STATE_CHANGED__STATE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->LONG_PARTIAL_WAKELOCK_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->LONG_PARTIAL_WAKELOCK_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->LONG_PARTIAL_WAKELOCK_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->LOW_MEM_REPORTED:I
-Landroid/util/StatsLogInternal;->MEDIA_CODEC_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->MEDIA_CODEC_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->MEDIA_CODEC_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->MEDIA_CODEC_STATE_CHANGED__STATE__RESET:I
-Landroid/util/StatsLogInternal;->MOBILE_BYTES_TRANSFER:I
-Landroid/util/StatsLogInternal;->MOBILE_BYTES_TRANSFER_BY_FG_BG:I
-Landroid/util/StatsLogInternal;->MOBILE_CONNECTION_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->MOBILE_CONNECTION_STATE_CHANGED__STATE__ACTIVATING:I
-Landroid/util/StatsLogInternal;->MOBILE_CONNECTION_STATE_CHANGED__STATE__ACTIVE:I
-Landroid/util/StatsLogInternal;->MOBILE_CONNECTION_STATE_CHANGED__STATE__DISCONNECTING:I
-Landroid/util/StatsLogInternal;->MOBILE_CONNECTION_STATE_CHANGED__STATE__DISCONNECTION_ERROR_CREATING_CONNECTION:I
-Landroid/util/StatsLogInternal;->MOBILE_CONNECTION_STATE_CHANGED__STATE__INACTIVE:I
-Landroid/util/StatsLogInternal;->MOBILE_CONNECTION_STATE_CHANGED__STATE__UNKNOWN:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_POWER_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_POWER_STATE_CHANGED__STATE__DATA_CONNECTION_POWER_STATE_HIGH:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_POWER_STATE_CHANGED__STATE__DATA_CONNECTION_POWER_STATE_LOW:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_POWER_STATE_CHANGED__STATE__DATA_CONNECTION_POWER_STATE_MEDIUM:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_POWER_STATE_CHANGED__STATE__DATA_CONNECTION_POWER_STATE_UNKNOWN:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_1XRTT:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_CDMA:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_EDGE:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_EHRPD:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_EVDO_0:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_EVDO_A:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_EVDO_B:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_GPRS:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_GSM:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_HSDPA:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_HSPA:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_HSPAP:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_HSUPA:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_IDEN:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_IWLAN:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_LTE:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_LTE_CA:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_TD_SCDMA:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_UMTS:I
-Landroid/util/StatsLogInternal;->MOBILE_RADIO_TECHNOLOGY_CHANGED__STATE__NETWORK_TYPE_UNKNOWN:I
-Landroid/util/StatsLogInternal;->MODEM_ACTIVITY_INFO:I
-Landroid/util/StatsLogInternal;->OVERLAY_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->OVERLAY_STATE_CHANGED__STATE__ENTERED:I
-Landroid/util/StatsLogInternal;->OVERLAY_STATE_CHANGED__STATE__EXITED:I
-Landroid/util/StatsLogInternal;->PACKET_WAKEUP_OCCURRED:I
-Landroid/util/StatsLogInternal;->PHONE_SIGNAL_STRENGTH_CHANGED:I
-Landroid/util/StatsLogInternal;->PHONE_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_GOOD:I
-Landroid/util/StatsLogInternal;->PHONE_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_GREAT:I
-Landroid/util/StatsLogInternal;->PHONE_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_MODERATE:I
-Landroid/util/StatsLogInternal;->PHONE_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_NONE_OR_UNKNOWN:I
-Landroid/util/StatsLogInternal;->PHONE_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_POOR:I
-Landroid/util/StatsLogInternal;->PHYSICAL_DROP_DETECTED:I
-Landroid/util/StatsLogInternal;->PICTURE_IN_PICTURE_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->PICTURE_IN_PICTURE_STATE_CHANGED__STATE__DISMISSED:I
-Landroid/util/StatsLogInternal;->PICTURE_IN_PICTURE_STATE_CHANGED__STATE__ENTERED:I
-Landroid/util/StatsLogInternal;->PICTURE_IN_PICTURE_STATE_CHANGED__STATE__EXPANDED_TO_FULL_SCREEN:I
-Landroid/util/StatsLogInternal;->PICTURE_IN_PICTURE_STATE_CHANGED__STATE__MINIMIZED:I
-Landroid/util/StatsLogInternal;->PLUGGED_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->PLUGGED_STATE_CHANGED__STATE__BATTERY_PLUGGED_AC:I
-Landroid/util/StatsLogInternal;->PLUGGED_STATE_CHANGED__STATE__BATTERY_PLUGGED_NONE:I
-Landroid/util/StatsLogInternal;->PLUGGED_STATE_CHANGED__STATE__BATTERY_PLUGGED_USB:I
-Landroid/util/StatsLogInternal;->PLUGGED_STATE_CHANGED__STATE__BATTERY_PLUGGED_WIRELESS:I
-Landroid/util/StatsLogInternal;->PROCESS_LIFE_CYCLE_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->PROCESS_LIFE_CYCLE_STATE_CHANGED__STATE__CRASHED:I
-Landroid/util/StatsLogInternal;->PROCESS_LIFE_CYCLE_STATE_CHANGED__STATE__FINISHED:I
-Landroid/util/StatsLogInternal;->PROCESS_LIFE_CYCLE_STATE_CHANGED__STATE__STARTED:I
-Landroid/util/StatsLogInternal;->PROCESS_MEMORY_STATE:I
-Landroid/util/StatsLogInternal;->REMAINING_BATTERY_CAPACITY:I
-Landroid/util/StatsLogInternal;->RESOURCE_CONFIGURATION_CHANGED:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STATE__FINISHED:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STATE__SCHEDULED:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STATE__STARTED:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STOP_REASON__STOP_REASON_CANCELLED:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STOP_REASON__STOP_REASON_CONSTRAINTS_NOT_SATISFIED:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STOP_REASON__STOP_REASON_DEVICE_IDLE:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STOP_REASON__STOP_REASON_PREEMPT:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STOP_REASON__STOP_REASON_TIMEOUT:I
-Landroid/util/StatsLogInternal;->SCHEDULED_JOB_STATE_CHANGED__STOP_REASON__STOP_REASON_UNKNOWN:I
-Landroid/util/StatsLogInternal;->SCREEN_BRIGHTNESS_CHANGED:I
-Landroid/util/StatsLogInternal;->SCREEN_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->SCREEN_STATE_CHANGED__STATE__DISPLAY_STATE_DOZE:I
-Landroid/util/StatsLogInternal;->SCREEN_STATE_CHANGED__STATE__DISPLAY_STATE_DOZE_SUSPEND:I
-Landroid/util/StatsLogInternal;->SCREEN_STATE_CHANGED__STATE__DISPLAY_STATE_OFF:I
-Landroid/util/StatsLogInternal;->SCREEN_STATE_CHANGED__STATE__DISPLAY_STATE_ON:I
-Landroid/util/StatsLogInternal;->SCREEN_STATE_CHANGED__STATE__DISPLAY_STATE_ON_SUSPEND:I
-Landroid/util/StatsLogInternal;->SCREEN_STATE_CHANGED__STATE__DISPLAY_STATE_UNKNOWN:I
-Landroid/util/StatsLogInternal;->SCREEN_STATE_CHANGED__STATE__DISPLAY_STATE_VR:I
-Landroid/util/StatsLogInternal;->SENSOR_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->SENSOR_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->SENSOR_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->SETTING_CHANGED:I
-Landroid/util/StatsLogInternal;->SETTING_CHANGED__REASON__DELETED:I
-Landroid/util/StatsLogInternal;->SETTING_CHANGED__REASON__UPDATED:I
-Landroid/util/StatsLogInternal;->SHUTDOWN_SEQUENCE_REPORTED:I
-Landroid/util/StatsLogInternal;->SPEAKER_IMPEDANCE_REPORTED:I
-Landroid/util/StatsLogInternal;->SUBSYSTEM_SLEEP_STATE:I
-Landroid/util/StatsLogInternal;->SYNC_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->SYNC_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->SYNC_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->SYSTEM_ELAPSED_REALTIME:I
-Landroid/util/StatsLogInternal;->SYSTEM_UPTIME:I
-Landroid/util/StatsLogInternal;->TEMPERATURE:I
-Landroid/util/StatsLogInternal;->TEMPERATURE__SENSOR_LOCATION__TEMPERATURE_TYPE_BATTERY:I
-Landroid/util/StatsLogInternal;->TEMPERATURE__SENSOR_LOCATION__TEMPERATURE_TYPE_CPU:I
-Landroid/util/StatsLogInternal;->TEMPERATURE__SENSOR_LOCATION__TEMPERATURE_TYPE_GPU:I
-Landroid/util/StatsLogInternal;->TEMPERATURE__SENSOR_LOCATION__TEMPERATURE_TYPE_SKIN:I
-Landroid/util/StatsLogInternal;->TEMPERATURE__SENSOR_LOCATION__TEMPERATURE_TYPE_UNKNOWN:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_BACKUP:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_BOUND_FOREGROUND_SERVICE:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_CACHED_ACTIVITY:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_CACHED_ACTIVITY_CLIENT:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_CACHED_EMPTY:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_CACHED_RECENT:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_FOREGROUND_SERVICE:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_HEAVY_WEIGHT:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_HOME:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_IMPORTANT_BACKGROUND:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_IMPORTANT_FOREGROUND:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_LAST_ACTIVITY:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_NONEXISTENT:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_PERSISTENT:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_PERSISTENT_UI:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_RECEIVER:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_SERVICE:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_TOP:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_TOP_SLEEPING:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_TRANSIENT_BACKGROUND:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_UNKNOWN:I
-Landroid/util/StatsLogInternal;->UID_PROCESS_STATE_CHANGED__STATE__PROCESS_STATE_UNKNOWN_TO_PROTO:I
-Landroid/util/StatsLogInternal;->USB_CONNECTOR_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->USB_CONNECTOR_STATE_CHANGED__STATE__CONNECTED:I
-Landroid/util/StatsLogInternal;->USB_CONNECTOR_STATE_CHANGED__STATE__DISCONNECTED:I
-Landroid/util/StatsLogInternal;->USB_DEVICE_ATTACHED:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__LEVEL__DOZE_WAKE_LOCK:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__LEVEL__DRAW_WAKE_LOCK:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__LEVEL__FULL_WAKE_LOCK:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__LEVEL__PARTIAL_WAKE_LOCK:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__LEVEL__PROXIMITY_SCREEN_OFF_WAKE_LOCK:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__LEVEL__SCREEN_BRIGHT_WAKE_LOCK:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__LEVEL__SCREEN_DIM_WAKE_LOCK:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__STATE__ACQUIRE:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__STATE__CHANGE_ACQUIRE:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__STATE__CHANGE_RELEASE:I
-Landroid/util/StatsLogInternal;->WAKELOCK_STATE_CHANGED__STATE__RELEASE:I
-Landroid/util/StatsLogInternal;->WAKEUP_ALARM_OCCURRED:I
-Landroid/util/StatsLogInternal;->WIFI_ACTIVITY_INFO:I
-Landroid/util/StatsLogInternal;->WIFI_BYTES_TRANSFER:I
-Landroid/util/StatsLogInternal;->WIFI_BYTES_TRANSFER_BY_FG_BG:I
-Landroid/util/StatsLogInternal;->WIFI_LOCK_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->WIFI_LOCK_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->WIFI_LOCK_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->WIFI_MULTICAST_LOCK_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->WIFI_MULTICAST_LOCK_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->WIFI_MULTICAST_LOCK_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->WIFI_RADIO_POWER_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->WIFI_RADIO_POWER_STATE_CHANGED__STATE__DATA_CONNECTION_POWER_STATE_HIGH:I
-Landroid/util/StatsLogInternal;->WIFI_RADIO_POWER_STATE_CHANGED__STATE__DATA_CONNECTION_POWER_STATE_LOW:I
-Landroid/util/StatsLogInternal;->WIFI_RADIO_POWER_STATE_CHANGED__STATE__DATA_CONNECTION_POWER_STATE_MEDIUM:I
-Landroid/util/StatsLogInternal;->WIFI_RADIO_POWER_STATE_CHANGED__STATE__DATA_CONNECTION_POWER_STATE_UNKNOWN:I
-Landroid/util/StatsLogInternal;->WIFI_SCAN_STATE_CHANGED:I
-Landroid/util/StatsLogInternal;->WIFI_SCAN_STATE_CHANGED__STATE__OFF:I
-Landroid/util/StatsLogInternal;->WIFI_SCAN_STATE_CHANGED__STATE__ON:I
-Landroid/util/StatsLogInternal;->WIFI_SIGNAL_STRENGTH_CHANGED:I
-Landroid/util/StatsLogInternal;->WIFI_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_GOOD:I
-Landroid/util/StatsLogInternal;->WIFI_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_GREAT:I
-Landroid/util/StatsLogInternal;->WIFI_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_MODERATE:I
-Landroid/util/StatsLogInternal;->WIFI_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_NONE_OR_UNKNOWN:I
-Landroid/util/StatsLogInternal;->WIFI_SIGNAL_STRENGTH_CHANGED__SIGNAL_STRENGTH__SIGNAL_STRENGTH_POOR:I
-Landroid/util/StatsLogInternal;->write(I)I
-Landroid/util/StatsLogInternal;->write(II)I
-Landroid/util/StatsLogInternal;->write(III)I
-Landroid/util/StatsLogInternal;->write(IIIFIIIIIIIIIIIIII)I
-Landroid/util/StatsLogInternal;->write(IIII)I
-Landroid/util/StatsLogInternal;->write(IIIIIIIII)I
-Landroid/util/StatsLogInternal;->write(IIIIJZ)I
-Landroid/util/StatsLogInternal;->write(IIIJ)I
-Landroid/util/StatsLogInternal;->write(IIIZZ)I
-Landroid/util/StatsLogInternal;->write(IIIZZZ)I
-Landroid/util/StatsLogInternal;->write(IIJ)I
-Landroid/util/StatsLogInternal;->write(IIJJ)I
-Landroid/util/StatsLogInternal;->write(IIJJJJ)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;IJJJJJ)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;ILjava/lang/String;)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;III)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;ILjava/lang/String;Ljava/lang/String;ZJIIIIILjava/lang/String;II)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;ILjava/lang/String;ZJ)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;Ljava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;Ljava/lang/String;ILjava/lang/String;II)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;Ljava/lang/String;JJJJJ)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;II)I
-Landroid/util/StatsLogInternal;->write(IILjava/lang/String;ZI)I
-Landroid/util/StatsLogInternal;->write(IIZJJJJ)I
-Landroid/util/StatsLogInternal;->write(IJ)I
-Landroid/util/StatsLogInternal;->write(IJIJJJJ)I
-Landroid/util/StatsLogInternal;->write(IJJJ)I
-Landroid/util/StatsLogInternal;->write(IJJJJJJJJJJ)I
-Landroid/util/StatsLogInternal;->write(ILjava/lang/String;IIJ)I
-Landroid/util/StatsLogInternal;->write(ILjava/lang/String;J)I
-Landroid/util/StatsLogInternal;->write(ILjava/lang/String;Ljava/lang/String;JJ)I
-Landroid/util/StatsLogInternal;->write(ILjava/lang/String;Ljava/lang/String;JJJJ)I
-Landroid/util/StatsLogInternal;->write(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZII)I
-Landroid/util/StatsLogInternal;->write(IZLjava/lang/String;JJ)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;II)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;IILjava/lang/String;)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;ILjava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;IZZZ)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;Ljava/lang/String;)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;Ljava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;Ljava/lang/String;II)I
-Landroid/util/StatsLogInternal;->write(I[I[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;II)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;IILjava/lang/String;)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;ILjava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;IZZZ)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;Ljava/lang/String;)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;Ljava/lang/String;I)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;Ljava/lang/String;II)I
-Landroid/util/StatsLogInternal;->write_non_chained(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I
-Landroid/util/StatsLogInternal;->WTF_OCCURRED:I
 Landroid/util/StringBuilderPrinter;->mBuilder:Ljava/lang/StringBuilder;
 Landroid/util/SuperNotCalledException;-><init>(Ljava/lang/String;)V
 Landroid/util/TextLogEntry;-><init>()V
diff --git a/boot/hiddenapi/hiddenapi-max-target-r-loprio.txt b/boot/hiddenapi/hiddenapi-max-target-r-loprio.txt
index 753bc69b..79d2521 100644
--- a/boot/hiddenapi/hiddenapi-max-target-r-loprio.txt
+++ b/boot/hiddenapi/hiddenapi-max-target-r-loprio.txt
@@ -23,8 +23,6 @@
 Landroid/net/INetworkPolicyListener$Stub;-><init>()V
 Landroid/net/nsd/INsdManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/nsd/INsdManager;
 Landroid/net/sip/ISipSession$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/sip/ISipSession;
-Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getScanResults:I
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/p2p/IWifiP2pManager;
 Landroid/nfc/INfcAdapter$Stub;->TRANSACTION_enable:I
 Landroid/os/IPowerManager$Stub;->TRANSACTION_acquireWakeLock:I
 Landroid/os/IPowerManager$Stub;->TRANSACTION_goToSleep:I
diff --git a/boot/hiddenapi/hiddenapi-unsupported.txt b/boot/hiddenapi/hiddenapi-unsupported.txt
index 4281b0d..002d42d 100644
--- a/boot/hiddenapi/hiddenapi-unsupported.txt
+++ b/boot/hiddenapi/hiddenapi-unsupported.txt
@@ -167,28 +167,12 @@
 Landroid/media/IMediaScannerService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaScannerService;
 Landroid/media/session/ISessionManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/session/ISessionManager;
 Landroid/media/tv/ITvRemoteProvider$Stub;-><init>()V
-Landroid/net/IConnectivityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveLinkProperties()Landroid/net/LinkProperties;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveNetworkInfo()Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getAllNetworkInfo()[Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getAllNetworks()[Landroid/net/Network;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableIfaces()[Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableUsbRegexs()[Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->getTetheredIfaces()[Ljava/lang/String;
-Landroid/net/IConnectivityManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/IConnectivityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/IConnectivityManager;
 Landroid/net/INetworkManagementEventObserver$Stub;-><init>()V
 Landroid/net/INetworkPolicyManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkPolicyManager;
 Landroid/net/INetworkScoreService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkScoreService;
 Landroid/net/INetworkStatsService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 Landroid/net/INetworkStatsService$Stub$Proxy;->getMobileIfaces()[Ljava/lang/String;
 Landroid/net/INetworkStatsService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkStatsService;
-Landroid/net/wifi/IWifiManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/IWifiManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/IWifiManager;
-Landroid/net/wifi/IWifiScanner$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/net/wifi/IWifiScanner$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/net/wifi/IWifiScanner$Stub;-><init>()V
-Landroid/net/wifi/IWifiScanner$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/IWifiScanner;
 Landroid/os/IBatteryPropertiesRegistrar$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 Landroid/os/IDeviceIdentifiersPolicyService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IDeviceIdentifiersPolicyService;
 Landroid/os/IDeviceIdleController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IDeviceIdleController;
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 4182ac3..034ad8e 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -36,6 +36,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.UserIdInt;
 import android.app.assist.AssistContent;
 import android.app.assist.AssistStructure;
 import android.app.backup.BackupAgent;
@@ -61,6 +62,7 @@
 import android.content.ContentProvider;
 import android.content.ContentResolver;
 import android.content.Context;
+import android.content.Context.CreatePackageOptions;
 import android.content.IContentProvider;
 import android.content.IIntentReceiver;
 import android.content.Intent;
@@ -71,6 +73,7 @@
 import android.content.pm.InstrumentationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.ApplicationInfoFlags;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ParceledListSlice;
 import android.content.pm.PermissionInfo;
@@ -218,8 +221,6 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.lang.ref.Reference;
-import java.lang.ref.ReferenceQueue;
 import java.lang.ref.WeakReference;
 import java.lang.reflect.Method;
 import java.net.InetAddress;
@@ -230,7 +231,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -419,16 +419,6 @@
     @GuardedBy("mResourcesManager")
     @UnsupportedAppUsage
     final ArrayMap<String, WeakReference<LoadedApk>> mResourcePackages = new ArrayMap<>();
-
-    @GuardedBy("mResourcesManager")
-    private final ArrayMap<List<String>, WeakReference<LoadedApk>> mPackageNonAMS =
-            new ArrayMap<>();
-    @GuardedBy("mResourcesManager")
-    private final ArrayMap<List<String>, WeakReference<LoadedApk>> mResourcePackagesNonAMS =
-            new ArrayMap<>();
-    @GuardedBy("mResourcesManager")
-    private final ReferenceQueue<LoadedApk> mPackageRefQueue = new ReferenceQueue<>();
-
     @GuardedBy("mResourcesManager")
     final ArrayList<ActivityClientRecord> mRelaunchingActivities = new ArrayList<>();
     @GuardedBy("mResourcesManager")
@@ -1182,7 +1172,6 @@
         }
 
         public void scheduleApplicationInfoChanged(ApplicationInfo ai) {
-            mResourcesManager.updatePendingAppInfoUpdates(ai);
             mH.removeMessages(H.APPLICATION_INFO_CHANGED, ai);
             sendMessage(H.APPLICATION_INFO_CHANGED, ai);
         }
@@ -2385,281 +2374,72 @@
         return mH;
     }
 
-    /**
-     * If {@code retainReferences} is false, prunes all {@link LoadedApk} representing any of the
-     * specified packages from the package caches.
-     *
-     * @return whether the cache contains a loaded apk representing any of the specified packages
-     */
-    private boolean clearCachedApks() {
-        synchronized (mResourcesManager) {
-            Reference<? extends LoadedApk> enqueuedRef = mPackageRefQueue.poll();
-            if (enqueuedRef == null) {
-                return false;
-            }
-
-            final HashSet<Reference<? extends LoadedApk>> deadReferences = new HashSet<>();
-            for (; enqueuedRef != null; enqueuedRef = mPackageRefQueue.poll()) {
-                deadReferences.add(enqueuedRef);
-            }
-
-            return cleanWeakMapValues(mPackages, deadReferences)
-                    || cleanWeakMapValues(mResourcePackages, deadReferences)
-                    || cleanWeakMapValues(mPackageNonAMS, deadReferences)
-                    || cleanWeakMapValues(mResourcePackages, deadReferences);
-        }
-    }
-
-    private static <K> boolean cleanWeakMapValues(ArrayMap<K, WeakReference<LoadedApk>> map,
-            HashSet<Reference<? extends LoadedApk>> deadReferences) {
-        boolean hasPkgInfo = false;
-        for (int i = map.size() - 1; i >= 0; i--) {
-            if (deadReferences.contains(map.valueAt(i))) {
-                map.removeAt(i);
-                hasPkgInfo = true;
-            }
-        }
-        return hasPkgInfo;
-    }
-
-    /**
-     * Retrieves the previously cached {@link LoadedApk} that was created/updated with the most
-     * recent {@link ApplicationInfo} sent from the activity manager service.
-     */
-    @Nullable
-    private LoadedApk peekLatestCachedApkFromAMS(@NonNull String packageName, boolean includeCode) {
-        synchronized (mResourcesManager) {
-            WeakReference<LoadedApk> ref;
-            if (includeCode) {
-                return ((ref = mPackages.get(packageName)) != null) ? ref.get() : null;
-            } else {
-                return ((ref = mResourcePackages.get(packageName)) != null) ? ref.get() : null;
-            }
-        }
-    }
-
-    /**
-     * Updates the previously cached {@link LoadedApk} that was created/updated using an
-     * {@link ApplicationInfo} sent from activity manager service.
-     *
-     * If {@code appInfo} is null, the most up-to-date {@link ApplicationInfo} will be fetched and
-     * used to update the cached package; otherwise, the specified app info will be used.
-     */
-    private boolean updateLatestCachedApkFromAMS(@NonNull String packageName,
-            @Nullable ApplicationInfo appInfo, boolean updateActivityRecords) {
-        final LoadedApk[] loadedPackages = new LoadedApk[]{
-                peekLatestCachedApkFromAMS(packageName, true),
-                peekLatestCachedApkFromAMS(packageName, false)
-        };
-
-        try {
-            if (appInfo == null) {
-                appInfo = sPackageManager.getApplicationInfo(
-                        packageName, PackageManager.GET_SHARED_LIBRARY_FILES,
-                        UserHandle.myUserId());
-            }
-        } catch (RemoteException e) {
-            Slog.v(TAG, "Failed to get most recent app info for '" + packageName + "'", e);
-            return false;
-        }
-
-        boolean hasPackage = false;
-        final String[] oldResDirs = new String[loadedPackages.length];
-        for (int i = loadedPackages.length - 1; i >= 0; i--) {
-            final LoadedApk loadedPackage = loadedPackages[i];
-            if (loadedPackage == null) {
-                continue;
-            }
-
-            // If the package is being updated, yet it still has a valid LoadedApk object, the
-            // package was updated with PACKAGE_REMOVED_DONT_KILL. Adjust it's internal references
-            // to the application info and resources.
-            hasPackage = true;
-            if (updateActivityRecords && mActivities.size() > 0) {
-                for (ActivityClientRecord ar : mActivities.values()) {
-                    if (ar.activityInfo.applicationInfo.packageName.equals(packageName)) {
-                        ar.activityInfo.applicationInfo = appInfo;
-                        ar.packageInfo = loadedPackage;
-                    }
-                }
-            }
-
-            updateLoadedApk(loadedPackage, appInfo);
-            oldResDirs[i] = loadedPackage.getResDir();
-        }
-        if (hasPackage) {
-            synchronized (mResourcesManager) {
-                mResourcesManager.applyNewResourceDirs(appInfo, oldResDirs);
-            }
-        }
-        return hasPackage;
-    }
-
-    private static List<String> makeNonAMSKey(@NonNull ApplicationInfo appInfo) {
-        final List<String> paths = new ArrayList<>();
-        paths.add(appInfo.sourceDir);
-        if (appInfo.resourceDirs != null) {
-            for (String path : appInfo.resourceDirs) {
-                paths.add(path);
-            }
-        }
-        return paths;
-    }
-
-    /**
-     * Retrieves the previously cached {@link LoadedApk}.
-     *
-     * If {@code isAppInfoFromAMS} is true, then {@code appInfo} will be used to update the paths
-     * of the previously cached {@link LoadedApk} that was created/updated using an
-     * {@link ApplicationInfo} sent from activity manager service.
-     */
-    @Nullable
-    private LoadedApk retrieveCachedApk(@NonNull ApplicationInfo appInfo, boolean includeCode,
-            boolean isAppInfoFromAMS) {
-        if (UserHandle.myUserId() != UserHandle.getUserId(appInfo.uid)) {
-            // Caching not supported across users.
-            return null;
-        }
-
-        if (isAppInfoFromAMS) {
-            LoadedApk loadedPackage = peekLatestCachedApkFromAMS(appInfo.packageName, includeCode);
-            if (loadedPackage != null) {
-                updateLoadedApk(loadedPackage, appInfo);
-            }
-            return loadedPackage;
-        }
-
-        synchronized (mResourcesManager) {
-            WeakReference<LoadedApk> ref;
-            if (includeCode) {
-                return ((ref = mPackageNonAMS.get(makeNonAMSKey(appInfo))) != null)
-                        ? ref.get() : null;
-            } else {
-                return ((ref = mResourcePackagesNonAMS.get(makeNonAMSKey(appInfo))) != null)
-                        ? ref.get() : null;
-            }
-        }
-    }
-
-    private static boolean isLoadedApkResourceDirsUpToDate(LoadedApk loadedApk,
-            ApplicationInfo appInfo) {
-        boolean baseDirsUpToDate = loadedApk.getResDir().equals(appInfo.sourceDir);
-        boolean resourceDirsUpToDate = Arrays.equals(
-                ArrayUtils.defeatNullable(appInfo.resourceDirs),
-                ArrayUtils.defeatNullable(loadedApk.getOverlayDirs()));
-        boolean overlayPathsUpToDate = Arrays.equals(
-                ArrayUtils.defeatNullable(appInfo.overlayPaths),
-                ArrayUtils.defeatNullable(loadedApk.getOverlayPaths()));
-
-        return (loadedApk.mResources == null || loadedApk.mResources.getAssets().isUpToDate())
-                && baseDirsUpToDate && resourceDirsUpToDate && overlayPathsUpToDate;
-    }
-
-    private void updateLoadedApk(@NonNull LoadedApk loadedPackage,
-            @NonNull ApplicationInfo appInfo) {
-        if (isLoadedApkResourceDirsUpToDate(loadedPackage, appInfo)) {
-            return;
-        }
-
-        final List<String> oldPaths = new ArrayList<>();
-        LoadedApk.makePaths(this, appInfo, oldPaths);
-        loadedPackage.updateApplicationInfo(appInfo, oldPaths);
-    }
-
-    @Nullable
-    private LoadedApk createLoadedPackage(@NonNull ApplicationInfo appInfo,
-            @Nullable CompatibilityInfo compatInfo, @Nullable ClassLoader baseLoader,
-            boolean securityViolation, boolean includeCode, boolean registerPackage,
-            boolean isAppInfoFromAMS) {
-        final LoadedApk packageInfo =
-                new LoadedApk(this, appInfo, compatInfo, baseLoader,
-                        securityViolation, includeCode
-                        && (appInfo.flags & ApplicationInfo.FLAG_HAS_CODE) != 0, registerPackage);
-
-        if (mSystemThread && "android".equals(appInfo.packageName)) {
-            packageInfo.installSystemApplicationInfo(appInfo,
-                    getSystemContext().mPackageInfo.getClassLoader());
-        }
-
-        if (UserHandle.myUserId() != UserHandle.getUserId(appInfo.uid)) {
-            // Caching not supported across users
-            return packageInfo;
-        }
-
-        synchronized (mResourcesManager) {
-            if (includeCode) {
-                if (isAppInfoFromAMS) {
-                    mPackages.put(appInfo.packageName,
-                            new WeakReference<>(packageInfo, mPackageRefQueue));
-                } else {
-                    mPackageNonAMS.put(makeNonAMSKey(appInfo),
-                            new WeakReference<>(packageInfo, mPackageRefQueue));
-                }
-            } else {
-                if (isAppInfoFromAMS) {
-                    mResourcePackages.put(appInfo.packageName,
-                            new WeakReference<>(packageInfo, mPackageRefQueue));
-                } else {
-                    mResourcePackagesNonAMS.put(makeNonAMSKey(appInfo),
-                            new WeakReference<>(packageInfo, mPackageRefQueue));
-                }
-            }
-            return packageInfo;
-        }
-    }
-
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
     public final LoadedApk getPackageInfo(String packageName, CompatibilityInfo compatInfo,
-            int flags) {
+            @CreatePackageOptions int flags) {
         return getPackageInfo(packageName, compatInfo, flags, UserHandle.myUserId());
     }
 
     public final LoadedApk getPackageInfo(String packageName, CompatibilityInfo compatInfo,
-            int flags, int userId) {
-        final ApplicationInfo ai = PackageManager.getApplicationInfoAsUserCached(
+            @CreatePackageOptions int flags, @UserIdInt int userId) {
+        return getPackageInfo(packageName, compatInfo, flags, userId, 0 /* packageFlags */);
+    }
+
+    public final LoadedApk getPackageInfo(String packageName, CompatibilityInfo compatInfo,
+            @CreatePackageOptions int flags, @UserIdInt int userId,
+            @ApplicationInfoFlags int packageFlags) {
+        final boolean differentUser = (UserHandle.myUserId() != userId);
+        ApplicationInfo ai = PackageManager.getApplicationInfoAsUserCached(
                 packageName,
-                PackageManager.GET_SHARED_LIBRARY_FILES
+                packageFlags | PackageManager.GET_SHARED_LIBRARY_FILES
                 | PackageManager.MATCH_DEBUG_TRIAGED_MISSING,
                 (userId < 0) ? UserHandle.myUserId() : userId);
-        LoadedApk packageInfo = null;
-        if (ai != null) {
-            packageInfo = retrieveCachedApk(ai,
-                    (flags & Context.CONTEXT_INCLUDE_CODE) != 0,
-                    false);
-        }
-
-        if (packageInfo != null) {
-            if (packageInfo.isSecurityViolation()
-                    && (flags & Context.CONTEXT_IGNORE_SECURITY) == 0) {
-                throw new SecurityException(
-                        "Requesting code from " + packageName
-                                + " to be run in process "
-                                + mBoundApplication.processName
-                                + "/" + mBoundApplication.appInfo.uid);
+        synchronized (mResourcesManager) {
+            WeakReference<LoadedApk> ref;
+            if (differentUser) {
+                // Caching not supported across users
+                ref = null;
+            } else if ((flags & Context.CONTEXT_INCLUDE_CODE) != 0) {
+                ref = mPackages.get(packageName);
+            } else {
+                ref = mResourcePackages.get(packageName);
             }
-            return packageInfo;
+
+            LoadedApk packageInfo = ref != null ? ref.get() : null;
+            if (ai != null && packageInfo != null) {
+                if (!isLoadedApkResourceDirsUpToDate(packageInfo, ai)) {
+                    List<String> oldPaths = new ArrayList<>();
+                    LoadedApk.makePaths(this, ai, oldPaths);
+                    packageInfo.updateApplicationInfo(ai, oldPaths);
+                }
+
+                if (packageInfo.isSecurityViolation()
+                        && (flags&Context.CONTEXT_IGNORE_SECURITY) == 0) {
+                    throw new SecurityException(
+                            "Requesting code from " + packageName
+                            + " to be run in process "
+                            + mBoundApplication.processName
+                            + "/" + mBoundApplication.appInfo.uid);
+                }
+                return packageInfo;
+            }
         }
 
-        return ai == null ? null : getPackageInfo(ai, compatInfo, flags, false);
+        if (ai != null) {
+            return getPackageInfo(ai, compatInfo, flags);
+        }
+
+        return null;
     }
 
-    /**
-     * @deprecated Use {@link #getPackageInfo(ApplicationInfo, CompatibilityInfo, int, boolean)}
-     * instead.
-     */
-    @Deprecated
     @UnsupportedAppUsage(trackingBug = 171933273)
     public final LoadedApk getPackageInfo(ApplicationInfo ai, CompatibilityInfo compatInfo,
-            int flags) {
-        return getPackageInfo(ai, compatInfo, flags, true);
-    }
-
-    public final LoadedApk getPackageInfo(ApplicationInfo ai, CompatibilityInfo compatInfo,
-            @Context.CreatePackageOptions int flags, boolean isAppInfoFromAMS) {
+            @CreatePackageOptions int flags) {
         boolean includeCode = (flags&Context.CONTEXT_INCLUDE_CODE) != 0;
         boolean securityViolation = includeCode && ai.uid != 0
-                && ai.uid != Process.SYSTEM_UID && (mBoundApplication == null
-                || !UserHandle.isSameApp(ai.uid, mBoundApplication.appInfo.uid));
+                && ai.uid != Process.SYSTEM_UID && (mBoundApplication != null
+                        ? !UserHandle.isSameApp(ai.uid, mBoundApplication.appInfo.uid)
+                        : true);
         boolean registerPackage = includeCode && (flags&Context.CONTEXT_REGISTER_PACKAGE) != 0;
         if ((flags&(Context.CONTEXT_INCLUDE_CODE
                 |Context.CONTEXT_IGNORE_SECURITY))
@@ -2669,47 +2449,107 @@
                         + " (with uid " + ai.uid + ")";
                 if (mBoundApplication != null) {
                     msg = msg + " to be run in process "
-                            + mBoundApplication.processName + " (with uid "
-                            + mBoundApplication.appInfo.uid + ")";
+                        + mBoundApplication.processName + " (with uid "
+                        + mBoundApplication.appInfo.uid + ")";
                 }
                 throw new SecurityException(msg);
             }
         }
         return getPackageInfo(ai, compatInfo, null, securityViolation, includeCode,
-                registerPackage, isAppInfoFromAMS);
+                registerPackage);
     }
 
     @Override
     @UnsupportedAppUsage
     public final LoadedApk getPackageInfoNoCheck(ApplicationInfo ai,
             CompatibilityInfo compatInfo) {
-        return getPackageInfo(ai, compatInfo, null, false, true, false, true);
+        return getPackageInfo(ai, compatInfo, null, false, true, false);
     }
 
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
     public final LoadedApk peekPackageInfo(String packageName, boolean includeCode) {
         synchronized (mResourcesManager) {
-            return peekLatestCachedApkFromAMS(packageName, includeCode);
+            WeakReference<LoadedApk> ref;
+            if (includeCode) {
+                ref = mPackages.get(packageName);
+            } else {
+                ref = mResourcePackages.get(packageName);
+            }
+            return ref != null ? ref.get() : null;
         }
     }
 
     private LoadedApk getPackageInfo(ApplicationInfo aInfo, CompatibilityInfo compatInfo,
             ClassLoader baseLoader, boolean securityViolation, boolean includeCode,
-            boolean registerPackage, boolean isAppInfoFromAMS) {
-        LoadedApk packageInfo = retrieveCachedApk(aInfo, includeCode,
-                isAppInfoFromAMS);
-        if (packageInfo != null) {
+            boolean registerPackage) {
+        final boolean differentUser = (UserHandle.myUserId() != UserHandle.getUserId(aInfo.uid));
+        synchronized (mResourcesManager) {
+            WeakReference<LoadedApk> ref;
+            if (differentUser) {
+                // Caching not supported across users
+                ref = null;
+            } else if (includeCode) {
+                ref = mPackages.get(aInfo.packageName);
+            } else {
+                ref = mResourcePackages.get(aInfo.packageName);
+            }
+
+            LoadedApk packageInfo = ref != null ? ref.get() : null;
+
+            if (packageInfo != null) {
+                if (!isLoadedApkResourceDirsUpToDate(packageInfo, aInfo)) {
+                    List<String> oldPaths = new ArrayList<>();
+                    LoadedApk.makePaths(this, aInfo, oldPaths);
+                    packageInfo.updateApplicationInfo(aInfo, oldPaths);
+                }
+
+                return packageInfo;
+            }
+
+            if (localLOGV) {
+                Slog.v(TAG, (includeCode ? "Loading code package "
+                        : "Loading resource-only package ") + aInfo.packageName
+                        + " (in " + (mBoundApplication != null
+                        ? mBoundApplication.processName : null)
+                        + ")");
+            }
+
+            packageInfo =
+                    new LoadedApk(this, aInfo, compatInfo, baseLoader,
+                            securityViolation, includeCode
+                            && (aInfo.flags & ApplicationInfo.FLAG_HAS_CODE) != 0, registerPackage);
+
+            if (mSystemThread && "android".equals(aInfo.packageName)) {
+                packageInfo.installSystemApplicationInfo(aInfo,
+                        getSystemContext().mPackageInfo.getClassLoader());
+            }
+
+            if (differentUser) {
+                // Caching not supported across users
+            } else if (includeCode) {
+                mPackages.put(aInfo.packageName,
+                        new WeakReference<LoadedApk>(packageInfo));
+            } else {
+                mResourcePackages.put(aInfo.packageName,
+                        new WeakReference<LoadedApk>(packageInfo));
+            }
+
             return packageInfo;
         }
-        if (localLOGV) {
-            Slog.v(TAG, (includeCode ? "Loading code package "
-                    : "Loading resource-only package ") + aInfo.packageName
-                    + " (in " + (mBoundApplication != null
-                    ? mBoundApplication.processName : null)
-                    + ")");
-        }
-        return createLoadedPackage(aInfo, compatInfo, baseLoader,
-                securityViolation, includeCode, registerPackage, isAppInfoFromAMS);
+    }
+
+    private static boolean isLoadedApkResourceDirsUpToDate(LoadedApk loadedApk,
+            ApplicationInfo appInfo) {
+        Resources packageResources = loadedApk.mResources;
+        boolean resourceDirsUpToDate = Arrays.equals(
+                ArrayUtils.defeatNullable(appInfo.resourceDirs),
+                ArrayUtils.defeatNullable(loadedApk.getOverlayDirs()));
+        boolean overlayPathsUpToDate = Arrays.equals(
+                ArrayUtils.defeatNullable(appInfo.overlayPaths),
+                ArrayUtils.defeatNullable(loadedApk.getOverlayPaths()));
+
+        return (packageResources == null || packageResources.getAssets().isUpToDate())
+                && resourceDirsUpToDate && overlayPathsUpToDate;
     }
 
     @UnsupportedAppUsage
@@ -3671,7 +3511,7 @@
         ActivityInfo aInfo = r.activityInfo;
         if (r.packageInfo == null) {
             r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,
-                    Context.CONTEXT_INCLUDE_CODE, true);
+                    Context.CONTEXT_INCLUDE_CODE);
         }
 
         ComponentName component = r.intent.getComponent();
@@ -6154,10 +5994,40 @@
 
     @VisibleForTesting(visibility = PACKAGE)
     public void handleApplicationInfoChanged(@NonNull final ApplicationInfo ai) {
-        // Updates triggered by package installation go through a package update receiver. Here we
-        // try to capture ApplicationInfo changes that are caused by other sources, such as
-        // overlays. That means we want to be as conservative about code changes as possible.
-        updateLatestCachedApkFromAMS(ai.packageName, ai, false);
+        // Updates triggered by package installation go through a package update
+        // receiver. Here we try to capture ApplicationInfo changes that are
+        // caused by other sources, such as overlays. That means we want to be as conservative
+        // about code changes as possible. Take the diff of the old ApplicationInfo and the new
+        // to see if anything needs to change.
+        LoadedApk apk;
+        LoadedApk resApk;
+        // Update all affected loaded packages with new package information
+        synchronized (mResourcesManager) {
+            WeakReference<LoadedApk> ref = mPackages.get(ai.packageName);
+            apk = ref != null ? ref.get() : null;
+            ref = mResourcePackages.get(ai.packageName);
+            resApk = ref != null ? ref.get() : null;
+        }
+
+        final String[] oldResDirs = new String[2];
+
+        if (apk != null) {
+            oldResDirs[0] = apk.getResDir();
+            final ArrayList<String> oldPaths = new ArrayList<>();
+            LoadedApk.makePaths(this, apk.getApplicationInfo(), oldPaths);
+            apk.updateApplicationInfo(ai, oldPaths);
+        }
+        if (resApk != null) {
+            oldResDirs[1] = resApk.getResDir();
+            final ArrayList<String> oldPaths = new ArrayList<>();
+            LoadedApk.makePaths(this, resApk.getApplicationInfo(), oldPaths);
+            resApk.updateApplicationInfo(ai, oldPaths);
+        }
+
+        synchronized (mResourcesManager) {
+            // Update all affected Resources objects to use new ResourcesImpl
+            mResourcesManager.applyNewResourceDirs(ai, oldResDirs);
+        }
     }
 
     /**
@@ -6334,7 +6204,29 @@
             case ApplicationThreadConstants.PACKAGE_REMOVED:
             case ApplicationThreadConstants.PACKAGE_REMOVED_DONT_KILL:
             {
-                hasPkgInfo = clearCachedApks();
+                final boolean killApp = cmd == ApplicationThreadConstants.PACKAGE_REMOVED;
+                if (packages == null) {
+                    break;
+                }
+                synchronized (mResourcesManager) {
+                    for (int i = packages.length - 1; i >= 0; i--) {
+                        if (!hasPkgInfo) {
+                            WeakReference<LoadedApk> ref = mPackages.get(packages[i]);
+                            if (ref != null && ref.get() != null) {
+                                hasPkgInfo = true;
+                            } else {
+                                ref = mResourcePackages.get(packages[i]);
+                                if (ref != null && ref.get() != null) {
+                                    hasPkgInfo = true;
+                                }
+                            }
+                        }
+                        if (killApp) {
+                            mPackages.remove(packages[i]);
+                            mResourcePackages.remove(packages[i]);
+                        }
+                    }
+                }
                 break;
             }
             case ApplicationThreadConstants.PACKAGE_REPLACED:
@@ -6342,19 +6234,68 @@
                 if (packages == null) {
                     break;
                 }
-                final List<String> packagesHandled = new ArrayList<>();
-                for (int i = packages.length - 1; i >= 0; i--) {
-                    final String packageName = packages[i];
-                    if (updateLatestCachedApkFromAMS(packageName, null, true)) {
-                        hasPkgInfo = true;
-                        packagesHandled.add(packageName);
+
+                List<String> packagesHandled = new ArrayList<>();
+
+                synchronized (mResourcesManager) {
+                    for (int i = packages.length - 1; i >= 0; i--) {
+                        String packageName = packages[i];
+                        WeakReference<LoadedApk> ref = mPackages.get(packageName);
+                        LoadedApk pkgInfo = ref != null ? ref.get() : null;
+                        if (pkgInfo != null) {
+                            hasPkgInfo = true;
+                        } else {
+                            ref = mResourcePackages.get(packageName);
+                            pkgInfo = ref != null ? ref.get() : null;
+                            if (pkgInfo != null) {
+                                hasPkgInfo = true;
+                            }
+                        }
+                        // If the package is being replaced, yet it still has a valid
+                        // LoadedApk object, the package was updated with _DONT_KILL.
+                        // Adjust it's internal references to the application info and
+                        // resources.
+                        if (pkgInfo != null) {
+                            packagesHandled.add(packageName);
+                            try {
+                                final ApplicationInfo aInfo =
+                                        sPackageManager.getApplicationInfo(
+                                                packageName,
+                                                PackageManager.GET_SHARED_LIBRARY_FILES,
+                                                UserHandle.myUserId());
+
+                                if (mActivities.size() > 0) {
+                                    for (ActivityClientRecord ar : mActivities.values()) {
+                                        if (ar.activityInfo.applicationInfo.packageName
+                                                .equals(packageName)) {
+                                            ar.activityInfo.applicationInfo = aInfo;
+                                            ar.packageInfo = pkgInfo;
+                                        }
+                                    }
+                                }
+
+                                final String[] oldResDirs = { pkgInfo.getResDir() };
+
+                                final ArrayList<String> oldPaths = new ArrayList<>();
+                                LoadedApk.makePaths(this, pkgInfo.getApplicationInfo(), oldPaths);
+                                pkgInfo.updateApplicationInfo(aInfo, oldPaths);
+
+                                synchronized (mResourcesManager) {
+                                    // Update affected Resources objects to use new ResourcesImpl
+                                    mResourcesManager.applyNewResourceDirs(aInfo, oldResDirs);
+                                }
+                            } catch (RemoteException e) {
+                            }
+                        }
                     }
                 }
+
                 try {
                     getPackageManager().notifyPackagesReplacedReceived(
                             packagesHandled.toArray(new String[0]));
                 } catch (RemoteException ignored) {
                 }
+
                 break;
             }
         }
@@ -6913,7 +6854,7 @@
         ii.copyTo(instrApp);
         instrApp.initForUser(UserHandle.myUserId());
         final LoadedApk pi = getPackageInfo(instrApp, data.compatInfo,
-                appContext.getClassLoader(), false, true, false, true);
+                appContext.getClassLoader(), false, true, false);
 
         // The test context's op package name == the target app's op package name, because
         // the app ops manager checks the op package name against the real calling UID,
diff --git a/core/java/android/app/AppOpsManagerInternal.java b/core/java/android/app/AppOpsManagerInternal.java
index 7c85df8..363b5a7 100644
--- a/core/java/android/app/AppOpsManagerInternal.java
+++ b/core/java/android/app/AppOpsManagerInternal.java
@@ -209,4 +209,10 @@
      */
     public abstract void setModeFromPermissionPolicy(int code, int uid, @NonNull String packageName,
             int mode, @Nullable IAppOpsCallback callback);
+
+
+    /**
+     * Sets a global restriction on an op code.
+     */
+    public abstract void setGlobalRestriction(int code, boolean restricted, IBinder token);
 }
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index d241968..16b6ea5 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -48,6 +48,7 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IPackageManager;
 import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.ApplicationInfoFlags;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.AssetManager;
 import android.content.res.CompatResources;
@@ -2461,7 +2462,7 @@
     public Context createApplicationContext(ApplicationInfo application, int flags)
             throws NameNotFoundException {
         LoadedApk pi = mMainThread.getPackageInfo(application, mResources.getCompatibilityInfo(),
-                flags | CONTEXT_REGISTER_PACKAGE, false);
+                flags | CONTEXT_REGISTER_PACKAGE);
         if (pi != null) {
             ContextImpl c = new ContextImpl(this, mMainThread, pi, ContextParams.EMPTY,
                     mAttributionSource.getAttributionTag(),
@@ -2493,6 +2494,13 @@
     @Override
     public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
             throws NameNotFoundException {
+        return createPackageContextAsUser(packageName, flags, user, 0 /* packageFlags */);
+    }
+
+    @Override
+    public Context createPackageContextAsUser(
+            @NonNull String packageName, @CreatePackageOptions int flags, @NonNull UserHandle user,
+            @ApplicationInfoFlags int packageFlags) throws PackageManager.NameNotFoundException {
         if (packageName.equals("system") || packageName.equals("android")) {
             // The system resources are loaded in every application, so we can safely copy
             // the context without reloading Resources.
@@ -2503,7 +2511,7 @@
         }
 
         LoadedApk pi = mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(),
-                flags | CONTEXT_REGISTER_PACKAGE, user.getIdentifier());
+                flags | CONTEXT_REGISTER_PACKAGE, user.getIdentifier(), packageFlags);
         if (pi != null) {
             ContextImpl c = new ContextImpl(this, mMainThread, pi, mParams,
                     mAttributionSource.getAttributionTag(),
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 6454d20..506dfe0 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -6344,10 +6344,11 @@
             ApplicationInfo applicationInfo = n.extras.getParcelable(
                     EXTRA_BUILDER_APPLICATION_INFO);
             Context builderContext;
-            if (applicationInfo != null) {
+            if (applicationInfo != null && applicationInfo.packageName != null) {
                 try {
-                    builderContext = context.createApplicationContext(applicationInfo,
-                            Context.CONTEXT_RESTRICTED);
+                    builderContext = context.createPackageContextAsUser(applicationInfo.packageName,
+                            Context.CONTEXT_RESTRICTED,
+                            UserHandle.getUserHandleForUid(applicationInfo.uid));
                 } catch (NameNotFoundException e) {
                     Log.e(TAG, "ApplicationInfo " + applicationInfo + " not found");
                     builderContext = context;  // try with our context
diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java
index dfd1e2b..e469b1f 100644
--- a/core/java/android/app/ResourcesManager.java
+++ b/core/java/android/app/ResourcesManager.java
@@ -98,12 +98,6 @@
     private int mResDisplayId = DEFAULT_DISPLAY;
 
     /**
-     * ApplicationInfo changes that need to be applied to Resources when the next configuration
-     * change occurs.
-     */
-    private ArrayList<ApplicationInfo> mPendingAppInfoUpdates;
-
-    /**
      * A mapping of ResourceImpls and their configurations. These are heavy weight objects
      * which should be reused as much as possible.
      */
@@ -994,7 +988,7 @@
      * @param classLoader The classloader to use for the Resources object.
      *                    If null, {@link ClassLoader#getSystemClassLoader()} is used.
      * @return A Resources object that gets updated when
-     *         {@link #applyConfigurationToResources(Configuration, CompatibilityInfo)}
+     *         {@link #applyConfigurationToResourcesLocked(Configuration, CompatibilityInfo)}
      *         is called.
      */
     @Nullable
@@ -1121,8 +1115,8 @@
     /**
      * Updates an Activity's Resources object with overrideConfig. The Resources object
      * that was previously returned by {@link #getResources(IBinder, String, String[], String[],
-     * String[], String[], Integer, Configuration, CompatibilityInfo, ClassLoader, List)} is still
-     * valid and will have the updated configuration.
+     * String[], Integer, Configuration, CompatibilityInfo, ClassLoader, List)} is still valid and
+     * will have the updated configuration.
      *
      * @param activityToken The Activity token.
      * @param overrideConfig The configuration override to update.
@@ -1273,22 +1267,6 @@
         return newKey;
     }
 
-    public void updatePendingAppInfoUpdates(@NonNull ApplicationInfo appInfo) {
-        synchronized (mLock) {
-            if (mPendingAppInfoUpdates == null) {
-                mPendingAppInfoUpdates = new ArrayList<>();
-            }
-            // Clear previous app info changes for the package to prevent multiple ResourcesImpl
-            // recreations when only the last recreation will be used.
-            for (int i = mPendingAppInfoUpdates.size() - 1; i >= 0; i--) {
-                if (appInfo.sourceDir.equals(mPendingAppInfoUpdates.get(i).sourceDir)) {
-                    mPendingAppInfoUpdates.remove(i);
-                }
-            }
-            mPendingAppInfoUpdates.add(appInfo);
-        }
-    }
-
     public final boolean applyConfigurationToResources(@NonNull Configuration config,
             @Nullable CompatibilityInfo compat) {
         return applyConfigurationToResources(config, compat, null /* adjustments */);
@@ -1302,18 +1280,7 @@
                 Trace.traceBegin(Trace.TRACE_TAG_RESOURCES,
                         "ResourcesManager#applyConfigurationToResources");
 
-                final boolean assetsUpdated = mPendingAppInfoUpdates != null
-                        && config.assetsSeq > mResConfiguration.assetsSeq;
-                if (assetsUpdated) {
-                    for (int i = 0, n = mPendingAppInfoUpdates.size(); i < n; i++) {
-                        final ApplicationInfo appInfo = mPendingAppInfoUpdates.get(i);
-                        applyNewResourceDirs(appInfo, new String[]{appInfo.sourceDir});
-                    }
-                    mPendingAppInfoUpdates = null;
-                }
-
-                if (!assetsUpdated && !mResConfiguration.isOtherSeqNewer(config)
-                        && compat == null) {
+                if (!mResConfiguration.isOtherSeqNewer(config) && compat == null) {
                     if (DEBUG || DEBUG_CONFIGURATION) {
                         Slog.v(TAG, "Skipping new config: curSeq="
                                 + mResConfiguration.seq + ", newSeq=" + config.seq);
@@ -1353,7 +1320,7 @@
                     }
                 }
 
-                return assetsUpdated || changes != 0;
+                return changes != 0;
             } finally {
                 Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
             }
diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java
index ba3fc1e..3b11a19 100644
--- a/core/java/android/appwidget/AppWidgetHostView.java
+++ b/core/java/android/appwidget/AppWidgetHostView.java
@@ -37,6 +37,7 @@
 import android.os.Bundle;
 import android.os.CancellationSignal;
 import android.os.Parcelable;
+import android.os.UserHandle;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.Pair;
@@ -718,9 +719,10 @@
     protected Context getRemoteContext() {
         try {
             // Return if cloned successfully, otherwise default
-            Context newContext = mContext.createApplicationContext(
-                    mInfo.providerInfo.applicationInfo,
-                    Context.CONTEXT_RESTRICTED);
+            final ApplicationInfo info = mInfo.providerInfo.applicationInfo;
+            Context newContext = mContext.createPackageContextAsUser(info.packageName,
+                    Context.CONTEXT_RESTRICTED,
+                    UserHandle.getUserHandleForUid(info.uid));
             if (mColorResources != null) {
                 mColorResources.apply(newContext);
             }
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index c02dcfd..9c60f43 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -46,6 +46,7 @@
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.ApplicationInfoFlags;
 import android.content.res.AssetManager;
 import android.content.res.ColorStateList;
 import android.content.res.Configuration;
@@ -6268,6 +6269,23 @@
     }
 
     /**
+     * Similar to {@link #createPackageContextAsUser(String, int, UserHandle)}, but also allows
+     * specifying the flags used to retrieve the {@link ApplicationInfo} of the package.
+     *
+     * @hide
+     */
+    @NonNull
+    public Context createPackageContextAsUser(
+            @NonNull String packageName, @CreatePackageOptions int flags, @NonNull UserHandle user,
+            @ApplicationInfoFlags int packageFlags)
+            throws PackageManager.NameNotFoundException {
+        if (Build.IS_ENG) {
+            throw new IllegalStateException("createPackageContextAsUser not overridden!");
+        }
+        return this;
+    }
+
+    /**
      * Similar to {@link #createPackageContext(String, int)}, but for the own package with a
      * different {@link UserHandle}. For example, {@link #getContentResolver()}
      * will open any {@link Uri} as the given user.
@@ -6286,10 +6304,18 @@
     /**
      * Creates a context given an {@link android.content.pm.ApplicationInfo}.
      *
+     * @deprecated use {@link #createPackageContextAsUser(String, int, UserHandle, int)}
+     *             If an application caches an ApplicationInfo and uses it to call this method,
+     *             the app will not get the most recent version of Runtime Resource Overlays for
+     *             that application. To make things worse, the LoadedApk stored in
+     *             {@code ActivityThread#mResourcePackages} is updated using the old ApplicationInfo
+     *             causing further uses of the cached LoadedApk to return outdated information.
+     *
      * @hide
      */
     @SuppressWarnings("HiddenAbstractMethod")
     @UnsupportedAppUsage
+    @Deprecated
     public abstract Context createApplicationContext(ApplicationInfo application,
             @CreatePackageOptions int flags) throws PackageManager.NameNotFoundException;
 
diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java
index 6324d0e..cf0dc8c 100644
--- a/core/java/android/content/ContextWrapper.java
+++ b/core/java/android/content/ContextWrapper.java
@@ -1009,6 +1009,14 @@
 
     /** @hide */
     @Override
+    public Context createPackageContextAsUser(String packageName, int flags, UserHandle user,
+            int packageFlags)
+            throws PackageManager.NameNotFoundException {
+        return mBase.createPackageContextAsUser(packageName, flags, user, packageFlags);
+    }
+
+    /** @hide */
+    @Override
     public Context createContextAsUser(UserHandle user, @CreatePackageOptions int flags) {
         return mBase.createContextAsUser(user, flags);
     }
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 688483a..9e35a32 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -5736,12 +5736,20 @@
     public static final String EXTRA_REPLACING = "android.intent.extra.REPLACING";
 
     /**
-     * Used as an int extra field in {@link android.app.AlarmManager} intents
+     * Used as an int extra field in {@link android.app.AlarmManager} pending intents
      * to tell the application being invoked how many pending alarms are being
-     * delievered with the intent.  For one-shot alarms this will always be 1.
+     * delivered with the intent.  For one-shot alarms this will always be 1.
      * For recurring alarms, this might be greater than 1 if the device was
      * asleep or powered off at the time an earlier alarm would have been
      * delivered.
+     *
+     * <p>Note: You must supply a <b>mutable</b> {@link android.app.PendingIntent} to
+     * {@code AlarmManager} while setting your alarms to be able to read this value on receiving
+     * them. <em>Mutability of pending intents must be explicitly specified by apps targeting
+     * {@link Build.VERSION_CODES#S} or higher</em>.
+     *
+     * @see android.app.PendingIntent#FLAG_MUTABLE
+     *
      */
     public static final String EXTRA_ALARM_COUNT = "android.intent.extra.ALARM_COUNT";
 
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 75dd9fb..3f8aedb 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -2111,28 +2111,28 @@
          * <p>
          * Defaults to {@link #USER_ACTION_UNSPECIFIED} unless otherwise set. When unspecified for
          * installers using the
-         * {@link android.Manifest.permission#REQUEST_INSTALL_PACKAGES android.permission
-         * #REQUEST_INSTALL_PACKAGES} permission will behave as if set to
-         * {@link #USER_ACTION_REQUIRED}, and {@link #USER_ACTION_NOT_REQUIRED} otherwise.
-         * When {@code requireUserAction} is set to {@link #USER_ACTION_REQUIRED}, installers will
-         * receive a {@link #STATUS_PENDING_USER_ACTION} callback once the session is committed,
-         * indicating that user action is required for the install to proceed.
+         * {@link android.Manifest.permission#REQUEST_INSTALL_PACKAGES REQUEST_INSTALL_PACKAGES}
+         * permission will behave as if set to {@link #USER_ACTION_REQUIRED}, and
+         * {@link #USER_ACTION_NOT_REQUIRED} otherwise. When {@code requireUserAction} is set to
+         * {@link #USER_ACTION_REQUIRED}, installers will receive a
+         * {@link #STATUS_PENDING_USER_ACTION} callback once the session is committed, indicating
+         * that user action is required for the install to proceed.
          * <p>
          * For installers that have been granted the
-         * {@link android.Manifest.permission#REQUEST_INSTALL_PACKAGES android.permission
-         * .REQUEST_INSTALL_PACKAGES} permission, user action will not be required when all of
-         * the following conditions are met:
+         * {@link android.Manifest.permission#REQUEST_INSTALL_PACKAGES REQUEST_INSTALL_PACKAGES}
+         * permission, user action will not be required when all of the following conditions are
+         * met:
          *
          * <ul>
          *     <li>{@code requireUserAction} is set to {@link #USER_ACTION_NOT_REQUIRED}.</li>
          *     <li>The app being installed targets {@link android.os.Build.VERSION_CODES#Q API 29}
          *     or higher.</li>
          *     <li>The installer is the {@link InstallSourceInfo#getInstallingPackageName()
-         *     installer of record} of an existing version of the app (i.e.: this install session
-         *     is an app update) or the installer is updating itself.</li>
+         *     installer of record} of an existing version of the app (in other words, this install
+         *     session is an app update) or the installer is updating itself.</li>
          *     <li>The installer declares the
-         *     {@link android.Manifest.permission#UPDATE_PACKAGES_WITHOUT_USER_ACTION android
-         *     .permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION} permission.</li>
+         *     {@link android.Manifest.permission#UPDATE_PACKAGES_WITHOUT_USER_ACTION
+         *     UPDATE_PACKAGES_WITHOUT_USER_ACTION} permission.</li>
          * </ul>
          * <p>
          * Note: The target API level requirement will advance in future Android versions.
diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java
index 65ce1e7..dd2080b 100644
--- a/core/java/android/content/pm/PackageItemInfo.java
+++ b/core/java/android/content/pm/PackageItemInfo.java
@@ -61,7 +61,7 @@
     public static final int MAX_SAFE_LABEL_LENGTH = 1000;
 
     /** @hide */
-    public static final float DEFAULT_MAX_LABEL_SIZE_PX = 500f;
+    public static final float DEFAULT_MAX_LABEL_SIZE_PX = 1000f;
 
     /**
      * Remove {@link Character#isWhitespace(int) whitespace} and non-breaking spaces from the edges
diff --git a/core/java/android/content/pm/TEST_MAPPING b/core/java/android/content/pm/TEST_MAPPING
index 1eb4504..8bc3734 100644
--- a/core/java/android/content/pm/TEST_MAPPING
+++ b/core/java/android/content/pm/TEST_MAPPING
@@ -49,9 +49,6 @@
           "include-filter": "android.appsecurity.cts.AppSecurityTests#testPermissionDiffCert"
         }
       ]
-    },
-    {
-      "name": "CtsPackageManagerBootTestCases"
     }
   ]
 }
diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java
index 8e4a68e..863d71f 100644
--- a/core/java/android/service/notification/StatusBarNotification.java
+++ b/core/java/android/service/notification/StatusBarNotification.java
@@ -434,11 +434,8 @@
     public Context getPackageContext(Context context) {
         if (mContext == null) {
             try {
-                ApplicationInfo ai = context.getPackageManager()
-                        .getApplicationInfoAsUser(pkg, PackageManager.MATCH_UNINSTALLED_PACKAGES,
-                                getUserId());
-                mContext = context.createApplicationContext(ai,
-                        Context.CONTEXT_RESTRICTED);
+                mContext = context.createPackageContextAsUser(pkg, Context.CONTEXT_RESTRICTED, user,
+                        PackageManager.MATCH_UNINSTALLED_PACKAGES);
             } catch (PackageManager.NameNotFoundException e) {
                 mContext = null;
             }
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index a88d5b9..fe1fcfc 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -20,6 +20,7 @@
 import static android.graphics.Matrix.MSCALE_Y;
 import static android.graphics.Matrix.MSKEW_X;
 import static android.graphics.Matrix.MSKEW_Y;
+import static android.view.SurfaceControl.METADATA_WINDOW_TYPE;
 import static android.view.View.SYSTEM_UI_FLAG_VISIBLE;
 import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
 
@@ -1024,6 +1025,8 @@
                             mBbqSurfaceControl = new SurfaceControl.Builder()
                                     .setName("Wallpaper BBQ wrapper")
                                     .setHidden(false)
+                                    // TODO(b/192291754)
+                                    .setMetadata(METADATA_WINDOW_TYPE, TYPE_WALLPAPER)
                                     .setBLASTLayer()
                                     .setParent(mSurfaceControl)
                                     .setCallsite("Wallpaper#relayout")
diff --git a/core/java/android/telephony/PhoneStateListener.java b/core/java/android/telephony/PhoneStateListener.java
index a1ffe34..d39b56d 100644
--- a/core/java/android/telephony/PhoneStateListener.java
+++ b/core/java/android/telephony/PhoneStateListener.java
@@ -621,7 +621,11 @@
      * The instance of {@link ServiceState} passed as an argument here will have various levels of
      * location information stripped from it depending on the location permissions that your app
      * holds. Only apps holding the {@link Manifest.permission#ACCESS_FINE_LOCATION} permission will
-     * receive all the information in {@link ServiceState}.
+     * receive all the information in {@link ServiceState}, otherwise the cellIdentity will be null
+     * if apps only holding the {@link Manifest.permission#ACCESS_COARSE_LOCATION} permission.
+     * Network operator name in long/short alphanumeric format and numeric id will be null if apps
+     * holding neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
      *
      * @see ServiceState#STATE_EMERGENCY_ONLY
      * @see ServiceState#STATE_IN_SERVICE
diff --git a/core/java/android/telephony/TelephonyCallback.java b/core/java/android/telephony/TelephonyCallback.java
index 1a25c8b..dd4de0a 100644
--- a/core/java/android/telephony/TelephonyCallback.java
+++ b/core/java/android/telephony/TelephonyCallback.java
@@ -663,7 +663,12 @@
          * levels of location information stripped from it depending on the location permissions
          * that your app holds.
          * Only apps holding the {@link Manifest.permission#ACCESS_FINE_LOCATION} permission will
-         * receive all the information in {@link ServiceState}.
+         * receive all the information in {@link ServiceState}, otherwise the cellIdentity
+         * will be null if apps only holding the {@link Manifest.permission#ACCESS_COARSE_LOCATION}
+         * permission.
+         * Network operator name in long/short alphanumeric format and numeric id will be null if
+         * apps holding neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+         * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
          *
          * @see ServiceState#STATE_EMERGENCY_ONLY
          * @see ServiceState#STATE_IN_SERVICE
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 5964f63..2996c3d 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -3781,6 +3781,7 @@
             out.writeInt(screenOrientation);
             out.writeFloat(preferredRefreshRate);
             out.writeInt(preferredDisplayModeId);
+            out.writeFloat(preferredMaxDisplayRefreshRate);
             out.writeInt(systemUiVisibility);
             out.writeInt(subtreeSystemUiVisibility);
             out.writeBoolean(hasSystemUiListeners);
@@ -3851,6 +3852,7 @@
             screenOrientation = in.readInt();
             preferredRefreshRate = in.readFloat();
             preferredDisplayModeId = in.readInt();
+            preferredMaxDisplayRefreshRate = in.readFloat();
             systemUiVisibility = in.readInt();
             subtreeSystemUiVisibility = in.readInt();
             hasSystemUiListeners = in.readBoolean();
@@ -3928,6 +3930,8 @@
         public static final int MINIMAL_POST_PROCESSING_PREFERENCE_CHANGED = 1 << 28;
         /** {@hide} */
         public static final int BLUR_BEHIND_RADIUS_CHANGED = 1 << 29;
+        /** {@hide} */
+        public static final int PREFERRED_MAX_DISPLAY_REFRESH_RATE = 1 << 30;
 
         // internal buffer to backup/restore parameters under compatibility mode.
         private int[] mCompatibilityParamsBackup = null;
@@ -4059,6 +4063,11 @@
                 changes |= PREFERRED_DISPLAY_MODE_ID;
             }
 
+            if (preferredMaxDisplayRefreshRate != o.preferredMaxDisplayRefreshRate) {
+                preferredMaxDisplayRefreshRate = o.preferredMaxDisplayRefreshRate;
+                changes |= PREFERRED_MAX_DISPLAY_REFRESH_RATE;
+            }
+
             if (systemUiVisibility != o.systemUiVisibility
                     || subtreeSystemUiVisibility != o.subtreeSystemUiVisibility) {
                 systemUiVisibility = o.systemUiVisibility;
@@ -4263,6 +4272,10 @@
                 sb.append(" preferredDisplayMode=");
                 sb.append(preferredDisplayModeId);
             }
+            if (preferredMaxDisplayRefreshRate != 0) {
+                sb.append(" preferredMaxDisplayRefreshRate=");
+                sb.append(preferredMaxDisplayRefreshRate);
+            }
             if (hasSystemUiListeners) {
                 sb.append(" sysuil=");
                 sb.append(hasSystemUiListeners);
diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java
index e0a7bf2..4cf5532 100644
--- a/core/java/android/view/contentcapture/MainContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java
@@ -773,7 +773,7 @@
 
     void notifyContextUpdated(int sessionId, @Nullable ContentCaptureContext context) {
         mHandler.post(() -> sendEvent(new ContentCaptureEvent(sessionId, TYPE_CONTEXT_UPDATED)
-                .setClientContext(context)));
+                .setClientContext(context), FORCE_FLUSH));
     }
 
     @Override
diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java
index cf6807e..8d27cde 100644
--- a/core/java/android/webkit/WebViewFactory.java
+++ b/core/java/android/webkit/WebViewFactory.java
@@ -33,6 +33,7 @@
 import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.os.Trace;
+import android.os.UserHandle;
 import android.util.AndroidRuntimeException;
 import android.util.ArraySet;
 import android.util.Log;
@@ -467,9 +468,12 @@
             sTimestamps.mCreateContextStart = SystemClock.uptimeMillis();
             try {
                 // Construct an app context to load the Java code into the current app.
-                Context webViewContext = initialApplication.createApplicationContext(
-                        ai,
-                        Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
+                Context webViewContext = initialApplication.createPackageContextAsUser(
+                        ai.packageName,
+                        Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY,
+                        UserHandle.getUserHandleForUid(ai.uid),
+                        PackageManager.MATCH_UNINSTALLED_PACKAGES
+                                | PackageManager.MATCH_DEBUG_TRIAGED_MISSING);
                 sPackageInfo = newPackageInfo;
                 return webViewContext;
             } finally {
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index e827f0a..8a044fd 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -5831,8 +5831,9 @@
                 return context;
             }
             try {
-                return context.createApplicationContext(mApplication,
-                        Context.CONTEXT_RESTRICTED);
+                return context.createPackageContextAsUser(mApplication.packageName,
+                        Context.CONTEXT_RESTRICTED,
+                        UserHandle.getUserHandleForUid(mApplication.uid));
             } catch (NameNotFoundException e) {
                 Log.e(LOG_TAG, "Package name " + mApplication.packageName + " not found");
             }
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index eb6bce4..3fed9be 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -565,6 +565,7 @@
          */
         public void onSmartSelection(SelectionResult result) {
             onClassifiedSelection(result);
+            mTextView.notifyContentCaptureTextChanged();
             mLogger.logSelectionModified(
                     result.mStart, result.mEnd, result.mClassification, result.mSelection);
         }
@@ -595,6 +596,7 @@
                 mSelectionStart = selectionStart;
                 mSelectionEnd = selectionEnd;
                 mAllowReset = false;
+                mTextView.notifyContentCaptureTextChanged();
                 mLogger.logSelectionModified(selectionStart, selectionEnd, classification, null);
             }
         }
diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl
index 9ad4572..30da4b4 100644
--- a/core/java/com/android/internal/app/IAppOpsService.aidl
+++ b/core/java/com/android/internal/app/IAppOpsService.aidl
@@ -97,6 +97,7 @@
 
     void setUserRestrictions(in Bundle restrictions, IBinder token, int userHandle);
     void setUserRestriction(int code, boolean restricted, IBinder token, int userHandle, in PackageTagsList excludedPackageTags);
+
     void removeUser(int userHandle);
 
     void startWatchingActive(in int[] ops, IAppOpsActiveCallback callback);
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 6ff656c..0f26f57e 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -127,6 +127,12 @@
 
     private static boolean sPreloadComplete;
 
+    /**
+     * Cached classloader to use for the system server. Will only be populated in the system
+     * server process.
+     */
+    private static ClassLoader sCachedSystemServerClassLoader = null;
+
     static void preload(TimingsTraceLog bootTimingsTraceLog) {
         Log.d(TAG, "begin preload");
         bootTimingsTraceLog.traceBegin("BeginPreload");
@@ -540,10 +546,8 @@
 
             throw new IllegalStateException("Unexpected return from WrapperInit.execApplication");
         } else {
-            ClassLoader cl = null;
-            if (systemServerClasspath != null) {
-                cl = createPathClassLoader(systemServerClasspath, parsedArgs.mTargetSdkVersion);
-
+            ClassLoader cl = getOrCreateSystemServerClassLoader();
+            if (cl != null) {
                 Thread.currentThread().setContextClassLoader(cl);
             }
 
@@ -559,6 +563,23 @@
     }
 
     /**
+     * Create the classloader for the system server and store it in
+     * {@link sCachedSystemServerClassLoader}. This function may be called through JNI in
+     * system server startup, when the runtime is in a critically low state. Do not do
+     * extended computation etc here.
+     */
+    private static ClassLoader getOrCreateSystemServerClassLoader() {
+        if (sCachedSystemServerClassLoader == null) {
+            final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");
+            if (systemServerClasspath != null) {
+                sCachedSystemServerClassLoader = createPathClassLoader(systemServerClasspath,
+                        VMRuntime.SDK_VERSION_CUR_DEVELOPMENT);
+            }
+        }
+        return sCachedSystemServerClassLoader;
+    }
+
+    /**
      * Note that preparing the profiles for system server does not require special selinux
      * permissions. From the installer perspective the system server is a regular package which can
      * capture profile information.
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 502849e..64bf47c 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -122,6 +122,10 @@
 static jmethodID gCallPostForkSystemServerHooks;
 static jmethodID gCallPostForkChildHooks;
 
+static constexpr const char* kZygoteInitClassName = "com/android/internal/os/ZygoteInit";
+static jclass gZygoteInitClass;
+static jmethodID gGetOrCreateSystemServerClassLoader;
+
 static bool gIsSecurityEnforced = true;
 
 /**
@@ -170,6 +174,7 @@
 static constexpr const uint64_t LOWER_HALF_WORD_MASK = 0x0000'0000'FFFF'FFFF;
 
 static constexpr const char* kCurProfileDirPath = "/data/misc/profiles/cur";
+static constexpr const char* kRefProfileDirPath = "/data/misc/profiles/ref";
 
 /**
  * The maximum value that the gUSAPPoolSizeMax variable may take.  This value
@@ -1433,6 +1438,7 @@
   // Mount (namespace) tmpfs on profile directory, so apps no longer access
   // the original profile directory anymore.
   MountAppDataTmpFs(kCurProfileDirPath, fail_fn);
+  MountAppDataTmpFs(kRefProfileDirPath, fail_fn);
 
   // Create profile directory for this user.
   std::string actualCurUserProfile = StringPrintf("%s/%d", kCurProfileDirPath, user_id);
@@ -1446,14 +1452,24 @@
         packageName.c_str());
     std::string mirrorCurPackageProfile = StringPrintf("/data_mirror/cur_profiles/%d/%s",
         user_id, packageName.c_str());
+    std::string actualRefPackageProfile = StringPrintf("%s/%s", kRefProfileDirPath,
+        packageName.c_str());
+    std::string mirrorRefPackageProfile = StringPrintf("/data_mirror/ref_profiles/%s",
+        packageName.c_str());
 
     if (access(mirrorCurPackageProfile.c_str(), F_OK) != 0) {
       ALOGW("Can't access app profile directory: %s", mirrorCurPackageProfile.c_str());
       continue;
     }
+    if (access(mirrorRefPackageProfile.c_str(), F_OK) != 0) {
+      ALOGW("Can't access app profile directory: %s", mirrorRefPackageProfile.c_str());
+      continue;
+    }
 
     PrepareDir(actualCurPackageProfile, DEFAULT_DATA_DIR_PERMISSION, uid, uid, fail_fn);
     BindMount(mirrorCurPackageProfile, actualCurPackageProfile, fail_fn);
+    PrepareDir(actualRefPackageProfile, DEFAULT_DATA_DIR_PERMISSION, uid, uid, fail_fn);
+    BindMount(mirrorRefPackageProfile, actualRefPackageProfile, fail_fn);
   }
 }
 
@@ -1613,6 +1629,17 @@
                                            instruction_set.value().c_str());
     }
 
+    if (is_system_server) {
+        // Prefetch the classloader for the system server. This is done early to
+        // allow a tie-down of the proper system server selinux domain.
+        env->CallStaticObjectMethod(gZygoteInitClass, gGetOrCreateSystemServerClassLoader);
+        if (env->ExceptionCheck()) {
+            // Be robust here. The Java code will attempt to create the classloader
+            // at a later point (but may not have rights to use AoT artifacts).
+            env->ExceptionClear();
+        }
+    }
+
     if (setresgid(gid, gid, gid) == -1) {
         fail_fn(CREATE_ERROR("setresgid(%d) failed: %s", gid, strerror(errno)));
     }
@@ -2676,6 +2703,13 @@
   gCallPostForkChildHooks = GetStaticMethodIDOrDie(env, gZygoteClass, "callPostForkChildHooks",
                                                    "(IZZLjava/lang/String;)V");
 
-  return RegisterMethodsOrDie(env, "com/android/internal/os/Zygote", gMethods, NELEM(gMethods));
+  gZygoteInitClass = MakeGlobalRefOrDie(env, FindClassOrDie(env, kZygoteInitClassName));
+  gGetOrCreateSystemServerClassLoader =
+          GetStaticMethodIDOrDie(env, gZygoteInitClass, "getOrCreateSystemServerClassLoader",
+                                 "()Ljava/lang/ClassLoader;");
+
+  RegisterMethodsOrDie(env, "com/android/internal/os/Zygote", gMethods, NELEM(gMethods));
+
+  return JNI_OK;
 }
 }  // namespace android
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 64b8a1a..14d200d 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1663,11 +1663,6 @@
     <permission android:name="android.permission.INSTALL_LOCATION_TIME_ZONE_PROVIDER_SERVICE"
         android:protectionLevel="signature|privileged" />
 
-    <!-- The system server uses this permission to install a default secondary location time zone
-         provider.
-    -->
-    <uses-permission android:name="android.permission.INSTALL_LOCATION_TIME_ZONE_PROVIDER_SERVICE"/>
-
     <!-- @SystemApi @hide Allows an application to bind to a android.service.TimeZoneProviderService
          for the purpose of detecting the device's time zone. This prevents arbitrary clients
          connecting to the time zone provider service. The system server checks that the provider's
@@ -5809,10 +5804,6 @@
              android:label="@string/sensor_notification_service"/>
     <!-- Attribution for Twilight service. -->
     <attribution android:tag="TwilightService" android:label="@string/twilight_service"/>
-    <!-- Attribution for the Offline LocationTimeZoneProvider, used to detect time zone using
-         on-device data -->
-    <attribution android:tag="OfflineLocationTimeZoneProviderService"
-                 android:label="@string/offline_location_time_zone_detection_service_attribution"/>
     <!-- Attribution for Gnss Time Update service. -->
     <attribution android:tag="GnssTimeUpdateService"
                  android:label="@string/gnss_time_update_service"/>
@@ -6292,19 +6283,6 @@
             </intent-filter>
         </service>
 
-        <!-- AOSP configures a default secondary LocationTimeZoneProvider that uses an on-device
-             data set from the com.android.geotz APEX. -->
-        <service android:name="com.android.timezone.location.provider.OfflineLocationTimeZoneProviderService"
-                 android:enabled="@bool/config_enableSecondaryLocationTimeZoneProvider"
-                 android:permission="android.permission.BIND_TIME_ZONE_PROVIDER_SERVICE"
-                 android:exported="false">
-            <intent-filter>
-                <action android:name="android.service.timezone.SecondaryLocationTimeZoneProviderService" />
-            </intent-filter>
-            <meta-data android:name="serviceVersion" android:value="1" />
-            <meta-data android:name="serviceIsMultiuser" android:value="true" />
-        </service>
-
         <provider
             android:name="com.android.server.textclassifier.IconsContentProvider"
             android:authorities="com.android.textclassifier.icons"
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 43a7d80..718eef0 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -613,10 +613,8 @@
   </string-array>
     <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"আঙ্গুলের ছাপ আইকন"</string>
     <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"\'ফেস আনলক\'"</string>
-    <!-- no translation found for face_recalibrate_notification_title (2524791952735579082) -->
-    <skip />
-    <!-- no translation found for face_recalibrate_notification_content (3064513770251355594) -->
-    <skip />
+    <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"\'ফেস আনলক\' ফিচার ব্যবহার করার ক্ষেত্রে হওয়া সমস্যা"</string>
+    <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"আপনার ফেস মডেল মুছে দেওয়ার জন্য ট্যাপ করুন এবং তারপরে আবার ফেস যোগ করুন"</string>
     <string name="face_setup_notification_title" msgid="8843461561970741790">"\'ফেস আনলক\' সেট আপ করুন"</string>
     <string name="face_setup_notification_content" msgid="5463999831057751676">"আপনার ফোনের দিকে তাকিয়ে এটিকে আনলক করুন"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"আনলক করার জন্য বিভিন্ন উপায়ে সেট আপ করুন"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 5bf8273..1ec443e 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -608,8 +608,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nejsou zaregistrovány žádné otisky prstů."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Toto zařízení nemá snímač otisků prstů."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Senzor je dočasně deaktivován."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Snímač otisků prstů nelze použít. Navštivte servis"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Použít otisk prstu"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Použít otisk prstu nebo zámek obrazovky"</string>
@@ -625,12 +624,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefon odemknete pohledem"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Nastavte si více způsobů odemykání"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Klepnutím přidáte otisk prstu"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Odemknutí otiskem prstu"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Snímač otisků prstů nelze použít"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Navštivte servis"</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Obličej se nepodařilo zachytit. Zkuste to znovu."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"Je příliš světlo. Zmírněte osvětlení."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"Je moc velká tma. Přejděte na světlo."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index fee723d..e0bfb59 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Der er ikke registreret nogen fingeraftryk."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Denne enhed har ingen fingeraftrykslæser."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Sensoren er midlertidigt deaktiveret."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Fingeraftrykslæseren kan ikke bruges. Få den repareret"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"Fingeraftryk <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Brug fingeraftryk"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Brug fingeraftryk eller skærmlås"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"Lås din telefon op ved at kigge på den"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfigurer flere måder at låse op på"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tryk for at tilføje et fingeraftryk"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Oplåsning med fingeraftryk"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Fingeraftrykslæseren kan ikke bruges"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Få den repareret."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Der blev ikke registreret ansigtsdata. Prøv igen."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"Der er for lyst. Prøv en mere dæmpet belysning."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"For mørkt. Prøv med mere belysning."</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index e0b3a8d..4105e266 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"اثر انگشتی ثبت نشده است."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"این دستگاه حسگر اثر انگشت ندارد."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"حسگر به‌طور موقت غیرفعال است."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"امکان استفاده از حسگر اثر انگشت وجود ندارد. به ارائه‌دهنده خدمات تعمیر مراجعه کنید"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"انگشت <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"استفاده از اثر انگشت"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"استفاده از اثر انگشت یا قفل صفحه"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"برای باز کردن قفل تلفن خود به آن نگاه کنید"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"راه‌اندازی روش‌های بیشتر برای باز کردن قفل"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"برای افزودن اثر انگشت، ضربه بزنید"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"قفل‌گشایی با اثر انگشت"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"امکان استفاده از حسگر اثر انگشت وجود ندارد"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"به ارائه‌دهنده خدمات تعمیر مراجعه کنید."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"داده‌های دقیق چهره ضبط نشد. دوباره امتحان کنید."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"خیلی روشن است. روشنایی‌اش را ملایم‌تر کنید."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"خیلی تاریک است. تصویر را روشن‌تر کنید."</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index c2414ac..cbf8d69 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Aucune empreinte digitale enregistrée."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Cet appareil ne possède pas de capteur d\'empreintes digitales."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Le capteur a été désactivé temporairement."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Impossible utiliser capteur empreinte digitale. Consultez un fournisseur de services de réparation"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"Doigt <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Utiliser l\'empreinte digitale"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Utiliser l\'empreinte digitale ou le verrouillage de l\'écran"</string>
@@ -613,20 +612,15 @@
   </string-array>
     <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Icône d\'empreinte digitale"</string>
     <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Déverrouillage par reconnaissance faciale"</string>
-    <!-- no translation found for face_recalibrate_notification_title (2524791952735579082) -->
-    <skip />
-    <!-- no translation found for face_recalibrate_notification_content (3064513770251355594) -->
-    <skip />
+    <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problème avec la fonctionnalité de déverrouillage par reconnaissance faciale"</string>
+    <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Touchez pour supprimer votre modèle facial, puis ajoutez votre visage de nouveau"</string>
     <string name="face_setup_notification_title" msgid="8843461561970741790">"Configurer le déverrouillage par reconnaissance faciale"</string>
     <string name="face_setup_notification_content" msgid="5463999831057751676">"Déverrouillez votre téléphone en le regardant"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configurer d\'autres méthodes de déverrouillage"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Touchez pour ajouter une empreinte digitale"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Déverrouillage par empreinte digitale"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Impossible d\'utiliser le capteur d\'empreintes digitales"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Consultez un fournisseur de services de réparation."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Imposs. capt. données visage précises. Réessayez."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"Trop lumineux. Essayez un éclairage plus faible."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"Trop sombre. Essayez avec un éclairage plus fort."</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index c727b4f..157f01f 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Non se rexistraron impresións dixitais."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Este dispositivo non ten sensor de impresión dixital."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Desactivouse o sensor temporalmente."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Non se puido usar o sensor de impresión dixital. Visita un provedor de reparacións"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Utilizar impresión dixital"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Utilizar impresión dixital ou credencial do dispositivo"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"Mira o teléfono para desbloquealo"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura máis maneiras de desbloquear o dispositivo"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toca para engadir unha impresión dixital"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueo mediante impresión dixital"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Non se puido usar o sensor de impresión dixital"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visita un provedor de reparacións."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Sen datos faciais exactos. Téntao de novo."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"Hai demasiada iluminación. Proba cunha máis suave."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"Hai demasiada escuridade. Proba con máis luz."</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 08699ec..1a4723c 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nincsenek regisztrált ujjlenyomatok."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Ez az eszköz nem rendelkezik ujjlenyomat-érzékelővel."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Az érzékelő átmenetileg le van tiltva."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Nem lehet használni az ujjlenyomat-érzékelőt. Keresse fel a szervizt."</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"<xliff:g id="FINGERID">%d</xliff:g>. ujj"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Ujjlenyomat használata"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"A folytatás ujjlenyomattal vagy képernyőzárral lehetséges"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"Feloldhatja a zárolást úgy, hogy ránéz a telefonra"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"További feloldási módszerek beállítása"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Koppintson ide ujjlenyomat hozzáadásához"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Feloldás ujjlenyomattal"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Nem lehet használni az ujjlenyomat-érzékelőt"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Keresse fel a szervizt."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Sikertelen az arc pontos rögzítése. Próbálja újra."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"Túl világos. Próbálja kevésbé erős világítással."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"Túl sötét. Próbálja jobb megvilágítás mellett."</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 4e6ee68..3429d8b 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Tidak ada sidik jari yang terdaftar."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Perangkat ini tidak memiliki sensor sidik jari."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Sensor dinonaktifkan untuk sementara."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Tidak dapat menggunakan sensor sidik jari. Kunjungi penyedia reparasi"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"Jari <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Gunakan sidik jari"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Gunakan sidik jari atau kunci layar"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"Buka kunci ponsel dengan melihat ke ponsel"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Siapkan lebih banyak cara untuk membuka kunci"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Ketuk untuk menambahkan sidik jari"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingerprint Unlock"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Tidak dapat menggunakan sensor sidik jari"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Kunjungi penyedia reparasi."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Tidak bisa mengambil data wajah akurat. Coba lagi."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"Terlalu terang. Coba cahaya yang lebih lembut."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"Terlalu gelap. Coba pencahayaan yang lebih cerah."</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 1bf8625..edbd547 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"មិន​មាន​ការ​ចុះឈ្មោះស្នាម​ម្រាមដៃទេ។"</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"ឧបករណ៍នេះ​មិនមាន​ឧបករណ៍ចាប់​ស្នាមម្រាមដៃទេ។"</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"បានបិទ​ឧបករណ៍​ចាប់សញ្ញាជា​បណ្តោះអាសន្ន។"</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"មិនអាចប្រើ​ឧបករណ៍ចាប់ស្នាមម្រាមដៃ​បានទេ។ សូមទាក់ទង​ក្រុមហ៊ុនផ្ដល់​ការជួសជុល"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"ម្រាមដៃ <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"ប្រើស្នាមម្រាមដៃ"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"ប្រើស្នាមម្រាមដៃ ឬ​ការចាក់សោអេក្រង់"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"ដោះសោទូរសព្ទ​របស់អ្នកដោយសម្លឹងមើលវា"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"រៀបចំ​វិធីច្រើនទៀត​ដើម្បី​ដោះសោ"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ចុច​ដើម្បីបញ្ចូល​ស្នាមម្រាមដៃ"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ការដោះសោ​ដោយប្រើ​ស្នាមម្រាមដៃ"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"មិនអាចប្រើ​ឧបករណ៍ចាប់ស្នាមម្រាមដៃ​បានទេ"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ទាក់ទងក្រុមហ៊ុន​ផ្ដល់ការជួសជុល។"</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"មិនអាច​ថត​ទិន្នន័យទម្រង់មុខ​បាន​ត្រឹមត្រូវទេ។ សូមព្យាយាមម្ដងទៀត។"</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"ភ្លឺពេក។ សូមសាកល្បង​ប្រើ​ពន្លឺស្រាលជាងនេះ។"</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"ងងឹតជ្រុល។ សូមសាកល្បង​ប្រើ​ពន្លឺភ្លឺជាងនេះ។"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 1a394ac..17b550db 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -613,10 +613,8 @@
   </string-array>
     <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಐಕಾನ್"</string>
     <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"ಫೇಸ್ ಅನ್‌ಲಾಕ್"</string>
-    <!-- no translation found for face_recalibrate_notification_title (2524791952735579082) -->
-    <skip />
-    <!-- no translation found for face_recalibrate_notification_content (3064513770251355594) -->
-    <skip />
+    <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಕುರಿತು ಸಮಸ್ಯೆ ಇದೆ"</string>
+    <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"ನಿಮ್ಮ ಫೇಸ್ ಮಾಡೆಲ್ ಅನ್ನು ಅಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ, ನಂತರ ನಿಮ್ಮ ಫೇಸ್ ಮಾಡೆಲ್ ಅನ್ನು ಪುನಃ ಸೇರಿಸಿ"</string>
     <string name="face_setup_notification_title" msgid="8843461561970741790">"ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಿ"</string>
     <string name="face_setup_notification_content" msgid="5463999831057751676">"ಫೋನ್ ಅನ್ನು ನೋಡುವ ಮೂಲಕ ಅನ್‌ಲಾಕ್‌ ಮಾಡಿ"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ಅನ್‌ಲಾಕ್ ಮಾಡಲು ಹೆಚ್ಚಿನ ಮಾರ್ಗಗಳನ್ನು ಹೊಂದಿಸಿ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index a762a85..9df09b4 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"등록된 지문이 없습니다."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"기기에 지문 센서가 없습니다."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"센서가 일시적으로 사용 중지되었습니다."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"지문 센서를 사용할 수 없습니다. 수리업체에 방문하세요."</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"손가락 <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"지문 사용"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"지문 또는 화면 잠금 사용"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"휴대전화의 화면을 응시하여 잠금 해제할 수 있습니다."</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"다른 잠금 해제 방법 설정"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"지문을 추가하려면 탭하세요."</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"지문 잠금 해제"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"지문 센서를 사용할 수 없음"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"수리업체에 방문하세요."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"정확한 얼굴 데이터를 캡처하지 못했습니다. 다시 시도하세요."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"너무 밝습니다. 조명 밝기를 조금 낮춰보세요."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"너무 어둡습니다. 조명을 밝게 해 보세요."</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 451683c..c76c811 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -608,8 +608,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Neužregistruota jokių kontrolinių kodų."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Šiame įrenginyje nėra kontrolinio kodo jutiklio."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Jutiklis laikinai išjungtas."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Negalima naudoti kontrolinio kodo jutiklio. Apsilankykite pas taisymo paslaugos teikėją"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"<xliff:g id="FINGERID">%d</xliff:g> pirštas"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Naudoti kontrolinį kodą"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Naudoti kontrolinį kodą arba ekrano užraktą"</string>
@@ -625,12 +624,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"Atrakinkite telefoną pažiūrėję į jį"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Daugiau atrakinimo metodų nustatymas"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Palieskite, kad pridėtumėte kontrolinį kodą"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Atrakinimas kontroliniu kodu"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Negalima naudoti kontrolinio kodo jutiklio"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Apsilankykite pas taisymo paslaugos teikėją."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Neužfiks. tikslūs veido duom. Bandykite dar kartą."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"Per šviesu. Išbandykite mažesnį apšvietimą."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"Per tamsu. Išbandykite šviesesnį apšvietimą."</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index a00523c..c787e50 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -605,8 +605,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Nav reģistrēts neviens pirksta nospiedums."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Šajā ierīcē nav pirksta nospieduma sensora."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Sensors ir īslaicīgi atspējots."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Nevar izmantot pirksta nospieduma sensoru. Sazinieties ar remonta pakalpojumu sniedzēju."</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"<xliff:g id="FINGERID">%d</xliff:g>. pirksts"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Pirksta nospieduma izmantošana"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Pirksta nospieduma vai ekrāna bloķēšanas metodes izmantošana"</string>
@@ -622,12 +621,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"Atbloķējiet tālruni, skatoties uz to"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Citi atbloķēšanas veidi"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Pieskarieties, lai pievienotu pirksta nospiedumu"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Autorizācija ar pirksta nospiedumu"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Nevar izmantot pirksta nospieduma sensoru"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Sazinieties ar remonta pakalpojumu sniedzēju."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Neizdevās tvert sejas datus. Mēģiniet vēlreiz."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"Pārāk spilgts. Izmēģiniet maigāku apgaismojumu."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"Pārāk tumšs. Izmēģiniet spožāku apgaismojumu."</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 8c6565e..2274cda 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"വിരലടയാളങ്ങൾ എൻറോൾ ചെയ്തിട്ടില്ല."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"ഈ ഉപകരണത്തിൽ ഫിംഗർപ്രിന്റ് സെൻസറില്ല."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"സെൻസർ താൽക്കാലികമായി പ്രവർത്തനരഹിതമാക്കി."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"വിരലടയാള സെൻസർ ഉപയോഗിക്കാനാകുന്നില്ല. റിപ്പയർ കേന്ദ്രം സന്ദർശിക്കുക"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"ഫിംഗർ <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"ഫിംഗർപ്രിന്റ് ഉപയോഗിക്കുക"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"ഫിംഗർപ്രിന്റ് അല്ലെങ്കിൽ സ്‌ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"ഫോണിലേക്ക് നോക്കി അത് അൺലോക്ക് ചെയ്യുക"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"അൺലോക്ക് ചെയ്യുന്നതിനുള്ള കൂടുതൽ വഴികൾ സജ്ജീകരിക്കുക"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ഫിംഗർപ്രിന്റ് ചേർക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ഫിംഗർപ്രിന്റ് അൺലോക്ക്"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"വിരലടയാള സെൻസർ ഉപയോഗിക്കാനാകുന്നില്ല"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"റിപ്പയർ കേന്ദ്രം സന്ദർശിക്കുക."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"കൃത്യ മുഖ ഡാറ്റ എടുക്കാനായില്ല. വീണ്ടും ശ്രമിക്കൂ."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"വളരെയധികം തെളിച്ചം. സൗമ്യതയേറിയ പ്രകാശം ശ്രമിക്കൂ."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"വളരെ ഇരുണ്ടത്. തിളക്കമേറിയ ലൈറ്റിംഗ് പരീക്ഷിക്കുക."</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index e699ebe..095c3d3 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Tiada cap jari didaftarkan."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Peranti ini tiada penderia cap jari."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Penderia dilumpuhkan sementara."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Tidak boleh menggunakan penderia cap jari. Lawati penyedia pembaikan"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"Jari <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Gunakan cap jari"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Gunakan cap jari atau kunci skrin"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"Buka kunci telefon anda dengan melihat telefon anda"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Sediakan lebih banyak cara untuk membuka kunci"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Ketik untuk menambahkan cap jari"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Buka Kunci Cap Jari"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Tidak boleh menggunakan penderia cap jari"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Lawati penyedia pembaikan."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Gagal menangkap data wajah dgn tepat. Cuba lagi."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"Terlalu terang. Cuba pencahayaan yang lebih lembut."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"Terlalu gelap. Cuba pencahayaan yang lebih cerah."</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index f0b5b0f..bcd4ace 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"မည်သည့် လက်ဗွေကိုမျှ ထည့်သွင်းမထားပါ။"</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"ဤစက်တွင် လက်ဗွေအာရုံခံကိရိယာ မရှိပါ။"</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"အာရုံခံကိရိယာကို ယာယီပိတ်ထားသည်။"</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"လက်ဗွေ အာရုံခံကိရိယာကို အသုံးပြု၍ မရပါ။ ပြုပြင်ရေး ဝန်ဆောင်မှုပေးသူထံသို့ သွားပါ"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"လက်ချောင်း <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"လက်ဗွေ သုံးခြင်း"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"လက်ဗွေ (သို့) ဖန်သားပြင်လော့ခ်ချခြင်းကို သုံးခြင်း"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"သင့်ဖုန်းကိုကြည့်၍ သော့ဖွင့်ပါ"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"သော့ဖွင့်ရန် နောက်ထပ်နည်းလမ်းများကို စနစ်ထည့်သွင်းပါ"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"လက်ဗွေထည့်ရန် တို့ပါ"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"လက်ဗွေသုံး လော့ခ်ဖွင့်ခြင်း"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"လက်ဗွေ အာရုံခံကိရိယာကို အသုံးပြု၍ မရပါ"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"ပြုပြင်ရေး ဝန်ဆောင်မှုပေးသူထံသို့ သွားပါ။"</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"မျက်နှာဒေတာ အမှန် မရိုက်ယူနိုင်ပါ၊ ထပ်စမ်းကြည့်ပါ။"</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"အလွန် လင်းသည်။ အလင်းလျှော့ကြည့်ပါ။"</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"အလွန်မှောင်သည်။ ပိုလင်းအောင် လုပ်ကြည့်ပါ။"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 005d9cc..7885f67 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -585,8 +585,7 @@
     <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"ଅନ୍ୟ ଏକ ଟିପଚିହ୍ନ ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ"</string>
     <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"ବହୁତ ଉଜ୍ଜ୍ୱଳ"</string>
     <string name="fingerprint_acquired_try_adjusting" msgid="3667006071003809364">"ଆଡଜଷ୍ଟ କରି ଦେଖନ୍ତୁ"</string>
-    <!-- no translation found for fingerprint_acquired_immobile (1621891895241888048) -->
-    <skip />
+    <string name="fingerprint_acquired_immobile" msgid="1621891895241888048">"ପ୍ରତି ଥର ଆପଣଙ୍କ ଆଙ୍ଗୁଠିର ସ୍ଥାନ ସାମାନ୍ୟ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</string>
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_authenticated" msgid="2024862866860283100">"ଟିପଚିହ୍ନ ପ୍ରମାଣିତ ହେଲା"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 5e40452..f44c8d8 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -608,8 +608,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Neregistrovali ste žiadne odtlačky prstov."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Toto zariadenie nemá senzor odtlačkov prstov."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Senzor je dočasne vypnutý."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Senzor odtlačkov prstov nie je možné používať. Navštívte poskytovateľa opráv."</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"Prst: <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Použiť odtlačok prsta"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Použiť odtlačok prsta alebo zámku obrazovky"</string>
@@ -625,12 +624,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"Odomykajte telefón tak, že sa naň pozriete"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Nastavte viac spôsobov odomknutia"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Klepnutím pridajte odtlačok prsta"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Odomknutie odtlačkom prsta"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Senzor odtlačkov prstov nie je možné používať"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Navštívte poskytovateľa opráv."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Nepodarilo sa nasnímať presné údaje o tvári. Skúste to znova."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"Príliš veľa svetla. Skúste jemnejšie osvetlenie."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"Príliš veľká tma. Skúste lepšie osvetlenie."</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 657f102..163ad53 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Hakuna alama za vidole zilizojumuishwa."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Kifaa hiki hakina kitambua alama ya kidole."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Kitambuzi kimezimwa kwa muda."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Imeshindwa kutumia kitambua alama ya kidole. Tembelea mtoa huduma za urekebishaji"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"Kidole cha <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Tumia alama ya kidole"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Tumia alama ya kidole au mbinu ya kufunga skrini"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"Fungua simu yako kwa kuiangalia"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Weka mipangilio ya mbinu zaidi za kufungua"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Gusa ili uweke alama ya kidole"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Kufungua kwa Alama ya Kidole"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Imeshindwa kutumia kitambua alama ya kidole"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Tembelea mtoa huduma za urekebishaji."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Imeshindwa kunasa data sahihi ya uso. Jaribu tena."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"Inang\'aa mno. Jaribu mwangaza hafifu"</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"Hakuna mwangaza wa kutosha. Jaribu kuongeza mwangaza."</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index f14d6e4..26fa15b 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -47,7 +47,7 @@
     <string name="mismatchPin" msgid="2929611853228707473">"உள்ளிட்ட பின்கள் பொருந்தவில்லை."</string>
     <string name="invalidPin" msgid="7542498253319440408">"4 இலிருந்து 8 எண்கள் வரையுள்ள பின் ஐத் தட்டச்சு செய்யவும்."</string>
     <string name="invalidPuk" msgid="8831151490931907083">"8 அல்லது அதற்கு மேல் எண்கள் உள்ள PUK ஐத் தட்டச்சு செய்யவும்."</string>
-    <string name="needPuk" msgid="7321876090152422918">"உங்கள் சிம் கார்டு PUK பூட்டுதல் செய்யப்பட்டுள்ளது. அதைத் திறக்க PUK குறியீட்டைத் உள்ளிடவும்."</string>
+    <string name="needPuk" msgid="7321876090152422918">"உங்கள் சிம் கார்டு PUK பூட்டுதல் செய்யப்பட்டுள்ளது. அதை அன்லாக் செய்ய PUK குறியீட்டை உள்ளிடவும்."</string>
     <string name="needPuk2" msgid="7032612093451537186">"சிம் கார்டைத் தடுப்பு நீக்க PUK2 ஐ உள்ளிடவும்."</string>
     <string name="enablePin" msgid="2543771964137091212">"தோல்வி, சிம்/RUIM பூட்டை இயக்கவும்."</string>
     <plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584">
@@ -892,7 +892,7 @@
     <string name="lockscreen_pattern_correct" msgid="8050630103651508582">"சரி!"</string>
     <string name="lockscreen_pattern_wrong" msgid="2940138714468358458">"மீண்டும் முயற்சிக்கவும்"</string>
     <string name="lockscreen_password_wrong" msgid="8605355913868947490">"மீண்டும் முயற்சிக்கவும்"</string>
-    <string name="lockscreen_storage_locked" msgid="634993789186443380">"எல்லா அம்சங்கள் &amp; தரவை பெற, சாதனத்தை திறக்கவும்"</string>
+    <string name="lockscreen_storage_locked" msgid="634993789186443380">"எல்லா அம்சங்கள் &amp; தரவை பெற, சாதனத்தை அன்லாக் செய்யவும்"</string>
     <string name="faceunlock_multiple_failures" msgid="681991538434031708">"முகம் காட்டித் திறத்தல் அம்சத்தை அதிகமுறை பயன்படுத்துவிட்டீர்கள்"</string>
     <string name="lockscreen_missing_sim_message_short" msgid="1248431165144893792">"சிம் கார்டு இல்லை"</string>
     <string name="lockscreen_missing_sim_message" product="tablet" msgid="8596805728510570760">"டேப்லெட்டில் சிம் கார்டு இல்லை."</string>
@@ -918,10 +918,10 @@
     <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6458790975898594240">"திறப்பதற்கான வடிவத்தை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
     <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="3118353451602377380">"உங்கள் கடவுச்சொல்லை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக உள்ளிட்டீர்கள். \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
     <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="2874278239714821984">"உங்கள் பின்னை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக உள்ளிட்டீர்கள். \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="3069635524964070596">"திறப்பதற்கான வடிவத்தை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால், உங்கள் Google உள்நுழைவைப் பயன்படுத்தி டேப்லெட்டைத் திறக்குமாறு கேட்கப்படுவீர்கள். \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="6399092175942158529">"திறப்பதற்கான பேட்டர்னை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால் உங்கள் Google உள்நுழைவைப் பயன்படுத்தி Android TVயைத் திறக்குமாறு கேட்கப்படுவீர்கள். \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
-    <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="5691623136957148335">"திறப்பதற்கான வடிவத்தை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால், உங்கள் Google உள்நுழைவைப் பயன்படுத்தி மொபைலைத் திறக்குமாறு கேட்கப்படுவீர்கள். \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
-    <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="7914445759242151426">"டேப்லெட்டைத் தடைநீக்க <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, டேப்லெட்டானது ஆரம்ப இயல்புநிலைக்கு மீட்டமைக்கப்பட்டு, எல்லா பயனர் தரவும் இழக்கப்படும்."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="3069635524964070596">"அன்லாக் வடிவத்தை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால், உங்கள் Google உள்நுழைவைப் பயன்படுத்தி டேப்லெட்டை அன்லாக் செய்யுமாறு கேட்கப்படுவீர்கள். \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="6399092175942158529">"அன்லாக் பேட்டர்னை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால் உங்கள் Google உள்நுழைவைப் பயன்படுத்தி Android TVயை அன்லாக் செய்யுமாறு கேட்கப்படுவீர்கள். \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="5691623136957148335">"அன்லாக் பேட்டர்னை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால், உங்கள் Google உள்நுழைவைப் பயன்படுத்தி மொபைலை அன்லாக் செய்யுமாறு கேட்கப்படுவீர்கள். \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
+    <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="7914445759242151426">"டேப்லெட்டை அன்லாக் செய்ய <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, டேப்லெட்டானது ஆரம்ப இயல்புநிலைக்கு மீட்டமைக்கப்பட்டு, எல்லா பயனர் தரவும் இழக்கப்படும்."</string>
     <string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="4275591249631864248">"உங்கள் Android TVயில் <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறான கடவுச்சொல்லை உள்ளிட்டுத் திறக்க முயன்றுள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறான கடவுச்சொல்லை உள்ளிட்டு முயன்றால் உங்கள் Android TV ஆரம்ப நிலைக்கு மீட்டமைக்கப்படுவதுடன் பயனரின் அனைத்துத் தரவையும் இழக்க நேரிடும்."</string>
     <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="1166532464798446579">"தொலைபேசியைத் தடைநீக்க <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, தொலைபேசியானது ஆரம்ப இயல்புநிலைக்கு மீட்டமைக்கப்பட்டு, எல்லா பயனர் தரவும் இழக்கப்படும்."</string>
     <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="8682445539263683414">"நீங்கள் டேப்லெட்டைத் தடைநீக்க <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். டேப்லெட் இப்போது ஆரம்ப இயல்புநிலைக்கு மீட்டமைக்கப்படும்."</string>
@@ -929,7 +929,7 @@
     <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="2203704707679895487">"நீங்கள் தொலைபேசியைத் தடைநீக்க <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். தொலைபேசி இப்போது ஆரம்ப இயல்புநிலைக்கு மீட்டமைக்கப்படும்."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6807200118164539589">"<xliff:g id="NUMBER">%d</xliff:g> வினாடிகள் கழித்து மீண்டும் முயற்சிக்கவும்."</string>
     <string name="lockscreen_forgot_pattern_button_text" msgid="8362442730606839031">"வடிவத்தை மறந்துவிட்டீர்களா?"</string>
-    <string name="lockscreen_glogin_forgot_pattern" msgid="9218940117797602518">"கணக்கைத் திற"</string>
+    <string name="lockscreen_glogin_forgot_pattern" msgid="9218940117797602518">"கணக்கை அன்லாக் செய்"</string>
     <string name="lockscreen_glogin_too_many_attempts" msgid="3775904917743034195">"அதிகமான வடிவ முயற்சிகள்"</string>
     <string name="lockscreen_glogin_instructions" msgid="4695162942525531700">"திறக்க, Google கணக்கு மூலம் உள்நுழையவும்."</string>
     <string name="lockscreen_glogin_username_hint" msgid="6916101478673157045">"பயனர்பெயர் (மின்னஞ்சல் முகவரி)"</string>
@@ -951,7 +951,7 @@
     <string name="keyguard_accessibility_add_widget" msgid="8245795023551343672">"விட்ஜெட்டைச் சேர்க்கவும்."</string>
     <string name="keyguard_accessibility_widget_empty_slot" msgid="544239307077644480">"காலியானது"</string>
     <string name="keyguard_accessibility_unlock_area_expanded" msgid="7768634718706488951">"திறக்கும் பகுதி விரிவாக்கப்பட்டது."</string>
-    <string name="keyguard_accessibility_unlock_area_collapsed" msgid="4729922043778400434">"திறக்கும் பகுதி சுருக்கப்பட்டது."</string>
+    <string name="keyguard_accessibility_unlock_area_collapsed" msgid="4729922043778400434">"அன்லாக் செய்வதற்கான பகுதி சுருக்கப்பட்டது."</string>
     <string name="keyguard_accessibility_widget" msgid="6776892679715699875">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> விட்ஜெட்."</string>
     <string name="keyguard_accessibility_user_selector" msgid="1466067610235696600">"பயனர் தேர்வி"</string>
     <string name="keyguard_accessibility_status" msgid="6792745049712397237">"நிலை"</string>
@@ -960,12 +960,12 @@
     <string name="keyguard_accessibility_widget_reorder_start" msgid="7066213328912939191">"விட்ஜெட்டை மீண்டும் வரிசைப்படுத்துவது தொடங்கியது."</string>
     <string name="keyguard_accessibility_widget_reorder_end" msgid="1083806817600593490">"விட்ஜெட்டை மீண்டும் வரிசைப்படுத்துவது முடிந்தது."</string>
     <string name="keyguard_accessibility_widget_deleted" msgid="1509738950119878705">"விட்ஜெட் <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> நீக்கப்பட்டது."</string>
-    <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"திறப்பதற்கான பகுதியை விவரிக்கவும்."</string>
+    <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"அன்லாக் செய்வதற்கான பகுதியை விரிவாக்கவும்"</string>
     <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"ஸ்லைடு மூலம் திறத்தல்."</string>
     <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"பேட்டர்ன் மூலம் திறத்தல்."</string>
     <string name="keyguard_accessibility_face_unlock" msgid="4533832120787386728">"முகம் காட்டித் திறத்தல்."</string>
     <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Pin மூலம் திறத்தல்."</string>
-    <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"சிம்மைத் திறக்கும் பின்."</string>
+    <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"சிம் பின் அன்லாக்."</string>
     <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"சிம்மைத் திறக்கும் Puk."</string>
     <string name="keyguard_accessibility_password_unlock" msgid="6130186108581153265">"கடவுச்சொல் மூலம் திறத்தல்."</string>
     <string name="keyguard_accessibility_pattern_area" msgid="1419570880512350689">"வடிவப் பகுதி."</string>
@@ -1572,7 +1572,7 @@
     <string name="shareactionprovider_share_with" msgid="2753089758467748982">"இவர்களுடன் பகிர்"</string>
     <string name="shareactionprovider_share_with_application" msgid="4902832247173666973">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> உடன் பகிர்"</string>
     <string name="content_description_sliding_handle" msgid="982510275422590757">"ஸ்லைடிங் ஹேன்டில். தொட்டுப் பிடிக்கவும்."</string>
-    <string name="description_target_unlock_tablet" msgid="7431571180065859551">"திறக்க ஸ்வைப் செய்யவும்."</string>
+    <string name="description_target_unlock_tablet" msgid="7431571180065859551">"அன்லாக் செய்ய ஸ்வைப் செய்யவும்."</string>
     <string name="action_bar_home_description" msgid="1501655419158631974">"முகப்பிற்கு வழிசெலுத்து"</string>
     <string name="action_bar_up_description" msgid="6611579697195026932">"மேலே வழிசெலுத்து"</string>
     <string name="action_menu_overflow_description" msgid="4579536843510088170">"மேலும் விருப்பங்கள்"</string>
@@ -1669,7 +1669,7 @@
     <string name="kg_invalid_puk" msgid="4809502818518963344">"சரியான PUK குறியீட்டை மீண்டும் உள்ளிடவும். தொடர் முயற்சிகள் சிம் ஐ நிரந்தரமாக முடக்கிவிடும்."</string>
     <string name="kg_invalid_confirm_pin_hint" product="default" msgid="4705368340409816254">"பின் குறியீடுகள் பொருந்தவில்லை"</string>
     <string name="kg_login_too_many_attempts" msgid="699292728290654121">"அதிகமான வடிவ முயற்சிகள்"</string>
-    <string name="kg_login_instructions" msgid="3619844310339066827">"திறக்க, உங்கள் Google கணக்கு மூலம் உள்நுழையவும்."</string>
+    <string name="kg_login_instructions" msgid="3619844310339066827">"அன்லாக் செய்ய உங்கள் Google கணக்கு மூலம் உள்நுழையவும்."</string>
     <string name="kg_login_username_hint" msgid="1765453775467133251">"பயனர்பெயர் (மின்னஞ்சல்)"</string>
     <string name="kg_login_password_hint" msgid="3330530727273164402">"கடவுச்சொல்"</string>
     <string name="kg_login_submit_button" msgid="893611277617096870">"உள்நுழைக"</string>
@@ -1682,12 +1682,12 @@
     <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="3479940221343361587">"டேப்லெட்டைத் திறக்க <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, டேப்லெட்டானது ஆரம்பநிலைக்கு மீட்டமைக்கப்பட்டு, எல்லா பயனர் தரவையும் இழப்பீர்கள்."</string>
     <string name="kg_failed_attempts_almost_at_wipe" product="tv" msgid="9064457748587850217">"உங்கள் Android TVயில் <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறான கடவுச்சொல்லை உள்ளிட்டுத் திறக்க முயன்றுள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறான கடவுச்சொல்லை உள்ளிட்டு முயன்றால் உங்கள் Android TV ஆரம்ப நிலைக்கு மீட்டமைக்கப்படுவதுடன் பயனரின் அனைத்துத் தரவையும் இழக்க நேரிடும்."</string>
     <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="5955398963754432548">"மொபைலைத் திறக்க <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு,மொபைலானது ஆரம்பநிலைக்கு மீட்டமைக்கப்பட்டு, எல்லா பயனர் தரவையும் இழப்பீர்கள்."</string>
-    <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2299099385175083308">"டேப்லெட்டைத் திறக்க <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். டேப்லெட் இப்போது ஆரம்பநிலைக்கு மீட்டமைக்கப்படும்."</string>
+    <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2299099385175083308">"டேப்லெட்டை அன்லாக் செய்ய <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். டேப்லெட் இப்போது ஆரம்பநிலைக்கு மீட்டமைக்கப்படும்."</string>
     <string name="kg_failed_attempts_now_wiping" product="tv" msgid="5045460916106267585">"உங்கள் Android TVயில் <xliff:g id="NUMBER">%d</xliff:g> முறை தவறான கடவுச்சொல்லை உள்ளிட்டுத் திறக்க முயன்றுள்ளீர்கள். இப்போது உங்கள் Android TV ஆரம்ப நிலைக்கு மீட்டமைக்கப்படும்."</string>
     <string name="kg_failed_attempts_now_wiping" product="default" msgid="5043730590446071189">"மொபைலைத் திறக்க <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். மொபைல் இப்போது ஆரம்பநிலைக்கு மீட்டமைக்கப்படும்."</string>
     <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="7086799295109717623">"திறப்பதற்கான வடிவத்தை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். மேலும் <xliff:g id="NUMBER_1">%2$d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, மின்னஞ்சல் கணக்கைப் பயன்படுத்தி உங்கள் டேப்லெட்டைத் திறக்க கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகளில் மீண்டும் முயற்சிக்கவும்."</string>
     <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4670840383567106114">"திறப்பதற்கான பேட்டர்னை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால் மின்னஞ்சல் கணக்கைப் பயன்படுத்தி Android TVயைத் திறக்கும்படி கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
-    <string name="kg_failed_attempts_almost_at_login" product="default" msgid="5270861875006378092">"திறப்பதற்கான வடிவத்தை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். மேலும் <xliff:g id="NUMBER_1">%2$d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, மின்னஞ்சல் கணக்கைப் பயன்படுத்தி உங்கள் மொபைலைத் திறக்கக் கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
+    <string name="kg_failed_attempts_almost_at_login" product="default" msgid="5270861875006378092">"அன்லாக் வடிவத்தை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். மேலும் <xliff:g id="NUMBER_1">%2$d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, மின்னஞ்சல் கணக்கைப் பயன்படுத்தி உங்கள் மொபைலை அன்லாக் செய்யக் கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
     <string name="kg_text_message_separator" product="default" msgid="4503708889934976866">" — "</string>
     <string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"அகற்று"</string>
     <string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"பரிந்துரைத்த அளவை விட ஒலியை அதிகரிக்கவா?\n\nநீண்ட நேரத்திற்கு அதிகளவில் ஒலி கேட்பது கேட்கும் திறனைப் பாதிக்கலாம்."</string>
@@ -1992,7 +1992,7 @@
     <string name="new_sms_notification_content" msgid="3197949934153460639">"பார்க்க, SMS பயன்பாட்டைத் திறக்கவும்"</string>
     <string name="profile_encrypted_title" msgid="9001208667521266472">"சில செயலுக்கு கட்டுப்பாடு இருக்கலாம்"</string>
     <string name="profile_encrypted_detail" msgid="5279730442756849055">"பணிக் கணக்கு பூட்டியுள்ளது"</string>
-    <string name="profile_encrypted_message" msgid="1128512616293157802">"பணிக் கணக்கை திறக்க, தட்டுக"</string>
+    <string name="profile_encrypted_message" msgid="1128512616293157802">"பணிக் கணக்கை அன்லாக் செய்யத் தட்டுக"</string>
     <string name="usb_mtp_launch_notification_title" msgid="774319638256707227">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> உடன் இணைக்கப்பட்டது"</string>
     <string name="usb_mtp_launch_notification_description" msgid="6942535713629852684">"கோப்புகளைப் பார்க்க, தட்டவும்"</string>
     <string name="pin_target" msgid="8036028973110156895">"பின் செய்"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index d2ff9d8..b35ddab 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -613,10 +613,8 @@
   </string-array>
     <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ไอคอนลายนิ้วมือ"</string>
     <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"การปลดล็อกด้วยใบหน้า"</string>
-    <!-- no translation found for face_recalibrate_notification_title (2524791952735579082) -->
-    <skip />
-    <!-- no translation found for face_recalibrate_notification_content (3064513770251355594) -->
-    <skip />
+    <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"มีปัญหาเกี่ยวกับฟีเจอร์ปลดล็อกด้วยใบหน้า"</string>
+    <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"แตะเพื่อลบรูปแบบใบหน้า แล้วเพิ่มใบหน้าอีกครั้ง"</string>
     <string name="face_setup_notification_title" msgid="8843461561970741790">"ตั้งค่าการปลดล็อกด้วยใบหน้า"</string>
     <string name="face_setup_notification_content" msgid="5463999831057751676">"ปลดล็อกโทรศัพท์โดยมองไปที่โทรศัพท์"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ตั้งค่าการปลดล็อกด้วยวิธีอื่น"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 30a8042..d28a73d 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Walang naka-enroll na fingerprint."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Walang sensor ng fingerprint ang device na ito."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Pansamantalang na-disable ang sensor."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Hindi magamit ang sensor para sa fingerprint. Bumisita sa provider ng pag-aayos"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"Daliri <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Gumamit ng fingerprint"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Gumamit ng fingerprint o lock ng screen"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"I-unlock ang iyong telepono sa pamamagitan ng pagtingin dito"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Mag-set up ng higit pang paraan para mag-unlock"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"I-tap para magdagdag ng fingerprint"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Pag-unlock Gamit ang Fingerprint"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Hindi magamit ang sensor para sa fingerprint"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Bumisita sa provider ng pag-aayos."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Hindi makakuha ng tamang face data. Subukang muli."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"Masyadong maliwanag. Subukang bawasan ang liwanag."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"Masyadong madilim. Subukan sa mas maliwanag."</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index e864e2b..b7afbde 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Parmak izi kaydedilmedi."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Bu cihazda parmak izi sensörü yok."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Sensör geçici olarak devre dışı bırakıldı."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Parmak izi sensörü kullanılamıyor. Bir onarım hizmeti sağlayıcıyı ziyaret edin"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"<xliff:g id="FINGERID">%d</xliff:g>. parmak"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Parmak izi kullan"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Parmak izi veya ekran kilidi kullan"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefonunuza bakarak kilidini açın"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Kilidi açmak için daha fazla yöntem ayarlayın"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Parmak izi eklemek için dokunun"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Parmak İzi Kilidi"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Parmak izi sensörü kullanılamıyor"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Bir onarım hizmeti sağlayıcıyı ziyaret edin."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Doğru yüz verileri yakalanamadı. Tekrar deneyin."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"Çok parlak. Parlaklığı daha az bir ışıklandırma deneyin."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"Çok karanlık. Daha parlak ışıkta deneyin."</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index d0e41c1..050eb96 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Chưa đăng ký vân tay."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Thiết bị này không có cảm biến vân tay."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Đã tạm thời tắt cảm biến."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Không thể dùng cảm biến vân tay. Hãy liên hệ với một nhà cung cấp dịch vụ sửa chữa"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"Ngón tay <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Dùng vân tay"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Dùng vân tay hoặc phương thức khóa màn hình"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"Mở khóa điện thoại bằng cách nhìn vào điện thoại"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Thiết lập thêm những cách mở khóa khác"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Nhấn để thêm vân tay"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Mở khóa bằng vân tay"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Không thể dùng cảm biến vân tay"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Hãy liên hệ với một nhà cung cấp dịch vụ sửa chữa."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Không thể ghi lại đúng dữ liệu mặt. Hãy thử lại."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"Quá sáng. Hãy thử giảm độ sáng."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"Quá tối. Hãy thử tăng độ sáng."</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 365fefe..c2bce46 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"未註冊任何指紋"</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"此裝置沒有指紋感應器。"</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"感應器已暫時停用。"</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"指紋感應器無法使用,請洽詢維修供應商"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"使用指紋鎖定"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"使用指紋或螢幕鎖定"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"直望手機即可解鎖"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"設定更多解鎖方法"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"輕按即可新增指紋"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"指紋解鎖"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"指紋感應器無法使用"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"請洽詢維修供應商。"</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"無法擷取準確的臉容資料。請再試一次。"</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"影像太亮。請嘗試在更暗的環境下使用。"</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"影像太暗。請嘗試在更明亮的環境下使用。"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index ff4ee60..0dae86f 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"未登錄任何指紋。"</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"這個裝置沒有指紋感應器。"</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"感應器已暫時停用。"</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"指紋感應器無法使用,請洽詢維修供應商"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"使用指紋"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"使用指紋或螢幕鎖定功能"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"看著手機就能解鎖"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"設定更多解鎖方式"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"輕觸即可新增指紋"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"指紋解鎖"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"指紋感應器無法使用"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"請洽詢維修供應商。"</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"無法擷取精準臉孔資料,請再試一次。"</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"亮度過高,請嘗試使用較柔和的照明方式。"</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"亮度不足,請嘗試使用較明亮的照明方式。"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 6b0a1d1..7ff6bb3 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -602,8 +602,7 @@
     <string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Azikho izigxivizo zeminwe ezibhalisiwe."</string>
     <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Le divayisi ayinayo inzwa yezigxivizo zeminwe."</string>
     <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Inzwa ikhutshazwe okwesikhashana."</string>
-    <!-- no translation found for fingerprint_error_bad_calibration (4385512597740168120) -->
-    <skip />
+    <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"Ayikwazi ukusebenzisa inzwa yesigxivizo somunwe. Vakashela umhlinzeki wokulungisa"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"Umunwe ongu-<xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Sebenzisa izigxivizo zeminwe"</string>
     <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Sebenzisa izigxivizo zeminwe noma ukukhiya isikrini"</string>
@@ -619,12 +618,9 @@
     <string name="face_setup_notification_content" msgid="5463999831057751676">"Vula ifoni yakho ngokuyibheka"</string>
     <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Setha izindlela eziningi zokuvula"</string>
     <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Thepha ukuze ungeze izigxivizo zomunwe"</string>
-    <!-- no translation found for fingerprint_recalibrate_notification_name (1414578431898579354) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_title (2406561052064558497) -->
-    <skip />
-    <!-- no translation found for fingerprint_recalibrate_notification_content (8519935717822194943) -->
-    <skip />
+    <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Ukuvula ngesigxivizo somunwe"</string>
+    <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Ayikwazi ukusebenzisa inzwa yesigxivizo somunwe"</string>
+    <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Vakashela umhlinzeki wokulungisa."</string>
     <string name="face_acquired_insufficient" msgid="2150805835949162453">"Ayikwazanga ukuthwebula idatha enembile yobuso. Zama futhi."</string>
     <string name="face_acquired_too_bright" msgid="8070756048978079164">"Kukhanya kakhulu. Zama ukukhanya okuthambile."</string>
     <string name="face_acquired_too_dark" msgid="252573548464426546">"Kumnyama kakhulu Zama ukukhanyisa okukhanyayo."</string>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index d1a5cc4..cbc37b4 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -444,12 +444,6 @@
     <string name="sensor_notification_service">Sensor Notification Service</string>
     <!-- Attribution for Twilight service. [CHAR LIMIT=NONE]-->
     <string name="twilight_service">Twilight Service</string>
-    <!-- Attribution for the Offline LocationTimeZoneProvider service, i.e. the service capable of
-         performing time zone detection using time zone geospatial information held on the device.
-         This text is shown in UIs related to an application name to help users and developers to
-         understand which sub-unit of an application is requesting permissions and using power.
-         [CHAR LIMIT=NONE]-->
-    <string name="offline_location_time_zone_detection_service_attribution">Time Zone Detector (No connectivity)</string>
     <!-- Attribution for Gnss Time Update service. [CHAR LIMIT=NONE]-->
     <string name="gnss_time_update_service">GNSS Time Update Service</string>
 
diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp
index 8fae80d..93e4a29 100644
--- a/core/tests/coretests/Android.bp
+++ b/core/tests/coretests/Android.bp
@@ -121,8 +121,6 @@
         ":FrameworksCoreTests_keyset_splat_api",
         ":FrameworksCoreTests_locales",
         ":FrameworksCoreTests_overlay_config",
-        ":FrameworksCoreTests_res_version_after",
-        ":FrameworksCoreTests_res_version_before",
         ":FrameworksCoreTests_version_1",
         ":FrameworksCoreTests_version_1_diff",
         ":FrameworksCoreTests_version_1_nosys",
diff --git a/core/tests/coretests/apks/res_upgrade/Android.bp b/core/tests/coretests/apks/res_upgrade/Android.bp
deleted file mode 100644
index c58614f..0000000
--- a/core/tests/coretests/apks/res_upgrade/Android.bp
+++ /dev/null
@@ -1,22 +0,0 @@
-package {
-    // See: http://go/android-license-faq
-    // A large-scale-change added 'default_applicable_licenses' to import
-    // all of the 'license_kinds' from "frameworks_base_license"
-    // to get the below license kinds:
-    //   SPDX-license-identifier-Apache-2.0
-    default_applicable_licenses: ["frameworks_base_license"],
-}
-
-android_test_helper_app {
-    name: "FrameworksCoreTests_res_version_before",
-    defaults: ["FrameworksCoreTests_apks_defaults"],
-    resource_dirs: ["res_before"],
-    certificate: ":FrameworksCoreTests_unit_test_cert",
-}
-
-android_test_helper_app {
-    name: "FrameworksCoreTests_res_version_after",
-    defaults: ["FrameworksCoreTests_apks_defaults"],
-    resource_dirs: ["res_after"],
-    certificate: ":FrameworksCoreTests_unit_test_cert",
-}
diff --git a/core/tests/coretests/apks/res_upgrade/AndroidManifest.xml b/core/tests/coretests/apks/res_upgrade/AndroidManifest.xml
deleted file mode 100644
index 1c607c9..0000000
--- a/core/tests/coretests/apks/res_upgrade/AndroidManifest.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2021 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.
-  -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.android.frameworks.coretests.res_version">
-    <application android:hasCode="false"/>
-</manifest>
diff --git a/core/tests/coretests/apks/res_upgrade/res_before/values/values.xml b/core/tests/coretests/apks/res_upgrade/res_before/values/values.xml
deleted file mode 100644
index 63fc790..0000000
--- a/core/tests/coretests/apks/res_upgrade/res_before/values/values.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
-  ~ Copyright (C) 2021 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<resources>
-    <string name="version">before</string>
-    <public type="string" name="version" id="0x7f010000"/>
-</resources>
diff --git a/core/tests/coretests/src/android/content/ContextTest.java b/core/tests/coretests/src/android/content/ContextTest.java
index 8488a84..d1776fb 100644
--- a/core/tests/coretests/src/android/content/ContextTest.java
+++ b/core/tests/coretests/src/android/content/ContextTest.java
@@ -25,23 +25,15 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import android.app.ActivityThread;
-import android.app.PendingIntent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInstaller;
-import android.content.pm.PackageManager;
 import android.content.res.Configuration;
-import android.content.res.Resources;
 import android.graphics.PixelFormat;
 import android.hardware.display.DisplayManager;
 import android.hardware.display.VirtualDisplay;
 import android.inputmethodservice.InputMethodService;
 import android.media.ImageReader;
-import android.os.FileUtils;
 import android.os.UserHandle;
 import android.view.Display;
 
@@ -50,20 +42,12 @@
 import androidx.test.filters.SmallTest;
 import androidx.test.platform.app.InstrumentationRegistry;
 
-import com.android.compatibility.common.util.ShellIdentityUtils;
-import com.android.frameworks.coretests.R;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
 /**
- * Build/Install/Run:
- * atest FrameworksCoreTests:ContextTest
+ *  Build/Install/Run:
+ *   atest FrameworksCoreTests:ContextTest
  */
 @SmallTest
 @RunWith(AndroidJUnit4.class)
@@ -232,132 +216,6 @@
         assertFalse(context.isUiContext());
     }
 
-    private static class TestReceiver extends BroadcastReceiver implements AutoCloseable {
-        private static final String INTENT_ACTION = "com.android.server.pm.test.test_app.action";
-        private final ArrayBlockingQueue<Intent> mResults = new ArrayBlockingQueue<>(1);
-
-        public IntentSender makeIntentSender() {
-            return PendingIntent.getBroadcast(getContext(), 0, new Intent(INTENT_ACTION),
-                    PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE_UNAUDITED)
-                    .getIntentSender();
-        }
-
-        public void waitForIntent() throws InterruptedException {
-            assertNotNull(mResults.poll(30, TimeUnit.SECONDS));
-        }
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            mResults.add(intent);
-        }
-
-        public void register() {
-            getContext().registerReceiver(this, new IntentFilter(INTENT_ACTION));
-        }
-
-        @Override
-        public void close() throws Exception {
-            getContext().unregisterReceiver(this);
-        }
-
-        private Context getContext() {
-            return InstrumentationRegistry.getInstrumentation().getContext();
-        }
-    }
-
-    @Test
-    public void applicationContextBeforeAndAfterUpgrade() throws Exception {
-        final Context context = InstrumentationRegistry.getInstrumentation().getContext();
-        final String testPackageName = "com.android.frameworks.coretests.res_version";
-        try {
-            final PackageManager pm = context.getPackageManager();
-            final int versionRes = 0x7f010000;
-
-            final Context appContext = ApplicationProvider.getApplicationContext();
-            installApk(appContext, R.raw.res_version_before);
-
-            ApplicationInfo info = pm.getApplicationInfo(testPackageName, 0);
-            final Context beforeContext = appContext.createApplicationContext(info, 0);
-            assertEquals("before", beforeContext.getResources().getString(versionRes));
-
-            installApk(appContext, R.raw.res_version_after);
-
-            info = pm.getApplicationInfo(testPackageName, 0);
-            final Context afterContext = appContext.createApplicationContext(info, 0);
-            assertEquals("before", beforeContext.createConfigurationContext(Configuration.EMPTY)
-                    .getResources().getString(versionRes));
-            assertEquals("after", afterContext.createConfigurationContext(Configuration.EMPTY)
-                    .getResources().getString(versionRes));
-            assertNotEquals(beforeContext.getPackageResourcePath(),
-                    afterContext.getPackageResourcePath());
-        } finally {
-            uninstallPackage(context, testPackageName);
-        }
-    }
-
-    @Test
-    public void packageContextBeforeAndAfterUpgrade() throws Exception {
-        final Context context = InstrumentationRegistry.getInstrumentation().getContext();
-        final String testPackageName = "com.android.frameworks.coretests.res_version";
-        try {
-            final int versionRes = 0x7f010000;
-            final Context appContext = ApplicationProvider.getApplicationContext();
-            installApk(appContext, R.raw.res_version_before);
-
-            final Context beforeContext = appContext.createPackageContext(testPackageName, 0);
-            assertEquals("before", beforeContext.getResources().getString(versionRes));
-
-            installApk(appContext, R.raw.res_version_after);
-
-            final Context afterContext = appContext.createPackageContext(testPackageName, 0);
-            assertEquals("before", beforeContext.createConfigurationContext(Configuration.EMPTY)
-                    .getResources().getString(versionRes));
-            assertEquals("after", afterContext.createConfigurationContext(Configuration.EMPTY)
-                    .getResources().getString(versionRes));
-            assertNotEquals(beforeContext.getPackageResourcePath(),
-                    afterContext.getPackageResourcePath());
-        } finally {
-            uninstallPackage(context, testPackageName);
-        }
-    }
-
-    private void installApk(Context context, int rawApkResId) throws Exception {
-        final PackageManager pm = context.getPackageManager();
-        final PackageInstaller pi = pm.getPackageInstaller();
-        final PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
-                PackageInstaller.SessionParams.MODE_FULL_INSTALL);
-        final int sessionId = pi.createSession(params);
-
-        try (PackageInstaller.Session session = pi.openSession(sessionId)) {
-            // Copy the apk to the install session.
-            final Resources resources = context.getResources();
-            try (InputStream is = resources.openRawResource(rawApkResId);
-                 OutputStream sessionOs = session.openWrite("base", 0, -1)) {
-                FileUtils.copy(is, sessionOs);
-            }
-
-            // Wait for the installation to finish
-            try (TestReceiver receiver = new TestReceiver()) {
-                receiver.register();
-                ShellIdentityUtils.invokeMethodWithShellPermissions(session,
-                        (s) -> {
-                            s.commit(receiver.makeIntentSender());
-                            return true;
-                        });
-                receiver.waitForIntent();
-            }
-        }
-    }
-
-    private void uninstallPackage(Context context, String packageName) throws Exception {
-        try (TestReceiver receiver = new TestReceiver()) {
-            receiver.register();
-            final PackageInstaller pi = context.getPackageManager().getPackageInstaller();
-            pi.uninstall(packageName, receiver.makeIntentSender());
-            receiver.waitForIntent();
-        }
-    }
-
     private Context createUiContext() {
         final Context appContext = ApplicationProvider.getApplicationContext();
         final DisplayManager displayManager = appContext.getSystemService(DisplayManager.class);
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 12eb50e..6385952 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -496,6 +496,8 @@
         <permission name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS" />
         <!-- Permission required for CTS test - CtsAlarmManagerTestCases -->
         <permission name="android.permission.UPDATE_DEVICE_STATS" />
+        <!-- Permission required for GTS test - PendingSystemUpdateTest -->
+        <permission name="android.permission.NOTIFY_PENDING_SYSTEM_UPDATE" />
     </privapp-permissions>
 
     <privapp-permissions package="com.android.statementservice">
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java
index 7e4010d..362b40f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java
@@ -408,7 +408,7 @@
     }
 
     boolean isHidden() {
-        return mSurfaceHidden;
+        return getVisibility() != View.VISIBLE || mSurfaceHidden;
     }
 
     /** Starts dragging the divider bar. */
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java
index 261ff2f..ea2fc1a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java
@@ -146,10 +146,8 @@
                             new LegacySplitDisplayLayout(mContext, displayLayout, mSplits);
                     sdl.rotateTo(toRotation);
                     mRotateSplitLayout = sdl;
-                    final int position = isDividerVisible()
-                            ? (mMinimized ? mView.mSnapTargetBeforeMinimized.position
-                            : mView.getCurrentPosition())
-                            // snap resets to middle target when not in split-mode
+                    // snap resets to middle target when not minimized and rotation changed.
+                    final int position = mMinimized ? mView.mSnapTargetBeforeMinimized.position
                             : sdl.getSnapAlgorithm().getMiddleTarget().position;
                     DividerSnapAlgorithm snap = sdl.getSnapAlgorithm();
                     final DividerSnapAlgorithm.SnapTarget target =
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java
index 046c320..a4b866aa 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java
@@ -19,6 +19,7 @@
 import static android.util.TypedValue.COMPLEX_UNIT_DIP;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.app.PictureInPictureParams;
 import android.content.Context;
 import android.content.pm.ActivityInfo;
@@ -454,6 +455,56 @@
     }
 
     /**
+     * @return the normal bounds adjusted so that they fit the menu actions.
+     */
+    public Rect adjustNormalBoundsToFitMenu(@NonNull Rect normalBounds,
+            @Nullable Size minMenuSize) {
+        if (minMenuSize == null) {
+            return normalBounds;
+        }
+        if (normalBounds.width() >= minMenuSize.getWidth()
+                && normalBounds.height() >= minMenuSize.getHeight()) {
+            // The normal bounds can fit the menu as is, no need to adjust the bounds.
+            return normalBounds;
+        }
+        final Rect adjustedNormalBounds = new Rect();
+        final boolean needsWidthAdj = minMenuSize.getWidth() > normalBounds.width();
+        final boolean needsHeightAdj = minMenuSize.getHeight() > normalBounds.height();
+        final int adjWidth;
+        final int adjHeight;
+        if (needsWidthAdj && needsHeightAdj) {
+            // Both the width and the height are too small - find the edge that needs the larger
+            // adjustment and scale that edge. The other edge will scale beyond the minMenuSize
+            // when the aspect ratio is applied.
+            final float widthScaleFactor =
+                    ((float) (minMenuSize.getWidth())) / ((float) (normalBounds.width()));
+            final float heightScaleFactor =
+                    ((float) (minMenuSize.getHeight())) / ((float) (normalBounds.height()));
+            if (widthScaleFactor > heightScaleFactor) {
+                adjWidth = minMenuSize.getWidth();
+                adjHeight = Math.round(adjWidth / mPipBoundsState.getAspectRatio());
+            } else {
+                adjHeight = minMenuSize.getHeight();
+                adjWidth = Math.round(adjHeight * mPipBoundsState.getAspectRatio());
+            }
+        } else if (needsWidthAdj) {
+            // Width is too small - use the min menu size width instead.
+            adjWidth = minMenuSize.getWidth();
+            adjHeight = Math.round(adjWidth / mPipBoundsState.getAspectRatio());
+        } else {
+            // Height is too small - use the min menu size height instead.
+            adjHeight = minMenuSize.getHeight();
+            adjWidth = Math.round(adjHeight * mPipBoundsState.getAspectRatio());
+        }
+        adjustedNormalBounds.set(0, 0, adjWidth, adjHeight);
+        // Make sure the bounds conform to the aspect ratio and min edge size.
+        transformBoundsToAspectRatio(adjustedNormalBounds,
+                mPipBoundsState.getAspectRatio(), true /* useCurrentMinEdgeSize */,
+                true /* useCurrentSize */);
+        return adjustedNormalBounds;
+    }
+
+    /**
      * Dumps internal states.
      */
     public void dump(PrintWriter pw, String prefix) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
index 324a6e2..f367cd6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
@@ -722,6 +722,14 @@
         if (info.displayId != Display.DEFAULT_DISPLAY && mOnDisplayIdChangeCallback != null) {
             mOnDisplayIdChangeCallback.accept(Display.DEFAULT_DISPLAY);
         }
+
+        final PipAnimationController.PipTransitionAnimator animator =
+                mPipAnimationController.getCurrentAnimator();
+        if (animator != null) {
+            animator.removeAllUpdateListeners();
+            animator.removeAllListeners();
+            animator.cancel();
+        }
     }
 
     @Override
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
index b1086c5..0bcd1a3 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
@@ -726,12 +726,17 @@
     }
 
     private void animateToNormalSize(Runnable callback) {
+        // Save the current bounds as the user-resize bounds.
         mPipResizeGestureHandler.setUserResizeBounds(mPipBoundsState.getBounds());
-        final Rect normalBounds = new Rect(mPipBoundsState.getNormalBounds());
+
+        final Size minMenuSize = mMenuController.getEstimatedMinMenuSize();
+        final Rect normalBounds = mPipBoundsState.getNormalBounds();
+        final Rect destBounds = mPipBoundsAlgorithm.adjustNormalBoundsToFitMenu(normalBounds,
+                minMenuSize);
         Rect restoredMovementBounds = new Rect();
-        mPipBoundsAlgorithm.getMovementBounds(normalBounds,
+        mPipBoundsAlgorithm.getMovementBounds(destBounds,
                 mInsetBounds, restoredMovementBounds, mIsImeShowing ? mImeHeight : 0);
-        mSavedSnapFraction = mMotionHelper.animateToExpandedState(normalBounds,
+        mSavedSnapFraction = mMotionHelper.animateToExpandedState(destBounds,
                 mPipBoundsState.getMovementBounds(), restoredMovementBounds, callback);
     }
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java
index 9986154..4e477ca1 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java
@@ -85,7 +85,10 @@
         }
 
         View iconView = view.getIconView();
-        if (iconView == null || iconView.getBackground() == null) {
+
+        // If the icon and the background are invisible, don't animate it
+        if (iconView == null || iconView.getLayoutParams().width == 0
+                || iconView.getLayoutParams().height == 0) {
             mIconFadeOutDuration = 0;
             mIconStartAlpha = 0;
             mAppRevealDelay = 0;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
index df3fee0..b09d0d8 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
@@ -77,6 +77,13 @@
     // For example, an icon with the foreground 108*108 opaque pixels and it's background
     // also 108*108 pixels, then do not enlarge this icon if only need to show foreground icon.
     private static final float ENLARGE_FOREGROUND_ICON_THRESHOLD = (72f * 72f) / (108f * 108f);
+
+    /**
+     * If the developer doesn't specify a background for the icon, we slightly scale it up.
+     *
+     * The background is either manually specified in the theme or the Adaptive Icon
+     * background is used if it's different from the window background.
+     */
     private static final float NO_BACKGROUND_SCALE = 192f / 160;
     private final Context mContext;
     private final IconProvider mIconProvider;
@@ -228,7 +235,7 @@
         attrs.mWindowBgColor = safeReturnAttrDefault((def) -> typedArray.getColor(
                 R.styleable.Window_windowSplashScreenBackground, def),
                 Color.TRANSPARENT);
-        attrs.mReplaceIcon = safeReturnAttrDefault((def) -> typedArray.getDrawable(
+        attrs.mSplashScreenIcon = safeReturnAttrDefault((def) -> typedArray.getDrawable(
                 R.styleable.Window_windowSplashScreenAnimatedIcon), null);
         attrs.mAnimationDuration = safeReturnAttrDefault((def) -> typedArray.getInt(
                 R.styleable.Window_windowSplashScreenAnimationDuration, def), 0);
@@ -241,7 +248,7 @@
         if (DEBUG) {
             Slog.d(TAG, "window attributes color: "
                     + Integer.toHexString(attrs.mWindowBgColor)
-                    + " icon " + attrs.mReplaceIcon + " duration " + attrs.mAnimationDuration
+                    + " icon " + attrs.mSplashScreenIcon + " duration " + attrs.mAnimationDuration
                     + " brandImage " + attrs.mBrandingImage);
         }
     }
@@ -250,7 +257,7 @@
     public static class SplashScreenWindowAttrs {
         private int mWindowBgResId = 0;
         private int mWindowBgColor = Color.TRANSPARENT;
-        private Drawable mReplaceIcon = null;
+        private Drawable mSplashScreenIcon = null;
         private Drawable mBrandingImage = null;
         private int mIconBgColor = Color.TRANSPARENT;
         private int mAnimationDuration = 0;
@@ -287,10 +294,15 @@
                 // empty splash screen case
                 animationDuration = 0;
                 mFinalIconSize = 0;
-            } else if (mTmpAttrs.mReplaceIcon != null) {
+            } else if (mTmpAttrs.mSplashScreenIcon != null) {
                 // replaced icon, don't process
-                iconDrawable = mTmpAttrs.mReplaceIcon;
+                iconDrawable = mTmpAttrs.mSplashScreenIcon;
                 animationDuration = mTmpAttrs.mAnimationDuration;
+
+                // There is no background below the icon, so scale the icon up
+                if (mTmpAttrs.mIconBgColor == Color.TRANSPARENT) {
+                    mFinalIconSize *= NO_BACKGROUND_SCALE;
+                }
                 createIconDrawable(iconDrawable, false);
             } else {
                 final float iconScale = (float) mIconSize / (float) mDefaultIconSize;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java
index dae7055..211941f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java
@@ -162,6 +162,7 @@
 
         @Override
         public void draw(Canvas canvas) {
+            canvas.clipPath(mMaskScaleOnly);
             if (mMaskScaleOnly != null) {
                 canvas.drawPath(mMaskScaleOnly, mPaint);
             }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java
index a0c6d11..90f898a 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsAlgorithmTest.java
@@ -402,6 +402,64 @@
         assertBoundsInclusionWithMargin("useDefaultBounds", defaultBounds, actualBounds);
     }
 
+    @Test
+    public void adjustNormalBoundsToFitMenu_alreadyFits() {
+        final Rect normalBounds = new Rect(0, 0, 400, 711);
+        final Size minMenuSize = new Size(396, 292);
+        mPipBoundsState.setAspectRatio(
+                ((float) normalBounds.width()) / ((float) normalBounds.height()));
+
+        final Rect bounds =
+                mPipBoundsAlgorithm.adjustNormalBoundsToFitMenu(normalBounds, minMenuSize);
+
+        assertEquals(normalBounds, bounds);
+    }
+
+    @Test
+    public void adjustNormalBoundsToFitMenu_widthTooSmall() {
+        final Rect normalBounds = new Rect(0, 0, 297, 528);
+        final Size minMenuSize = new Size(396, 292);
+        mPipBoundsState.setAspectRatio(
+                ((float) normalBounds.width()) / ((float) normalBounds.height()));
+
+        final Rect bounds =
+                mPipBoundsAlgorithm.adjustNormalBoundsToFitMenu(normalBounds, minMenuSize);
+
+        assertEquals(minMenuSize.getWidth(), bounds.width());
+        assertEquals(minMenuSize.getWidth() / mPipBoundsState.getAspectRatio(),
+                bounds.height(), 0.3f);
+    }
+
+    @Test
+    public void adjustNormalBoundsToFitMenu_heightTooSmall() {
+        final Rect normalBounds = new Rect(0, 0, 400, 280);
+        final Size minMenuSize = new Size(396, 292);
+        mPipBoundsState.setAspectRatio(
+                ((float) normalBounds.width()) / ((float) normalBounds.height()));
+
+        final Rect bounds =
+                mPipBoundsAlgorithm.adjustNormalBoundsToFitMenu(normalBounds, minMenuSize);
+
+        assertEquals(minMenuSize.getHeight(), bounds.height());
+        assertEquals(minMenuSize.getHeight() * mPipBoundsState.getAspectRatio(),
+                bounds.width(), 0.3f);
+    }
+
+    @Test
+    public void adjustNormalBoundsToFitMenu_widthAndHeightTooSmall() {
+        final Rect normalBounds = new Rect(0, 0, 350, 280);
+        final Size minMenuSize = new Size(396, 292);
+        mPipBoundsState.setAspectRatio(
+                ((float) normalBounds.width()) / ((float) normalBounds.height()));
+
+        final Rect bounds =
+                mPipBoundsAlgorithm.adjustNormalBoundsToFitMenu(normalBounds, minMenuSize);
+
+        assertEquals(minMenuSize.getWidth(), bounds.width());
+        assertEquals(minMenuSize.getWidth() / mPipBoundsState.getAspectRatio(),
+                bounds.height(), 0.3f);
+    }
+
     private void overrideDefaultAspectRatio(float aspectRatio) {
         final TestableResources res = mContext.getOrCreateTestableResources();
         res.addOverride(
diff --git a/libs/hwui/WebViewFunctorManager.cpp b/libs/hwui/WebViewFunctorManager.cpp
index 92e20c4..974c863 100644
--- a/libs/hwui/WebViewFunctorManager.cpp
+++ b/libs/hwui/WebViewFunctorManager.cpp
@@ -126,7 +126,14 @@
                 renderthread::CanvasContext::getActiveContext();
         if (activeContext != nullptr) {
             ASurfaceControl* rootSurfaceControl = activeContext->getSurfaceControl();
-            if (rootSurfaceControl) overlayParams.overlaysMode = OverlaysMode::Enabled;
+            if (rootSurfaceControl) {
+                overlayParams.overlaysMode = OverlaysMode::Enabled;
+                int32_t rgid = activeContext->getSurfaceControlGenerationId();
+                if (mParentSurfaceControlGenerationId != rgid) {
+                    reparentSurfaceControl(rootSurfaceControl);
+                    mParentSurfaceControlGenerationId = rgid;
+                }
+            }
         }
     }
 
@@ -195,6 +202,7 @@
     LOG_ALWAYS_FATAL_IF(rootSurfaceControl == nullptr, "Null root surface control!");
 
     auto funcs = renderthread::RenderThread::getInstance().getASurfaceControlFunctions();
+    mParentSurfaceControlGenerationId = activeContext->getSurfaceControlGenerationId();
     mSurfaceControl = funcs.createFunc(rootSurfaceControl, "Webview Overlay SurfaceControl");
     ASurfaceTransaction* transaction = funcs.transactionCreateFunc();
     activeContext->prepareSurfaceControlForWebview();
@@ -218,6 +226,17 @@
     }
 }
 
+void WebViewFunctor::reparentSurfaceControl(ASurfaceControl* parent) {
+    ATRACE_NAME("WebViewFunctor::reparentSurfaceControl");
+    if (mSurfaceControl == nullptr) return;
+
+    auto funcs = renderthread::RenderThread::getInstance().getASurfaceControlFunctions();
+    ASurfaceTransaction* transaction = funcs.transactionCreateFunc();
+    funcs.transactionReparentFunc(transaction, mSurfaceControl, parent);
+    mergeTransaction(transaction);
+    funcs.transactionDeleteFunc(transaction);
+}
+
 WebViewFunctorManager& WebViewFunctorManager::instance() {
     static WebViewFunctorManager sInstance;
     return sInstance;
diff --git a/libs/hwui/WebViewFunctorManager.h b/libs/hwui/WebViewFunctorManager.h
index a84cda5..048d1fb 100644
--- a/libs/hwui/WebViewFunctorManager.h
+++ b/libs/hwui/WebViewFunctorManager.h
@@ -85,12 +85,16 @@
     }
 
 private:
+    void reparentSurfaceControl(ASurfaceControl* parent);
+
+private:
     WebViewFunctorCallbacks mCallbacks;
     void* const mData;
     int mFunctor;
     RenderMode mMode;
     bool mHasContext = false;
     bool mCreatedHandle = false;
+    int32_t mParentSurfaceControlGenerationId = 0;
     ASurfaceControl* mSurfaceControl = nullptr;
 };
 
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 0c9711b..81cee61 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -201,6 +201,7 @@
         funcs.releaseFunc(mSurfaceControl);
     }
     mSurfaceControl = surfaceControl;
+    mSurfaceControlGenerationId++;
     mExpectSurfaceStats = surfaceControl != nullptr;
     if (mSurfaceControl != nullptr) {
         funcs.acquireFunc(mSurfaceControl);
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index 3279ccb..85af3e4 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -110,6 +110,7 @@
     GrDirectContext* getGrContext() const { return mRenderThread.getGrContext(); }
 
     ASurfaceControl* getSurfaceControl() const { return mSurfaceControl; }
+    int32_t getSurfaceControlGenerationId() const { return mSurfaceControlGenerationId; }
 
     // Won't take effect until next EGLSurface creation
     void setSwapBehavior(SwapBehavior swapBehavior);
@@ -253,6 +254,9 @@
     // The SurfaceControl reference is passed from ViewRootImpl, can be set to
     // NULL to remove the reference
     ASurfaceControl* mSurfaceControl = nullptr;
+    // id to track surface control changes and WebViewFunctor uses it to determine
+    // whether reparenting is needed
+    int32_t mSurfaceControlGenerationId = 0;
     // stopped indicates the CanvasContext will reject actual redraw operations,
     // and defer repaint until it is un-stopped
     bool mStopped = false;
diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp
index 524407d..f83c0a4 100644
--- a/libs/hwui/renderthread/RenderThread.cpp
+++ b/libs/hwui/renderthread/RenderThread.cpp
@@ -98,6 +98,10 @@
     LOG_ALWAYS_FATAL_IF(transactionApplyFunc == nullptr,
                         "Failed to find required symbol ASurfaceTransaction_apply!");
 
+    transactionReparentFunc = (AST_reparent)dlsym(handle_, "ASurfaceTransaction_reparent");
+    LOG_ALWAYS_FATAL_IF(transactionReparentFunc == nullptr,
+                        "Failed to find required symbol transactionReparentFunc!");
+
     transactionSetVisibilityFunc =
             (AST_setVisibility)dlsym(handle_, "ASurfaceTransaction_setVisibility");
     LOG_ALWAYS_FATAL_IF(transactionSetVisibilityFunc == nullptr,
diff --git a/libs/hwui/renderthread/RenderThread.h b/libs/hwui/renderthread/RenderThread.h
index c5e3746..05d225b 100644
--- a/libs/hwui/renderthread/RenderThread.h
+++ b/libs/hwui/renderthread/RenderThread.h
@@ -94,6 +94,9 @@
 typedef ASurfaceTransaction* (*AST_create)();
 typedef void (*AST_delete)(ASurfaceTransaction* transaction);
 typedef void (*AST_apply)(ASurfaceTransaction* transaction);
+typedef void (*AST_reparent)(ASurfaceTransaction* aSurfaceTransaction,
+                             ASurfaceControl* aSurfaceControl,
+                             ASurfaceControl* newParentASurfaceControl);
 typedef void (*AST_setVisibility)(ASurfaceTransaction* transaction,
                                   ASurfaceControl* surface_control, int8_t visibility);
 typedef void (*AST_setZOrder)(ASurfaceTransaction* transaction, ASurfaceControl* surface_control,
@@ -113,6 +116,7 @@
     AST_create transactionCreateFunc;
     AST_delete transactionDeleteFunc;
     AST_apply transactionApplyFunc;
+    AST_reparent transactionReparentFunc;
     AST_setVisibility transactionSetVisibilityFunc;
     AST_setZOrder transactionSetZOrderFunc;
 };
diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java
index c8412f2..1644ec8 100644
--- a/media/java/android/media/AudioFormat.java
+++ b/media/java/android/media/AudioFormat.java
@@ -310,6 +310,10 @@
     public static final int ENCODING_LEGACY_SHORT_ARRAY_THRESHOLD = ENCODING_OPUS;
 
     /** Audio data format: PCM 24 bit per sample packed as 3 bytes.
+     *
+     * The bytes are in little-endian order, so the least significant byte
+     * comes first in the byte array.
+     *
      * Not guaranteed to be supported by devices, may be emulated if not supported. */
     public static final int ENCODING_PCM_24BIT_PACKED = 21;
     /** Audio data format: PCM 32 bit per sample.
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 1efd4c6..341bb8d 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -840,7 +840,7 @@
         setVideoSize(profile.getWidth(), profile.getHeight());
         setVideoEncodingBitRate(profile.getBitrate());
         setVideoEncoder(profile.getCodec());
-        if (profile.getProfile() > 0) {
+        if (profile.getProfile() >= 0) {
             setVideoEncodingProfileLevel(profile.getProfile(), 0 /* level */);
         }
     }
@@ -1121,10 +1121,10 @@
      * @throws IllegalArgumentException when an invalid profile or level value is used.
      */
     public void setVideoEncodingProfileLevel(int profile, int level) {
-        if (profile <= 0)  {
+        if (profile < 0)  {
             throw new IllegalArgumentException("Video encoding profile is not positive");
         }
-        if (level <= 0)  {
+        if (level < 0)  {
             throw new IllegalArgumentException("Video encoding level is not positive");
         }
         setParameter("video-param-encoder-profile=" + profile);
diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java
index 915cb12..628f7ee 100644
--- a/media/java/android/media/MediaRouter2Manager.java
+++ b/media/java/android/media/MediaRouter2Manager.java
@@ -221,10 +221,24 @@
         Objects.requireNonNull(packageName, "packageName must not be null");
 
         List<RoutingSessionInfo> sessions = getRoutingSessions(packageName);
-        return getAvailableRoutesForRoutingSession(sessions.get(sessions.size() - 1));
+        return getAvailableRoutes(sessions.get(sessions.size() - 1));
     }
 
     /**
+     * Gets routes that can be transferable seamlessly for an application.
+     *
+     * @param packageName the package name of the application
+     */
+    @NonNull
+    public List<MediaRoute2Info> getTransferableRoutes(@NonNull String packageName) {
+        Objects.requireNonNull(packageName, "packageName must not be null");
+
+        List<RoutingSessionInfo> sessions = getRoutingSessions(packageName);
+        return getTransferableRoutes(sessions.get(sessions.size() - 1));
+    }
+
+
+    /**
      * Gets available routes for the given routing session.
      * The returned routes can be passed to
      * {@link #transfer(RoutingSessionInfo, MediaRoute2Info)} for transferring the routing session.
@@ -232,8 +246,7 @@
      * @param sessionInfo the routing session that would be transferred
      */
     @NonNull
-    public List<MediaRoute2Info> getAvailableRoutesForRoutingSession(
-            @NonNull RoutingSessionInfo sessionInfo) {
+    public List<MediaRoute2Info> getAvailableRoutes(@NonNull RoutingSessionInfo sessionInfo) {
         Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");
 
         List<MediaRoute2Info> routes = new ArrayList<>();
@@ -256,6 +269,45 @@
     }
 
     /**
+     * Gets routes that can be transferable seamlessly for the given routing session.
+     * The returned routes can be passed to
+     * {@link #transfer(RoutingSessionInfo, MediaRoute2Info)} for transferring the routing session.
+     * <p>
+     * This includes routes that are {@link RoutingSessionInfo#getTransferableRoutes() transferable}
+     * by provider itself and routes that are different playback type (e.g. local/remote)
+     * from the given routing session.
+     *
+     * @param sessionInfo the routing session that would be transferred
+     */
+    @NonNull
+    public List<MediaRoute2Info> getTransferableRoutes(@NonNull RoutingSessionInfo sessionInfo) {
+        Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");
+
+        List<MediaRoute2Info> routes = new ArrayList<>();
+
+        String packageName = sessionInfo.getClientPackageName();
+        List<String> preferredFeatures = mPreferredFeaturesMap.get(packageName);
+        if (preferredFeatures == null) {
+            preferredFeatures = Collections.emptyList();
+        }
+        synchronized (mRoutesLock) {
+            for (MediaRoute2Info route : mRoutes.values()) {
+                if (sessionInfo.getSelectedRoutes().contains(route.getId())
+                        || sessionInfo.getTransferableRoutes().contains(route.getId())) {
+                    routes.add(route);
+                    continue;
+                }
+                // Add Phone -> Cast and Cast -> Phone
+                if (route.hasAnyFeatures(preferredFeatures)
+                        && (sessionInfo.isSystemSession() ^ route.isSystemRoute())) {
+                    routes.add(route);
+                }
+            }
+        }
+        return routes;
+    }
+
+    /**
      * Returns the preferred features of the specified package name.
      */
     @NonNull
diff --git a/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java b/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java
index e91dd94..f04b0e3 100644
--- a/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java
+++ b/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java
@@ -18,18 +18,29 @@
 
 import android.content.Context;
 import android.content.res.TypedArray;
+import android.graphics.drawable.Animatable;
+import android.graphics.drawable.Animatable2;
+import android.graphics.drawable.AnimationDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.View;
+import android.view.ViewGroup;
 import android.view.ViewGroup.LayoutParams;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 
-import androidx.annotation.VisibleForTesting;
+import androidx.annotation.RawRes;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceViewHolder;
+import androidx.vectordrawable.graphics.drawable.Animatable2Compat;
 
 import com.airbnb.lottie.LottieAnimationView;
+import com.airbnb.lottie.LottieDrawable;
+
+import java.io.FileNotFoundException;
+import java.io.InputStream;
 
 /**
  * IllustrationPreference is a preference that can play lottie format animation
@@ -40,11 +51,32 @@
 
     private static final boolean IS_ENABLED_LOTTIE_ADAPTIVE_COLOR = false;
 
-    private int mAnimationId;
+    private int mImageResId;
     private boolean mIsAutoScale;
-    private LottieAnimationView mIllustrationView;
+    private Uri mImageUri;
+    private Drawable mImageDrawable;
     private View mMiddleGroundView;
-    private FrameLayout mMiddleGroundLayout;
+
+    private final Animatable2.AnimationCallback mAnimationCallback =
+            new Animatable2.AnimationCallback() {
+                @Override
+                public void onAnimationEnd(Drawable drawable) {
+                    ((Animatable) drawable).start();
+                }
+            };
+
+    private final Animatable2Compat.AnimationCallback mAnimationCallbackCompat =
+            new Animatable2Compat.AnimationCallback() {
+                @Override
+                public void onAnimationEnd(Drawable drawable) {
+                    ((Animatable) drawable).start();
+                }
+            };
+
+    public IllustrationPreference(Context context) {
+        super(context);
+        init(context, /* attrs= */ null);
+    }
 
     public IllustrationPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -65,10 +97,11 @@
     @Override
     public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
-        if (mAnimationId == 0) {
-            Log.w(TAG, "Invalid illustration resource id.");
-            return;
-        }
+
+        final FrameLayout middleGroundLayout =
+                (FrameLayout) holder.findViewById(R.id.middleground_layout);
+        final LottieAnimationView illustrationView =
+                (LottieAnimationView) holder.findViewById(R.id.lottie_view);
 
         // To solve the problem of non-compliant illustrations, we set the frame height
         // to 300dp and set the length of the short side of the screen to
@@ -81,73 +114,208 @@
         lp.width = screenWidth < screenHeight ? screenWidth : screenHeight;
         illustrationFrame.setLayoutParams(lp);
 
-        mMiddleGroundLayout = (FrameLayout) holder.findViewById(R.id.middleground_layout);
-        mIllustrationView = (LottieAnimationView) holder.findViewById(R.id.lottie_view);
-        mIllustrationView.setAnimation(mAnimationId);
-        mIllustrationView.loop(true);
-        mIllustrationView.playAnimation();
-        if (mIsAutoScale) {
-            enableAnimationAutoScale(mIsAutoScale);
-        }
-        if (mMiddleGroundView != null) {
-            enableMiddleGroundView();
-        }
-        if (IS_ENABLED_LOTTIE_ADAPTIVE_COLOR) {
-            ColorUtils.applyDynamicColors(getContext(), mIllustrationView);
-        }
-    }
+        handleImageWithAnimation(illustrationView);
 
-    @VisibleForTesting
-    boolean isAnimating() {
-        return mIllustrationView.isAnimating();
+        if (mIsAutoScale) {
+            illustrationView.setScaleType(mIsAutoScale
+                            ? ImageView.ScaleType.CENTER_CROP
+                            : ImageView.ScaleType.CENTER_INSIDE);
+        }
+
+        handleMiddleGroundView(middleGroundLayout);
+
+        if (IS_ENABLED_LOTTIE_ADAPTIVE_COLOR) {
+            ColorUtils.applyDynamicColors(getContext(), illustrationView);
+        }
     }
 
     /**
-     * Set the middle ground view to preference. The user
+     * Sets the middle ground view to preference. The user
      * can overlay a view on top of the animation.
      */
     public void setMiddleGroundView(View view) {
-        mMiddleGroundView = view;
-        if (mMiddleGroundLayout == null) {
-            return;
+        if (view != mMiddleGroundView) {
+            mMiddleGroundView = view;
+            notifyChanged();
         }
-        enableMiddleGroundView();
     }
 
     /**
-     * Remove the middle ground view of preference.
+     * Removes the middle ground view of preference.
      */
     public void removeMiddleGroundView() {
-        if (mMiddleGroundLayout == null) {
-            return;
-        }
-        mMiddleGroundLayout.removeAllViews();
-        mMiddleGroundLayout.setVisibility(View.GONE);
+        mMiddleGroundView = null;
+        notifyChanged();
     }
 
     /**
      * Enables the auto scale feature of animation view.
      */
     public void enableAnimationAutoScale(boolean enable) {
-        mIsAutoScale = enable;
-        if (mIllustrationView == null) {
-            return;
+        if (enable != mIsAutoScale) {
+            mIsAutoScale = enable;
+            notifyChanged();
         }
-        mIllustrationView.setScaleType(
-                mIsAutoScale ? ImageView.ScaleType.CENTER_CROP : ImageView.ScaleType.CENTER_INSIDE);
     }
 
     /**
-     * Set the lottie illustration resource id.
+     * Sets the lottie illustration resource id.
      */
     public void setLottieAnimationResId(int resId) {
-        mAnimationId = resId;
+        if (resId != mImageResId) {
+            resetImageResourceCache();
+            mImageResId = resId;
+            notifyChanged();
+        }
     }
 
-    private void enableMiddleGroundView() {
-        mMiddleGroundLayout.removeAllViews();
-        mMiddleGroundLayout.addView(mMiddleGroundView);
-        mMiddleGroundLayout.setVisibility(View.VISIBLE);
+    /**
+     * Sets image drawable to display image in {@link LottieAnimationView}
+     *
+     * @param imageDrawable the drawable of an image
+     */
+    public void setImageDrawable(Drawable imageDrawable) {
+        if (imageDrawable != mImageDrawable) {
+            resetImageResourceCache();
+            mImageDrawable = imageDrawable;
+            notifyChanged();
+        }
+    }
+
+    /**
+     * Sets image uri to display image in {@link LottieAnimationView}
+     *
+     * @param imageUri the Uri of an image
+     */
+    public void setImageUri(Uri imageUri) {
+        if (imageUri != mImageUri) {
+            resetImageResourceCache();
+            mImageUri = imageUri;
+            notifyChanged();
+        }
+    }
+
+    private void resetImageResourceCache() {
+        mImageDrawable = null;
+        mImageUri = null;
+        mImageResId = 0;
+    }
+
+    private void handleMiddleGroundView(ViewGroup middleGroundLayout) {
+        middleGroundLayout.removeAllViews();
+
+        if (mMiddleGroundView != null) {
+            middleGroundLayout.addView(mMiddleGroundView);
+            middleGroundLayout.setVisibility(View.VISIBLE);
+        } else {
+            middleGroundLayout.setVisibility(View.GONE);
+        }
+    }
+
+    private void handleImageWithAnimation(LottieAnimationView illustrationView) {
+        if (mImageDrawable != null) {
+            resetAnimations(illustrationView);
+            illustrationView.setImageDrawable(mImageDrawable);
+            final Drawable drawable = illustrationView.getDrawable();
+            if (drawable != null) {
+                startAnimation(drawable);
+            }
+        }
+
+        if (mImageUri != null) {
+            resetAnimations(illustrationView);
+            illustrationView.setImageURI(mImageUri);
+            final Drawable drawable = illustrationView.getDrawable();
+            if (drawable != null) {
+                startAnimation(drawable);
+            } else {
+                // The lottie image from the raw folder also returns null because the ImageView
+                // couldn't handle it now.
+                startLottieAnimationWith(illustrationView, mImageUri);
+            }
+        }
+
+        if (mImageResId > 0) {
+            resetAnimations(illustrationView);
+            illustrationView.setImageResource(mImageResId);
+            final Drawable drawable = illustrationView.getDrawable();
+            if (drawable != null) {
+                startAnimation(drawable);
+            } else {
+                // The lottie image from the raw folder also returns null because the ImageView
+                // couldn't handle it now.
+                startLottieAnimationWith(illustrationView, mImageResId);
+            }
+        }
+    }
+
+    private void startAnimation(Drawable drawable) {
+        if (!(drawable instanceof Animatable)) {
+            return;
+        }
+
+        if (drawable instanceof Animatable2) {
+            ((Animatable2) drawable).registerAnimationCallback(mAnimationCallback);
+        } else if (drawable instanceof Animatable2Compat) {
+            ((Animatable2Compat) drawable).registerAnimationCallback(mAnimationCallbackCompat);
+        } else if (drawable instanceof AnimationDrawable) {
+            ((AnimationDrawable) drawable).setOneShot(false);
+        }
+
+        ((Animatable) drawable).start();
+    }
+
+    private static void startLottieAnimationWith(LottieAnimationView illustrationView,
+            Uri imageUri) {
+        try {
+            final InputStream inputStream =
+                    getInputStreamFromUri(illustrationView.getContext(), imageUri);
+            illustrationView.setAnimation(inputStream, /* cacheKey= */ null);
+            illustrationView.setRepeatCount(LottieDrawable.INFINITE);
+            illustrationView.playAnimation();
+        } catch (IllegalStateException e) {
+            Log.w(TAG, "Invalid illustration image uri: " + imageUri, e);
+        }
+    }
+
+    private static void startLottieAnimationWith(LottieAnimationView illustrationView,
+            @RawRes int rawRes) {
+        try {
+            illustrationView.setAnimation(rawRes);
+            illustrationView.setRepeatCount(LottieDrawable.INFINITE);
+            illustrationView.playAnimation();
+        } catch (IllegalStateException e) {
+            Log.w(TAG, "Invalid illustration resource id: " + rawRes, e);
+        }
+    }
+
+    private static void resetAnimations(LottieAnimationView illustrationView) {
+        resetAnimation(illustrationView.getDrawable());
+
+        illustrationView.cancelAnimation();
+    }
+
+    private static void resetAnimation(Drawable drawable) {
+        if (!(drawable instanceof Animatable)) {
+            return;
+        }
+
+        if (drawable instanceof Animatable2) {
+            ((Animatable2) drawable).clearAnimationCallbacks();
+        } else if (drawable instanceof Animatable2Compat) {
+            ((Animatable2Compat) drawable).clearAnimationCallbacks();
+        }
+
+        ((Animatable) drawable).stop();
+    }
+
+    private static InputStream getInputStreamFromUri(Context context, Uri uri) {
+        try {
+            return context.getContentResolver().openInputStream(uri);
+        } catch (FileNotFoundException e) {
+            Log.w(TAG, "Cannot find content uri: " + uri, e);
+            return null;
+        }
     }
 
     private void init(Context context, AttributeSet attrs) {
@@ -157,7 +325,7 @@
         if (attrs != null) {
             final TypedArray a = context.obtainStyledAttributes(attrs,
                     R.styleable.LottieAnimationView, 0 /*defStyleAttr*/, 0 /*defStyleRes*/);
-            mAnimationId = a.getResourceId(R.styleable.LottieAnimationView_lottie_rawRes, 0);
+            mImageResId = a.getResourceId(R.styleable.LottieAnimationView_lottie_rawRes, 0);
             a.recycle();
         }
     }
diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml
index 2518a6d..6e5911c 100644
--- a/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml
+++ b/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml
@@ -36,9 +36,9 @@
             android:layout_height="wrap_content"
             android:layout_width="0dp"
             android:layout_weight="1"
-            android:layout_marginEnd="16dp"
+            android:layout_marginEnd="@dimen/settingslib_switch_title_margin"
+            android:layout_marginVertical="@dimen/settingslib_switch_title_margin"
             android:layout_gravity="center_vertical"
-            android:maxLines="2"
             android:ellipsize="end"
             android:textAppearance="?android:attr/textAppearanceListItem"
             style="@style/MainSwitchText.Settingslib" />
diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_layout.xml b/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_layout.xml
index eccf0c0..bef6e35 100644
--- a/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_layout.xml
+++ b/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_layout.xml
@@ -15,9 +15,10 @@
   limitations under the License.
   -->
 
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_height="wrap_content"
-    android:layout_width="match_parent" >
+    android:layout_width="match_parent"
+    android:importantForAccessibility="no">
 
     <com.android.settingslib.widget.MainSwitchBar
         android:id="@+id/settingslib_main_switch_bar"
@@ -25,6 +26,6 @@
         android:layout_height="wrap_content"
         android:layout_width="match_parent" />
 
-</LinearLayout>
+</FrameLayout>
 
 
diff --git a/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml b/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml
index a386adb..16b8af6 100644
--- a/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml
+++ b/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml
@@ -41,6 +41,9 @@
     <!-- Radius of switch bar -->
     <dimen name="settingslib_switch_bar_radius">28dp</dimen>
 
+    <!-- Size of title margin -->
+    <dimen name="settingslib_switch_title_margin">16dp</dimen>
+
     <!-- SwitchBar sub settings margin start / end -->
     <dimen name="settingslib_switchbar_subsettings_margin_start">72dp</dimen>
     <dimen name="settingslib_switchbar_subsettings_margin_end">16dp</dimen>
diff --git a/packages/SettingsLib/SettingsTheme/res/color-night-v31/settingslib_switch_track_on.xml b/packages/SettingsLib/SettingsTheme/res/color-night-v31/settingslib_switch_track_on.xml
new file mode 100644
index 0000000..81ddf29
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/color-night-v31/settingslib_switch_track_on.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2021 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+  -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="@android:color/system_accent2_500" android:lStar="51" />
+</selector>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_thumb_color.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_thumb_color.xml
index df3bad4..8ccbb06 100644
--- a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_thumb_color.xml
+++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_thumb_color.xml
@@ -17,7 +17,7 @@
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <!-- Disabled status of thumb -->
     <item android:state_enabled="false"
-          android:color="@color/settingslib_thumb_off_color" />
+          android:color="@color/settingslib_thumb_disabled_color" />
     <!-- Toggle off status of thumb -->
     <item android:state_checked="false"
           android:color="@color/settingslib_thumb_off_color" />
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_track_off.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_track_off.xml
new file mode 100644
index 0000000..762bb31
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_track_off.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="@android:color/system_neutral2_500" android:lStar="45" />
+</selector>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
index 69975cd..8c7c7ed 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
@@ -16,11 +16,14 @@
   -->
 
 <resources>
+    <!-- Material next thumb disable color-->
+    <color name="settingslib_thumb_disabled_color">@android:color/system_neutral1_700</color>
+
     <!-- Material next thumb off color-->
-    <color name="settingslib_thumb_off_color">@android:color/system_neutral2_300</color>
+    <color name="settingslib_thumb_off_color">@android:color/system_neutral1_400</color>
 
     <!-- Material next track on color-->
-    <color name="settingslib_track_on_color">@android:color/system_accent2_700</color>
+    <color name="settingslib_track_on_color">@color/settingslib_switch_track_on</color>
 
     <!-- Material next track off color-->
     <color name="settingslib_track_off_color">@android:color/system_neutral1_700</color>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
index b78da90..77f1bcd 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
@@ -22,14 +22,17 @@
     <!-- Material next state off color-->
     <color name="settingslib_state_off_color">@android:color/system_accent2_100</color>
 
+    <!-- Material next thumb disable color-->
+    <color name="settingslib_thumb_disabled_color">@android:color/system_neutral2_100</color>
+
     <!-- Material next thumb off color-->
-    <color name="settingslib_thumb_off_color">@android:color/system_neutral2_100</color>
+    <color name="settingslib_thumb_off_color">@android:color/system_neutral2_300</color>
 
     <!-- Material next track on color-->
     <color name="settingslib_track_on_color">@android:color/system_accent1_600</color>
 
     <!-- Material next track off color-->
-    <color name="settingslib_track_off_color">@android:color/system_neutral2_600</color>
+    <color name="settingslib_track_off_color">@color/settingslib_switch_track_off</color>
 
     <!-- Dialog accent color -->
     <color name="settingslib_dialog_accent">@android:color/system_accent1_600</color>
diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerFactory.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerFactory.java
index 44cafb1..bd9e0d3 100644
--- a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerFactory.java
+++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerFactory.java
@@ -33,15 +33,17 @@
 
     /**
      * Returns the relevant instance of {@link ActionDisabledByAdminController}.
+     * @param userHandle user on which to launch the help page, if necessary
      */
     public static ActionDisabledByAdminController createInstance(Context context,
-            String restriction, DeviceAdminStringProvider stringProvider) {
+            String restriction, DeviceAdminStringProvider stringProvider,
+            UserHandle userHandle) {
         if (doesBiometricRequireParentalConsent(context, restriction)) {
             return new BiometricActionDisabledByAdminController(stringProvider);
         } else if (isFinancedDevice(context)) {
             return new FinancedDeviceActionDisabledByAdminController(stringProvider);
         } else {
-            return new ManagedDeviceActionDisabledByAdminController(stringProvider);
+            return new ManagedDeviceActionDisabledByAdminController(stringProvider, userHandle);
         }
     }
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java
index 849c3d9..4114879 100644
--- a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java
+++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java
@@ -54,11 +54,12 @@
     /**
      * Sets up a "learn more" button which launches a help page
      */
-    public final void setupLearnMoreButtonToLaunchHelpPage(Context context, String url) {
+    public final void setupLearnMoreButtonToLaunchHelpPage(
+            Context context, String url, UserHandle userHandle) {
         requireNonNull(context, "context cannot be null");
         requireNonNull(url, "url cannot be null");
 
-        setLearnMoreButton(() -> showHelpPage(context, url));
+        setLearnMoreButton(() -> showHelpPage(context, url, userHandle));
     }
 
     /**
@@ -105,8 +106,8 @@
      * Shows the help page using the given {@code url}.
      */
     @VisibleForTesting
-    public void showHelpPage(Context context, String url) {
-        context.startActivityAsUser(createLearnMoreIntent(url), UserHandle.of(context.getUserId()));
+    public void showHelpPage(Context context, String url, UserHandle userHandle) {
+        context.startActivityAsUser(createLearnMoreIntent(url), userHandle);
         finishSelf();
     }
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/BiometricActionDisabledByAdminController.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/BiometricActionDisabledByAdminController.java
index 814d5d2..1472980 100644
--- a/packages/SettingsLib/src/com/android/settingslib/enterprise/BiometricActionDisabledByAdminController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/BiometricActionDisabledByAdminController.java
@@ -32,8 +32,10 @@
 
     // These MUST not change, as they are the stable API between here and device admin specified
     // by the component below.
-    private static final String ACTION_LEARN_MORE = "android.settings.LEARN_MORE";
-    private static final String EXTRA_FROM_BIOMETRIC_SETUP = "from_biometric_setup";
+    private static final String ACTION_LEARN_MORE =
+            "android.intent.action.MANAGE_RESTRICTED_SETTING";
+    private static final String EXTRA_SETTING_KEY = "extra_setting";
+    private static final String EXTRA_SETTING_VALUE = "biometric_disabled_by_admin_controller";
 
     BiometricActionDisabledByAdminController(
             DeviceAdminStringProvider stringProvider) {
@@ -63,7 +65,7 @@
             Log.d(TAG, "Positive button clicked, component: " + enforcedAdmin.component);
             final Intent intent = new Intent(ACTION_LEARN_MORE)
                     .setComponent(enforcedAdmin.component)
-                    .putExtra(EXTRA_FROM_BIOMETRIC_SETUP, true)
+                    .putExtra(EXTRA_SETTING_KEY, EXTRA_SETTING_VALUE)
                     .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             context.startActivity(intent);
         };
diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java
index df6bab7..93e811d 100644
--- a/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java
@@ -16,13 +16,18 @@
 
 package com.android.settingslib.enterprise;
 
+import static java.util.Objects.requireNonNull;
+
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
+import android.os.UserHandle;
 import android.os.UserManager;
 import android.text.TextUtils;
 
 import androidx.annotation.Nullable;
 
+import java.util.Objects;
+
 
 /**
  * An {@link ActionDisabledByAdminController} to be used with managed devices.
@@ -30,8 +35,17 @@
 final class ManagedDeviceActionDisabledByAdminController
         extends BaseActionDisabledByAdminController {
 
-    ManagedDeviceActionDisabledByAdminController(DeviceAdminStringProvider stringProvider) {
+    private final UserHandle mUserHandle;
+
+    /**
+     * Constructs a {@link ManagedDeviceActionDisabledByAdminController}
+     * @param userHandle - user on which to launch the help web page, if necessary
+     */
+    ManagedDeviceActionDisabledByAdminController(
+            DeviceAdminStringProvider stringProvider,
+            UserHandle userHandle) {
         super(stringProvider);
+        mUserHandle = requireNonNull(userHandle);
     }
 
     @Override
@@ -43,7 +57,7 @@
             mLauncher.setupLearnMoreButtonToShowAdminPolicies(context, mEnforcementAdminUserId,
                     mEnforcedAdmin);
         } else {
-            mLauncher.setupLearnMoreButtonToLaunchHelpPage(context, url);
+            mLauncher.setupLearnMoreButtonToLaunchHelpPage(context, url, mUserHandle);
         }
     }
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
index 6b1e282..79446e4 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
@@ -372,7 +372,7 @@
             Log.w(TAG, "shouldDisableMediaOutput() package name is null or empty!");
             return false;
         }
-        final List<MediaRoute2Info> infos = mRouterManager.getAvailableRoutes(packageName);
+        final List<MediaRoute2Info> infos = mRouterManager.getTransferableRoutes(packageName);
         if (infos.size() == 1) {
             final MediaRoute2Info info = infos.get(0);
             final int deviceType = info.getType();
@@ -456,7 +456,7 @@
     }
 
     private void buildAvailableRoutes() {
-        for (MediaRoute2Info route : mRouterManager.getAvailableRoutes(mPackageName)) {
+        for (MediaRoute2Info route : mRouterManager.getTransferableRoutes(mPackageName)) {
             if (DEBUG) {
                 Log.d(TAG, "buildAvailableRoutes() route : " + route.getName() + ", volume : "
                         + route.getVolume() + ", type : " + route.getType());
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerTestUtils.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerTestUtils.java
index e57335f..636d0818 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerTestUtils.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerTestUtils.java
@@ -73,7 +73,7 @@
             }
 
             @Override
-            public void showHelpPage(Context context, String url) {
+            public void showHelpPage(Context context, String url, UserHandle userHandle) {
                 mLearnMoreButtonAction = LEARN_MORE_ACTION_LAUNCH_HELP_PAGE;
             }
 
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncherTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncherTest.java
index 62582d7..c2063c6 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncherTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncherTest.java
@@ -181,18 +181,20 @@
     @Test
     public void testSetupLearnMoreButtonToLaunchHelpPage_nullContext() {
         assertThrows(NullPointerException.class,
-                () -> mLauncher.setupLearnMoreButtonToLaunchHelpPage(/* context= */ null, URL));
+                () -> mLauncher.setupLearnMoreButtonToLaunchHelpPage(
+                        /* context= */ null, URL, CONTEXT_USER));
     }
 
     @Test
     public void testSetupLearnMoreButtonToLaunchHelpPage_nullUrl() {
         assertThrows(NullPointerException.class,
-                () -> mLauncher.setupLearnMoreButtonToLaunchHelpPage(mContext, /* url= */ null));
+                () -> mLauncher.setupLearnMoreButtonToLaunchHelpPage(
+                        mContext, /* url= */ null, CONTEXT_USER));
     }
 
     @Test
     public void testSetupLearnMoreButtonToLaunchHelpPage() {
-        mLauncher.setupLearnMoreButtonToLaunchHelpPage(mContext, URL);
+        mLauncher.setupLearnMoreButtonToLaunchHelpPage(mContext, URL, CONTEXT_USER);
         tapLearnMore();
 
         verify(mContext).startActivityAsUser(mIntentCaptor.capture(), eq(CONTEXT_USER));
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminControllerTest.java
index 19f6aa1..d9be4f3 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminControllerTest.java
@@ -116,7 +116,7 @@
     private ManagedDeviceActionDisabledByAdminController createController(String url) {
         ManagedDeviceActionDisabledByAdminController controller =
                 new ManagedDeviceActionDisabledByAdminController(
-                        new FakeDeviceAdminStringProvider(url));
+                        new FakeDeviceAdminStringProvider(url), mContext.getUser());
         controller.initialize(mTestUtils.createLearnMoreButtonLauncher());
         controller.updateEnforcedAdmin(ENFORCED_ADMIN, ENFORCEMENT_ADMIN_USER_ID);
         return controller;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/IllustrationPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/IllustrationPreferenceTest.java
index 89b0fe7..ea9be04 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/IllustrationPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/IllustrationPreferenceTest.java
@@ -18,12 +18,25 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
 import android.content.Context;
+import android.graphics.drawable.AnimatedImageDrawable;
+import android.graphics.drawable.AnimatedVectorDrawable;
+import android.graphics.drawable.AnimationDrawable;
+import android.net.Uri;
 import android.util.AttributeSet;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 
+import androidx.preference.PreferenceViewHolder;
+import androidx.test.core.app.ApplicationProvider;
+
 import com.airbnb.lottie.LottieAnimationView;
 
 import org.junit.Before;
@@ -33,47 +46,88 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.util.ReflectionHelpers;
 
 @RunWith(RobolectricTestRunner.class)
 public class IllustrationPreferenceTest {
 
     @Mock
-    LottieAnimationView mAnimationView;
-
-    private Context mContext;
+    private ViewGroup mRootView;
+    private Uri mImageUri;
+    private LottieAnimationView mAnimationView;
     private IllustrationPreference mPreference;
+    private PreferenceViewHolder mViewHolder;
+    private FrameLayout mMiddleGroundLayout;
+    private final Context mContext = ApplicationProvider.getApplicationContext();
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mContext = RuntimeEnvironment.application;
+
+        mImageUri = new Uri.Builder().build();
+        mAnimationView = spy(new LottieAnimationView(mContext));
+        mMiddleGroundLayout = new FrameLayout(mContext);
+        final FrameLayout illustrationFrame = new FrameLayout(mContext);
+        illustrationFrame.setLayoutParams(
+                new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+                        ViewGroup.LayoutParams.WRAP_CONTENT));
+        doReturn(mMiddleGroundLayout).when(mRootView).findViewById(R.id.middleground_layout);
+        doReturn(mAnimationView).when(mRootView).findViewById(R.id.lottie_view);
+        doReturn(illustrationFrame).when(mRootView).findViewById(R.id.illustration_frame);
+        mViewHolder = spy(PreferenceViewHolder.createInstanceForTests(mRootView));
+
         final AttributeSet attributeSet = Robolectric.buildAttributeSet().build();
         mPreference = new IllustrationPreference(mContext, attributeSet);
-        ReflectionHelpers.setField(mPreference, "mIllustrationView", mAnimationView);
     }
 
     @Test
     public void setMiddleGroundView_middleGroundView_shouldVisible() {
         final View view = new View(mContext);
-        final FrameLayout layout = new FrameLayout(mContext);
-        layout.setVisibility(View.GONE);
-        ReflectionHelpers.setField(mPreference, "mMiddleGroundView", view);
-        ReflectionHelpers.setField(mPreference, "mMiddleGroundLayout", layout);
+        mMiddleGroundLayout.setVisibility(View.GONE);
 
         mPreference.setMiddleGroundView(view);
+        mPreference.onBindViewHolder(mViewHolder);
 
-        assertThat(layout.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(mMiddleGroundLayout.getVisibility()).isEqualTo(View.VISIBLE);
     }
 
     @Test
     public void enableAnimationAutoScale_shouldChangeScaleType() {
-        final LottieAnimationView animationView = new LottieAnimationView(mContext);
-        ReflectionHelpers.setField(mPreference, "mIllustrationView", animationView);
-
         mPreference.enableAnimationAutoScale(true);
+        mPreference.onBindViewHolder(mViewHolder);
 
-        assertThat(animationView.getScaleType()).isEqualTo(ImageView.ScaleType.CENTER_CROP);
+        assertThat(mAnimationView.getScaleType()).isEqualTo(ImageView.ScaleType.CENTER_CROP);
+    }
+
+    @Test
+    public void playAnimationWithUri_animatedImageDrawable_success() {
+        final AnimatedImageDrawable drawable = mock(AnimatedImageDrawable.class);
+        doReturn(drawable).when(mAnimationView).getDrawable();
+
+        mPreference.setImageUri(mImageUri);
+        mPreference.onBindViewHolder(mViewHolder);
+
+        verify(drawable).start();
+    }
+
+    @Test
+    public void playAnimationWithUri_animatedVectorDrawable_success() {
+        final AnimatedVectorDrawable drawable = mock(AnimatedVectorDrawable.class);
+        doReturn(drawable).when(mAnimationView).getDrawable();
+
+        mPreference.setImageUri(mImageUri);
+        mPreference.onBindViewHolder(mViewHolder);
+
+        verify(drawable).start();
+    }
+
+    @Test
+    public void playAnimationWithUri_animationDrawable_success() {
+        final AnimationDrawable drawable = mock(AnimationDrawable.class);
+        doReturn(drawable).when(mAnimationView).getDrawable();
+
+        mPreference.setImageUri(mImageUri);
+        mPreference.onBindViewHolder(mViewHolder);
+
+        verify(drawable).start();
     }
 }
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 491f0d9..bc1d420 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -104,7 +104,6 @@
     <uses-permission android:name="android.permission.PERSISTENT_ACTIVITY" />
     <uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />
     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
     <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
     <uses-permission android:name="android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE" />
     <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
@@ -568,6 +567,9 @@
     <!-- Permission required for CTS test - GlobalSearchSessionPlatformCtsTests -->
     <uses-permission android:name="android.permission.READ_GLOBAL_APP_SEARCH_DATA" />
 
+    <!-- Permission required for GTS test - PendingSystemUpdateTest -->
+    <uses-permission android:name="android.permission.NOTIFY_PENDING_SYSTEM_UPDATE" />
+
     <application android:label="@string/app_label"
                 android:theme="@android:style/Theme.DeviceDefault.DayNight"
                 android:defaultToDeviceProtectedStorage="true"
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 604310a..8963dda 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -281,6 +281,8 @@
     <!-- Permission for Smartspace. -->
     <uses-permission android:name="android.permission.MANAGE_SMARTSPACE" />
 
+    <uses-permission android:name="android.permission.READ_PEOPLE_DATA" />
+
     <protected-broadcast android:name="com.android.settingslib.action.REGISTER_SLICE_RECEIVER" />
     <protected-broadcast android:name="com.android.settingslib.action.UNREGISTER_SLICE_RECEIVER" />
     <protected-broadcast android:name="com.android.settings.flashlight.action.FLASHLIGHT_CHANGED" />
@@ -604,7 +606,8 @@
         </activity>
 
         <activity android:name=".people.widget.LaunchConversationActivity"
-            android:windowDisablePreview="true" />
+            android:windowDisablePreview="true"
+            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
 
         <!-- People Space Widget -->
         <receiver
@@ -630,6 +633,9 @@
             android:permission="android.permission.GET_PEOPLE_TILE_PREVIEW">
         </provider>
 
+        <service android:name=".people.PeopleBackupFollowUpJob"
+            android:permission="android.permission.BIND_JOB_SERVICE"/>
+
         <!-- a gallery of delicious treats -->
         <service
             android:name=".DessertCaseDream"
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
index 98ef9e2..de2eca2 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
@@ -23,6 +23,8 @@
 import com.android.systemui.plugins.annotations.ProvidesInterface;
 import com.android.systemui.plugins.qs.QS.HeightListener;
 
+import java.util.function.Consumer;
+
 /**
  * Fragment that contains QS in the notification shade.  Most of the interface is for
  * handling the expand/collapsing of the view interaction.
@@ -33,7 +35,7 @@
 
     String ACTION = "com.android.systemui.action.PLUGIN_QS";
 
-    int VERSION = 9;
+    int VERSION = 10;
 
     String TAG = "QS";
 
@@ -101,6 +103,11 @@
         return true;
     }
 
+    /**
+     * Add a listener for when the collapsed media visibility changes.
+     */
+    void setCollapsedMediaVisibilityChangedListener(Consumer<Boolean> listener);
+
     @ProvidesInterface(version = HeightListener.VERSION)
     interface HeightListener {
         int VERSION = 1;
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index e5031c82..937ad06 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -26,7 +26,7 @@
     <string name="keyguard_password_enter_puk_prompt" msgid="3529260761374385243">"சிம் PUK குறியீடு"</string>
     <string name="keyguard_password_enter_pin_prompt" msgid="2304037870481240781">"புதிய சிம் பின் குறியீடு"</string>
     <string name="keyguard_password_entry_touch_hint" msgid="6180028658339706333"><font size="17">"கடவுச்சொல்லை உள்ளிட, தொடவும்"</font></string>
-    <string name="keyguard_password_enter_password_code" msgid="7393393239623946777">"திறக்க, கடவுச்சொல்லை உள்ளிடவும்"</string>
+    <string name="keyguard_password_enter_password_code" msgid="7393393239623946777">"அன்லாக் செய்ய கடவுச்சொல்லை உள்ளிடவும்"</string>
     <string name="keyguard_password_enter_pin_password_code" msgid="3692259677395250509">"திறக்க, பின்னை உள்ளிடவும்"</string>
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"பின்னை உள்ளிடுக"</string>
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"பேட்டர்னை உள்ளிடுக"</string>
@@ -40,7 +40,7 @@
     <string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • மெதுவாகச் சார்ஜாகிறது"</string>
     <string name="keyguard_plugged_in_charging_limited" msgid="6091488837901216962">"<xliff:g id="PERCENTAGE">%s</xliff:g> • சார்ஜாவது தற்காலிகமாக வரம்பிடப்பட்டுள்ளது"</string>
     <string name="keyguard_low_battery" msgid="1868012396800230904">"சார்ஜரை இணைக்கவும்."</string>
-    <string name="keyguard_instructions_when_pattern_disabled" msgid="8448804180089936954">"திறக்க, மெனுவை அழுத்தவும்."</string>
+    <string name="keyguard_instructions_when_pattern_disabled" msgid="8448804180089936954">"அன்லாக் செய்ய மெனுவை அழுத்தவும்."</string>
     <string name="keyguard_network_locked_message" msgid="407096292844868608">"நெட்வொர்க் பூட்டப்பட்டது"</string>
     <string name="keyguard_missing_sim_message_short" msgid="704159478161444907">"சிம் கார்டு இல்லை"</string>
     <string name="keyguard_missing_sim_instructions" msgid="1162120926141335918">"சிம் கார்டைச் செருகவும்."</string>
@@ -85,11 +85,11 @@
     <string name="kg_login_too_many_attempts" msgid="4519957179182578690">"பேட்டர்னை அதிக முறை தவறாக வரைந்துவிட்டீர்கள்"</string>
     <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="544687656831558971">"உங்கள் பின்னை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக உள்ளிட்டுவிட்டீர்கள். \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
     <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="190984061975729494">"உங்கள் கடவுச்சொல்லை <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக உள்ளிட்டுவிட்டீர்கள். \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
-    <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"திறப்பதற்கான பேட்டர்னை, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துவிட்டீர்கள். \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
-    <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"சிம்மின் பின் குறியீடு தவறானது. இனி சாதனத்தைத் திறக்க, உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்புகொள்ள வேண்டும்."</string>
+    <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"அன்லாக் பேட்டர்னை, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துவிட்டீர்கள். \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string>
+    <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"சிம்மின் பின் குறியீடு தவறானது. இனி சாதனத்தை அன்லாக் செய்ய, உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்புகொள்ள வேண்டும்."</string>
     <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="7030584350995485026">
       <item quantity="other">சிம்மின் பின் குறியீடு தவறானது, இன்னும் நீங்கள் <xliff:g id="NUMBER_1">%d</xliff:g> முறை முயலலாம்.</item>
-      <item quantity="one">சிம்மின் பின் குறியீடு தவறானது, மேலும் <xliff:g id="NUMBER_0">%d</xliff:g> முயற்சிகளுக்குப் பின்னர், உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்பு கொண்டு மட்டுமே சாதனத்தைத் திறக்க முடியும்.</item>
+      <item quantity="one">சிம்மின் பின் குறியீடு தவறானது, மேலும் <xliff:g id="NUMBER_0">%d</xliff:g> முயற்சிகளுக்குப் பின்னர், உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்பு கொண்டு மட்டுமே சாதனத்தை அன்லாக் செய்ய முடியும்.</item>
     </plurals>
     <string name="kg_password_wrong_puk_code_dead" msgid="3698285357028468617">"பயன்படுத்த முடியாத சிம். உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்புகொள்ளவும்."</string>
     <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="3937306685604862886">
@@ -129,7 +129,7 @@
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"அடையாளங்காணபடவில்லை"</string>
     <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
       <item quantity="other">சிம் பின்னை உள்ளிடவும். மேலும், <xliff:g id="NUMBER_1">%d</xliff:g> வாய்ப்புகள் மீதமுள்ளன.</item>
-      <item quantity="one">சிம் பின்னை உள்ளிடவும். மீதமுள்ள <xliff:g id="NUMBER_0">%d</xliff:g> வாய்ப்பில் தவறுதலான பின் உள்ளிடப்பட்டால், உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்பு கொண்டு மட்டுமே சாதனத்தைத் திறக்க முடியும்.</item>
+      <item quantity="one">சிம் பின்னை உள்ளிடவும். மீதமுள்ள <xliff:g id="NUMBER_0">%d</xliff:g> வாய்ப்பில் தவறுதலான பின் உள்ளிடப்பட்டால், உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்பு கொண்டு மட்டுமே சாதனத்தை அன்லாக் செய்ய முடியும்.</item>
     </plurals>
     <plurals name="kg_password_default_puk_message" formatted="false" msgid="571308542462946935">
       <item quantity="other">சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர்வதற்கு, PUK குறியீட்டை உள்ளிடவும். நீங்கள் <xliff:g id="_NUMBER_1">%d</xliff:g> முறை மட்டுமே முயற்சிக்க முடியும். அதன்பிறகு சிம் நிரந்தரமாக முடக்கப்படும். விவரங்களுக்கு, மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும்.</item>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
index ec0500f..34c8926 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
@@ -36,7 +36,7 @@
     <string name="keyguard_charged" msgid="5478247181205188995">"已完成充電"</string>
     <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 無線充電中"</string>
     <string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 正在充電"</string>
-    <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 正在快速充電"</string>
+    <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 快速充電中"</string>
     <string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> •正在慢速充電"</string>
     <string name="keyguard_plugged_in_charging_limited" msgid="6091488837901216962">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 充電暫時受限"</string>
     <string name="keyguard_low_battery" msgid="1868012396800230904">"請連接充電器。"</string>
diff --git a/packages/SystemUI/res/color/screenrecord_switch_thumb_color.xml b/packages/SystemUI/res/color/screenrecord_switch_thumb_color.xml
new file mode 100644
index 0000000..22b7a1e
--- /dev/null
+++ b/packages/SystemUI/res/color/screenrecord_switch_thumb_color.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <!-- Disabled status of thumb -->
+    <item android:state_enabled="false"
+          android:color="@android:color/system_neutral2_100" />
+    <!-- Toggle off status of thumb -->
+    <item android:state_checked="false"
+          android:color="@android:color/system_neutral2_100" />
+    <!-- Enabled or toggle on status of thumb -->
+    <item android:color="@android:color/system_accent1_100" />
+</selector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/color/screenrecord_switch_track_color.xml b/packages/SystemUI/res/color/screenrecord_switch_track_color.xml
new file mode 100644
index 0000000..bb55b07
--- /dev/null
+++ b/packages/SystemUI/res/color/screenrecord_switch_track_color.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <!-- Disabled status of thumb -->
+    <item android:state_enabled="false"
+          android:color="@android:color/system_neutral2_600"
+          android:alpha="?android:attr/disabledAlpha" />
+    <!-- Toggle off status of thumb -->
+    <item android:state_checked="false"
+          android:color="@android:color/system_neutral2_600" />
+    <!-- Enabled or toggle on status of thumb -->
+    <item android:color="@android:color/system_accent1_600" />
+</selector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/ic_touch.xml b/packages/SystemUI/res/drawable/ic_touch.xml
index 4f6698d..18ad367 100644
--- a/packages/SystemUI/res/drawable/ic_touch.xml
+++ b/packages/SystemUI/res/drawable/ic_touch.xml
@@ -13,14 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<!-- maybe need android:fillType="evenOdd" -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24"
+        android:viewportHeight="24"
+        android:tint="?attr/colorControlNormal">
     <path
-        android:fillColor="#FF000000"
-        android:pathData="M9,7.5V11.24C7.79,10.43 7,9.06 7,7.5C7,5.01 9.01,3 11.5,3C13.99,3 16,5.01 16,7.5C16,9.06 15.21,10.43 14,11.24V7.5C14,6.12 12.88,5 11.5,5C10.12,5 9,6.12 9,7.5ZM14.3,13.61L18.84,15.87C19.37,16.09 19.75,16.63 19.75,17.25C19.75,17.31 19.74,17.38 19.73,17.45L18.98,22.72C18.87,23.45 18.29,24 17.54,24H10.75C10.34,24 9.96,23.83 9.69,23.56L4.75,18.62L5.54,17.82C5.74,17.62 6.02,17.49 6.33,17.49C6.39,17.49 6.4411,17.4989 6.4922,17.5078C6.5178,17.5122 6.5433,17.5167 6.57,17.52L10,18.24V7.5C10,6.67 10.67,6 11.5,6C12.33,6 13,6.67 13,7.5V13.5H13.76C13.95,13.5 14.13,13.54 14.3,13.61Z"
-    />
+        android:fillColor="@android:color/white"
+        android:pathData="M18.19,12.44l-3.24,-1.62c1.29,-1 2.12,-2.56 2.12,-4.32c0,-3.03 -2.47,-5.5 -5.5,-5.5s-5.5,2.47 -5.5,5.5c0,2.13 1.22,3.98 3,4.89v3.26c-2.11,-0.45 -2.01,-0.44 -2.26,-0.44c-0.53,0 -1.03,0.21 -1.41,0.59L4,16.22l5.09,5.09C9.52,21.75 10.12,22 10.74,22h6.3c0.98,0 1.81,-0.7 1.97,-1.67l0.8,-4.71C20.03,14.32 19.38,13.04 18.19,12.44zM17.84,15.29L17.04,20h-6.3c-0.09,0 -0.17,-0.04 -0.24,-0.1l-3.68,-3.68l4.25,0.89V6.5c0,-0.28 0.22,-0.5 0.5,-0.5c0.28,0 0.5,0.22 0.5,0.5v6h1.76l3.46,1.73C17.69,14.43 17.91,14.86 17.84,15.29zM8.07,6.5c0,-1.93 1.57,-3.5 3.5,-3.5s3.5,1.57 3.5,3.5c0,0.95 -0.38,1.81 -1,2.44V6.5c0,-1.38 -1.12,-2.5 -2.5,-2.5c-1.38,0 -2.5,1.12 -2.5,2.5v2.44C8.45,8.31 8.07,7.45 8.07,6.5z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/screenrecord_button_background_outline.xml b/packages/SystemUI/res/drawable/screenrecord_button_background_outline.xml
new file mode 100644
index 0000000..59a31e8
--- /dev/null
+++ b/packages/SystemUI/res/drawable/screenrecord_button_background_outline.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2021 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
+  -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+       android:shape="rectangle">
+    <stroke
+        android:color="?androidprv:attr/colorAccentPrimary"
+        android:width="1dp"/>
+    <corners android:radius="24dp"/>
+    <padding
+        android:left="16dp"
+        android:right="16dp"
+        android:top="8dp"
+        android:bottom="8dp" />
+    <solid android:color="@android:color/transparent" />
+</shape>
diff --git a/core/tests/coretests/apks/res_upgrade/res_after/values/values.xml b/packages/SystemUI/res/drawable/screenrecord_button_background_solid.xml
similarity index 61%
copy from core/tests/coretests/apks/res_upgrade/res_after/values/values.xml
copy to packages/SystemUI/res/drawable/screenrecord_button_background_solid.xml
index db4fd54..d6446fc 100644
--- a/core/tests/coretests/apks/res_upgrade/res_after/values/values.xml
+++ b/packages/SystemUI/res/drawable/screenrecord_button_background_solid.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-
 <!--
   ~ Copyright (C) 2021 The Android Open Source Project
   ~
@@ -15,8 +14,14 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-
-<resources>
-    <string name="version">after</string>
-    <public type="string" name="version" id="0x7f010000"/>
-</resources>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+       android:shape="rectangle">
+    <corners android:radius="24dp"/>
+    <padding
+        android:left="16dp"
+        android:right="16dp"
+        android:top="8dp"
+        android:bottom="8dp" />
+    <solid android:color="?androidprv:attr/colorAccentPrimary" />
+</shape>
\ No newline at end of file
diff --git a/core/tests/coretests/apks/res_upgrade/res_after/values/values.xml b/packages/SystemUI/res/drawable/screenrecord_spinner_background.xml
similarity index 67%
copy from core/tests/coretests/apks/res_upgrade/res_after/values/values.xml
copy to packages/SystemUI/res/drawable/screenrecord_spinner_background.xml
index db4fd54..e82fb8f 100644
--- a/core/tests/coretests/apks/res_upgrade/res_after/values/values.xml
+++ b/packages/SystemUI/res/drawable/screenrecord_spinner_background.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-
 <!--
   ~ Copyright (C) 2021 The Android Open Source Project
   ~
@@ -15,8 +14,10 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-
-<resources>
-    <string name="version">after</string>
-    <public type="string" name="version" id="0x7f010000"/>
-</resources>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+        android:shape="rectangle"
+        android:padding="12dp">
+    <corners android:radius="24dp"/>
+    <solid android:color="?androidprv:attr/colorAccentSecondary" />
+</shape>
\ No newline at end of file
diff --git a/core/tests/coretests/apks/res_upgrade/res_after/values/values.xml b/packages/SystemUI/res/drawable/screenrecord_switch_thumb.xml
similarity index 61%
copy from core/tests/coretests/apks/res_upgrade/res_after/values/values.xml
copy to packages/SystemUI/res/drawable/screenrecord_switch_thumb.xml
index db4fd54..f78c582 100644
--- a/core/tests/coretests/apks/res_upgrade/res_after/values/values.xml
+++ b/packages/SystemUI/res/drawable/screenrecord_switch_thumb.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-
 <!--
   ~ Copyright (C) 2021 The Android Open Source Project
   ~
@@ -16,7 +15,15 @@
   ~ limitations under the License.
   -->
 
-<resources>
-    <string name="version">after</string>
-    <public type="string" name="version" id="0x7f010000"/>
-</resources>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:top="4dp"
+        android:left="4dp"
+        android:right="4dp"
+        android:bottom="4dp">
+        <shape android:shape="oval" >
+            <size android:height="20dp" android:width="20dp" />
+            <solid android:color="@color/screenrecord_switch_thumb_color" />
+        </shape>
+    </item>
+</layer-list>
\ No newline at end of file
diff --git a/core/tests/coretests/apks/res_upgrade/res_after/values/values.xml b/packages/SystemUI/res/drawable/screenrecord_switch_track.xml
similarity index 71%
rename from core/tests/coretests/apks/res_upgrade/res_after/values/values.xml
rename to packages/SystemUI/res/drawable/screenrecord_switch_track.xml
index db4fd54..82595e4 100644
--- a/core/tests/coretests/apks/res_upgrade/res_after/values/values.xml
+++ b/packages/SystemUI/res/drawable/screenrecord_switch_track.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-
 <!--
   ~ Copyright (C) 2021 The Android Open Source Project
   ~
@@ -15,8 +14,11 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-
-<resources>
-    <string name="version">after</string>
-    <public type="string" name="version" id="0x7f010000"/>
-</resources>
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle"
+    android:width="52dp"
+    android:height="28dp">
+    <solid android:color="@color/screenrecord_switch_track_color" />
+    <corners android:radius="35dp" />
+</shape>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/long_screenshot.xml b/packages/SystemUI/res/layout/long_screenshot.xml
index 8dfe79e..8a2c8f0 100644
--- a/packages/SystemUI/res/layout/long_screenshot.xml
+++ b/packages/SystemUI/res/layout/long_screenshot.xml
@@ -113,8 +113,9 @@
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintBottom_toBottomOf="parent"
         app:handleThickness="@dimen/screenshot_crop_handle_thickness"
-        app:handleColor="?androidprv:attr/colorAccentPrimary"
-        app:scrimColor="@color/screenshot_crop_scrim"
+        app:handleColor="?android:attr/colorAccent"
+        app:scrimColor="?android:colorBackgroundFloating"
+        app:scrimAlpha="128"
         app:containerBackgroundColor="?android:colorBackgroundFloating"
         tools:background="?android:colorBackground"
         tools:minHeight="100dp"
@@ -129,8 +130,9 @@
         app:layout_constraintTop_toTopOf="@id/preview"
         app:layout_constraintLeft_toLeftOf="parent"
         app:handleThickness="@dimen/screenshot_crop_handle_thickness"
-        app:handleColor="?androidprv:attr/colorAccentSecondary"
-        app:scrimColor="@color/screenshot_crop_scrim"
+        app:handleColor="?android:attr/colorAccent"
+        app:scrimColor="?android:colorBackgroundFloating"
+        app:scrimAlpha="128"
         app:borderThickness="4dp"
         app:borderColor="#fff"
         />
diff --git a/packages/SystemUI/res/layout/screen_record_dialog.xml b/packages/SystemUI/res/layout/screen_record_dialog.xml
index c1767ee..d1cc01f 100644
--- a/packages/SystemUI/res/layout/screen_record_dialog.xml
+++ b/packages/SystemUI/res/layout/screen_record_dialog.xml
@@ -28,6 +28,10 @@
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            android:paddingStart="24dp"
+            android:paddingEnd="24dp"
+            android:paddingTop="26dp"
+            android:paddingBottom="30dp"
             android:orientation="vertical">
 
             <!-- Header -->
@@ -35,27 +39,28 @@
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 android:orientation="vertical"
-                android:gravity="center"
-                android:padding="@dimen/screenrecord_dialog_padding">
+                android:gravity="center">
                 <ImageView
                     android:layout_width="@dimen/screenrecord_logo_size"
                     android:layout_height="@dimen/screenrecord_logo_size"
                     android:src="@drawable/ic_screenrecord"
-                    android:tint="@color/GM2_red_500"
-                    android:layout_marginBottom="@dimen/screenrecord_dialog_padding"/>
+                    android:tint="@color/screenrecord_icon_color"/>
                 <TextView
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:textAppearance="?android:attr/textAppearanceLarge"
                     android:fontFamily="@*android:string/config_headlineFontFamily"
-                    android:text="@string/screenrecord_start_label"/>
+                    android:text="@string/screenrecord_start_label"
+                    android:layout_marginTop="22dp"
+                    android:layout_marginBottom="15dp"/>
                 <TextView
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:text="@string/screenrecord_description"
                     android:textAppearance="?android:attr/textAppearanceSmall"
-                    android:paddingTop="@dimen/screenrecord_dialog_padding"
-                    android:paddingBottom="@dimen/screenrecord_dialog_padding"/>
+                    android:textColor="?android:textColorSecondary"
+                    android:gravity="center"
+                    android:layout_marginBottom="20dp"/>
 
                 <!-- Options -->
                 <LinearLayout
@@ -63,18 +68,21 @@
                     android:layout_height="wrap_content"
                     android:orientation="horizontal">
                     <ImageView
-                        android:layout_width="@dimen/screenrecord_logo_size"
-                        android:layout_height="@dimen/screenrecord_logo_size"
+                        android:layout_width="@dimen/screenrecord_option_icon_size"
+                        android:layout_height="@dimen/screenrecord_option_icon_size"
                         android:src="@drawable/ic_mic_26dp"
-                        android:tint="@color/GM2_grey_700"
+                        android:tint="?android:attr/textColorSecondary"
                         android:layout_gravity="center"
                         android:layout_weight="0"
-                        android:layout_marginRight="@dimen/screenrecord_dialog_padding"/>
+                        android:layout_marginRight="@dimen/screenrecord_option_padding"/>
                     <Spinner
                         android:id="@+id/screen_recording_options"
                         android:layout_width="0dp"
-                        android:layout_height="48dp"
+                        android:layout_height="wrap_content"
+                        android:minHeight="48dp"
                         android:layout_weight="1"
+                        android:popupBackground="@drawable/screenrecord_spinner_background"
+                        android:dropDownWidth="274dp"
                         android:prompt="@string/screenrecord_audio_label"/>
                     <Switch
                         android:layout_width="wrap_content"
@@ -83,63 +91,76 @@
                         android:layout_weight="0"
                         android:layout_gravity="end"
                         android:contentDescription="@string/screenrecord_audio_label"
-                        android:id="@+id/screenrecord_audio_switch"/>
+                        android:id="@+id/screenrecord_audio_switch"
+                        style="@style/ScreenRecord.Switch"/>
                 </LinearLayout>
 
                 <LinearLayout
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:orientation="horizontal">
+                    android:orientation="horizontal"
+                    android:layout_marginTop="@dimen/screenrecord_option_padding">
                     <ImageView
-                        android:layout_width="@dimen/screenrecord_logo_size"
-                        android:layout_height="@dimen/screenrecord_logo_size"
+                        android:layout_width="@dimen/screenrecord_option_icon_size"
+                        android:layout_height="@dimen/screenrecord_option_icon_size"
+                        android:layout_weight="0"
                         android:src="@drawable/ic_touch"
-                        android:tint="@color/GM2_grey_700"
+                        android:tint="?android:attr/textColorSecondary"
                         android:layout_gravity="center"
-                        android:layout_marginRight="@dimen/screenrecord_dialog_padding"/>
-                    <Switch
-                        android:layout_width="match_parent"
-                        android:layout_height="48dp"
-                        android:id="@+id/screenrecord_taps_switch"
+                        android:layout_marginRight="@dimen/screenrecord_option_padding"/>
+                    <TextView
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:minHeight="48dp"
+                        android:layout_weight="1"
                         android:text="@string/screenrecord_taps_label"
+                        android:textAppearance="?android:attr/textAppearanceMedium"
+                        android:fontFamily="@*android:string/config_headlineFontFamily"
                         android:textColor="?android:attr/textColorPrimary"
-                        android:textAppearance="?android:attr/textAppearanceSmall"/>
-
+                        android:importantForAccessibility="no"/>
+                    <Switch
+                        android:layout_width="wrap_content"
+                        android:minWidth="48dp"
+                        android:layout_height="48dp"
+                        android:layout_weight="0"
+                        android:id="@+id/screenrecord_taps_switch"
+                        android:contentDescription="@string/screenrecord_taps_label"
+                        style="@style/ScreenRecord.Switch"/>
                 </LinearLayout>
             </LinearLayout>
 
-            <!-- hr -->
-            <View
-                android:layout_width="match_parent"
-                android:layout_height="1dp"
-                android:background="@color/GM2_grey_300"/>
-
             <!-- Buttons -->
             <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:orientation="horizontal"
-                android:padding="@dimen/screenrecord_dialog_padding">
-                <Button
+                android:layout_marginTop="36dp">
+                <TextView
                     android:id="@+id/button_cancel"
                     android:layout_width="wrap_content"
-                    android:layout_height="match_parent"
+                    android:layout_height="wrap_content"
                     android:layout_weight="0"
                     android:layout_gravity="start"
                     android:text="@string/cancel"
-                    style="@android:style/Widget.DeviceDefault.Button.Borderless.Colored"/>
+                    android:textColor="?android:textColorPrimary"
+                    android:background="@drawable/screenrecord_button_background_outline"
+                    android:textAppearance="?android:attr/textAppearanceMedium"
+                    android:textSize="14sp"/>
                 <Space
                     android:layout_width="0dp"
                     android:layout_height="match_parent"
                     android:layout_weight="1"/>
-                <Button
+                <TextView
                     android:id="@+id/button_start"
                     android:layout_width="wrap_content"
-                    android:layout_height="match_parent"
+                    android:layout_height="wrap_content"
                     android:layout_weight="0"
                     android:layout_gravity="end"
                     android:text="@string/screenrecord_start"
-                    style="@android:style/Widget.DeviceDefault.Button.Colored"/>
+                    android:textColor="@android:color/system_neutral1_900"
+                    android:background="@drawable/screenrecord_button_background_solid"
+                    android:textAppearance="?android:attr/textAppearanceMedium"
+                    android:textSize="14sp"/>
             </LinearLayout>
         </LinearLayout>
     </ScrollView>
diff --git a/packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml b/packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml
index 0c4d5a2..ab600b3 100644
--- a/packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml
+++ b/packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml
@@ -19,18 +19,19 @@
     android:layout_width="250dp"
     android:layout_height="48dp"
     android:orientation="vertical"
-    android:padding="13dp">
+    android:padding="12dp">
     <TextView
         android:id="@+id/screen_recording_dialog_source_text"
-        android:layout_width="250dp"
+        android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_gravity="center_vertical"
-        android:textAppearance="?android:attr/textAppearanceSmall"
-        android:textColor="?android:attr/textColorPrimary"/>
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:textSize="14sp"
+        android:textColor="@android:color/system_neutral1_900"/>
     <TextView
         android:id="@+id/screen_recording_dialog_source_description"
-        android:layout_width="250dp"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:textAppearance="?android:attr/textAppearanceSmall"
-        android:textColor="?android:attr/textColorSecondary"/>
+        android:textColor="@android:color/system_neutral2_700"/>
 </LinearLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/screen_record_dialog_audio_source_selected.xml b/packages/SystemUI/res/layout/screen_record_dialog_audio_source_selected.xml
index fabe9e2..e2b8d33 100644
--- a/packages/SystemUI/res/layout/screen_record_dialog_audio_source_selected.xml
+++ b/packages/SystemUI/res/layout/screen_record_dialog_audio_source_selected.xml
@@ -24,7 +24,8 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:text="@string/screenrecord_audio_label"
-        android:textAppearance="?android:attr/textAppearanceSmall"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:fontFamily="@*android:string/config_headlineFontFamily"
         android:textColor="?android:attr/textColorPrimary"/>
     <TextView
         android:id="@+id/screen_recording_dialog_source_text"
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 568398c..8c02a0f 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -1145,8 +1145,7 @@
     <string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
     <string name="people_tile_description" msgid="8154966188085545556">"সাম্প্রতিক মেসেজ, মিসড কল এবং স্ট্যাটাস সংক্রান্ত আপডেট দেখুন"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"কথোপকথন"</string>
-    <!-- no translation found for paused_by_dnd (7856941866433556428) -->
-    <skip />
+    <string name="paused_by_dnd" msgid="7856941866433556428">"\'বিরক্ত করবে না\' মোডের মাধ্যমে পজ করা আছে"</string>
     <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> একটি মেসেজ পাঠিয়েছেন"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> একটি ছবি পাঠিয়েছেন"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ব্যাটারির মিটারের রিডিং নেওয়ার সময় সমস্যা হয়েছে"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 8403d40..f401fd4 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -1115,8 +1115,7 @@
     <string name="basic_status" msgid="2315371112182658176">"Open conversation"</string>
     <string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string>
     <string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your home screen"</string>
-    <!-- no translation found for no_conversations_text (5354115541282395015) -->
-    <skip />
+    <string name="no_conversations_text" msgid="5354115541282395015">"Your recent conversations will show up here"</string>
     <string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string>
     <string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string>
     <string name="okay" msgid="6490552955618608554">"OK"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index c104c2c..cef55f7 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -1115,8 +1115,7 @@
     <string name="basic_status" msgid="2315371112182658176">"Open conversation"</string>
     <string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string>
     <string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your home screen"</string>
-    <!-- no translation found for no_conversations_text (5354115541282395015) -->
-    <skip />
+    <string name="no_conversations_text" msgid="5354115541282395015">"Your recent conversations will show up here"</string>
     <string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string>
     <string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string>
     <string name="okay" msgid="6490552955618608554">"OK"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 8403d40..f401fd4 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -1115,8 +1115,7 @@
     <string name="basic_status" msgid="2315371112182658176">"Open conversation"</string>
     <string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string>
     <string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your home screen"</string>
-    <!-- no translation found for no_conversations_text (5354115541282395015) -->
-    <skip />
+    <string name="no_conversations_text" msgid="5354115541282395015">"Your recent conversations will show up here"</string>
     <string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string>
     <string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string>
     <string name="okay" msgid="6490552955618608554">"OK"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 8403d40..f401fd4 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -1115,8 +1115,7 @@
     <string name="basic_status" msgid="2315371112182658176">"Open conversation"</string>
     <string name="select_conversation_title" msgid="6716364118095089519">"Conversation widgets"</string>
     <string name="select_conversation_text" msgid="3376048251434956013">"Tap a conversation to add it to your home screen"</string>
-    <!-- no translation found for no_conversations_text (5354115541282395015) -->
-    <skip />
+    <string name="no_conversations_text" msgid="5354115541282395015">"Your recent conversations will show up here"</string>
     <string name="priority_conversations" msgid="3967482288896653039">"Priority conversations"</string>
     <string name="recent_conversations" msgid="8531874684782574622">"Recent conversations"</string>
     <string name="okay" msgid="6490552955618608554">"OK"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 9a66364..a6987f4 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -1145,8 +1145,7 @@
     <string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
     <string name="people_tile_description" msgid="8154966188085545556">"Affichez les messages récents, les appels manqués et les mises à jour d\'état"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
-    <!-- no translation found for paused_by_dnd (7856941866433556428) -->
-    <skip />
+    <string name="paused_by_dnd" msgid="7856941866433556428">"Interrompues par la fonctionnalité Ne pas déranger"</string>
     <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> a envoyé un message"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> a envoyé une image"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Un problème est survenu lors de la lecture du niveau de charge de la pile"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 25968ef..3f4d524 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -1115,8 +1115,7 @@
     <string name="basic_status" msgid="2315371112182658176">"વાતચીત ખોલો"</string>
     <string name="select_conversation_title" msgid="6716364118095089519">"વાતચીતના વિજેટ"</string>
     <string name="select_conversation_text" msgid="3376048251434956013">"તમારી હોમ સ્ક્રીનમાં વાતચીત ઉમેરવા માટે તેના પર ટૅપ કરો"</string>
-    <!-- no translation found for no_conversations_text (5354115541282395015) -->
-    <skip />
+    <string name="no_conversations_text" msgid="5354115541282395015">"તમારી તાજેતરની વાતચીતો અહીં બતાવવામાં આવશે"</string>
     <string name="priority_conversations" msgid="3967482288896653039">"પ્રાધાન્યતા ધરાવતી વાતચીતો"</string>
     <string name="recent_conversations" msgid="8531874684782574622">"તાજેતરની વાતચીતો"</string>
     <string name="okay" msgid="6490552955618608554">"ઓકે"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 894e6ee..47a9820 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -1115,8 +1115,7 @@
     <string name="basic_status" msgid="2315371112182658176">"ऐसी बातचीत जिसमें इंटरैक्शन डेटा मौजूद नहीं है"</string>
     <string name="select_conversation_title" msgid="6716364118095089519">"बातचीत विजेट"</string>
     <string name="select_conversation_text" msgid="3376048251434956013">"किसी बातचीत को होम स्क्रीन पर जोड़ने के लिए, उस बातचीत पर टैप करें"</string>
-    <!-- no translation found for no_conversations_text (5354115541282395015) -->
-    <skip />
+    <string name="no_conversations_text" msgid="5354115541282395015">"हाल ही में हुई बातचीत यहां दिखेंगी"</string>
     <string name="priority_conversations" msgid="3967482288896653039">"प्राथमिकता वाली बातचीत"</string>
     <string name="recent_conversations" msgid="8531874684782574622">"हाल ही में की गई बातचीत"</string>
     <string name="okay" msgid="6490552955618608554">"ठीक है"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 404a8a7..2063d43 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -1115,8 +1115,7 @@
     <string name="basic_status" msgid="2315371112182658176">"Բաց զրույց"</string>
     <string name="select_conversation_title" msgid="6716364118095089519">"Զրույցի վիջեթներ"</string>
     <string name="select_conversation_text" msgid="3376048251434956013">"Հպեք զրույցին՝ այն հիմնական էկրանին ավելացնելու համար"</string>
-    <!-- no translation found for no_conversations_text (5354115541282395015) -->
-    <skip />
+    <string name="no_conversations_text" msgid="5354115541282395015">"Ձեր վերջին զրույցները կցուցադրվեն այստեղ"</string>
     <string name="priority_conversations" msgid="3967482288896653039">"Կարևոր զրույցներ"</string>
     <string name="recent_conversations" msgid="8531874684782574622">"Վերջին հաղորդագրությունները"</string>
     <string name="okay" msgid="6490552955618608554">"Եղավ"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index c03c4b7..8cdc484 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -734,7 +734,7 @@
     <string name="notification_channel_summary_low" msgid="4860617986908931158">"Nessun suono o vibrazione"</string>
     <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Nessun suono o vibrazione e appare più in basso nella sezione delle conversazioni"</string>
     <string name="notification_channel_summary_default" msgid="3282930979307248890">"Può suonare o vibrare in base alle impostazioni del telefono"</string>
-    <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Può suonare o vibrare in base alle impostazioni del telefono. Conversazioni dalla bolla <xliff:g id="APP_NAME">%1$s</xliff:g> per impostazione predefinita."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Può suonare o vibrare in base alle impostazioni del telefono. Le conversazioni di <xliff:g id="APP_NAME">%1$s</xliff:g> appaiono come bolla per impostazione predefinita."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantiene la tua attenzione con una scorciatoia mobile a questi contenuti."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Fai stabilire al sistema se questa notifica deve emettere suoni o vibrazioni"</string>
     <string name="notification_channel_summary_automatic_alerted" msgid="954166812246932240">"&lt;b&gt;Stato:&lt;/b&gt; promossa a Predefinita"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 0742bf0..065167a 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -1115,8 +1115,7 @@
     <string name="basic_status" msgid="2315371112182658176">"空の会話"</string>
     <string name="select_conversation_title" msgid="6716364118095089519">"会話ウィジェット"</string>
     <string name="select_conversation_text" msgid="3376048251434956013">"会話をタップするとホーム画面に追加されます"</string>
-    <!-- no translation found for no_conversations_text (5354115541282395015) -->
-    <skip />
+    <string name="no_conversations_text" msgid="5354115541282395015">"最近の会話がここに表示されます"</string>
     <string name="priority_conversations" msgid="3967482288896653039">"優先度の高い会話"</string>
     <string name="recent_conversations" msgid="8531874684782574622">"最近の会話"</string>
     <string name="okay" msgid="6490552955618608554">"OK"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index daca7e5..41b6c44 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -1145,8 +1145,7 @@
     <string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
     <string name="people_tile_description" msgid="8154966188085545556">"ಇತ್ತೀಚಿನ ಸಂದೇಶಗಳು, ಮಿಸ್ಡ್ ಕಾಲ್‌ಗಳು ಮತ್ತು ಸ್ಥಿತಿ ಅಪ್‌ಡೇಟ್‌ಗಳು"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"ಸಂಭಾಷಣೆ"</string>
-    <!-- no translation found for paused_by_dnd (7856941866433556428) -->
-    <skip />
+    <string name="paused_by_dnd" msgid="7856941866433556428">"\'ಅಡಚಣೆ ಮಾಡಬೇಡಿ\' ನಿಂದ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
     <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> ಸಂದೇಶವನ್ನು ಕಳುಹಿಸಿದ್ದಾರೆ"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ಅವರು ಚಿತ್ರವನ್ನು ಕಳುಹಿಸಿದ್ದಾರೆ"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"ನಿಮ್ಮ ಬ್ಯಾಟರಿ ಮೀಟರ್ ಓದುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index fe8211a..27d6848 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -1115,8 +1115,7 @@
     <string name="basic_status" msgid="2315371112182658176">"ເປີດການສົນທະນາ"</string>
     <string name="select_conversation_title" msgid="6716364118095089519">"ວິດເຈັດການສົນທະນາ"</string>
     <string name="select_conversation_text" msgid="3376048251434956013">"ແຕະໃສ່ການສົນທະນາໃດໜຶ່ງເພື່ອເພີ່ມມັນໃສ່ໂຮມສະກຣີນຂອງທ່ານ"</string>
-    <!-- no translation found for no_conversations_text (5354115541282395015) -->
-    <skip />
+    <string name="no_conversations_text" msgid="5354115541282395015">"ການສົນທະນາຫຼ້າສຸດຂອງທ່ານຈະສະແດງຢູ່ບ່ອນນີ້"</string>
     <string name="priority_conversations" msgid="3967482288896653039">"ການສົນທະນາສຳຄັນ"</string>
     <string name="recent_conversations" msgid="8531874684782574622">"ການສົນທະນາຫຼ້າສຸດ"</string>
     <string name="okay" msgid="6490552955618608554">"ຕົກລົງ"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 83efb96..d96aa06 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -734,7 +734,7 @@
     <string name="notification_channel_summary_low" msgid="4860617986908931158">"ശബ്ദമോ വൈബ്രേഷനോ ഇല്ല"</string>
     <string name="notification_conversation_summary_low" msgid="1734433426085468009">"ശബ്‌ദമോ വൈബ്രേഷനോ ഇല്ല, സംഭാഷണ വിഭാഗത്തിന് താഴെയായി ദൃശ്യമാകും"</string>
     <string name="notification_channel_summary_default" msgid="3282930979307248890">"ഫോൺ ക്രമീകരണം അടിസ്ഥാനമാക്കി റിംഗ്/വൈബ്രേറ്റ് ചെയ്യും"</string>
-    <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"ഫോൺ ക്രമീകരണം അടിസ്ഥാനമാക്കി റിംഗ് ചെയ്‌തേക്കാം അല്ലെങ്കിൽ വൈബ്രേറ്റ് ചെയ്‌തേക്കാം. <xliff:g id="APP_NAME">%1$s</xliff:g>-ൽ നിന്നുള്ള സംഭാഷണങ്ങൾ ഡിഫോൾട്ടായി ബബിൾ ആവുന്നു."</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"ഫോൺ ക്രമീകരണം അടിസ്ഥാനമാക്കി റിംഗ്/വൈബ്രേറ്റ് ചെയ്‌തേക്കാം. <xliff:g id="APP_NAME">%1$s</xliff:g>-ൽ നിന്നുള്ള സംഭാഷണങ്ങൾ ഡിഫോൾട്ടായി ബബിൾ ചെയ്യുന്നു."</string>
     <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ഈ ഉള്ളടക്കത്തിലേക്ക് ഒരു ഫ്ലോട്ടിംഗ് കുറുക്കുവഴി ഉപയോഗിച്ച് നിങ്ങളുടെ ശ്രദ്ധ നിലനിർത്തുന്നു."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"ഈ അറിയിപ്പ് വരുമ്പോൾ ശബ്‌ദിക്കുകയാണോ വൈബ്രേറ്റ് ചെയ്യുകയാണോ വേണ്ടതെന്ന് നിർണ്ണയിക്കാൻ സിസ്‌റ്റത്തെ അനുവദിക്കുക"</string>
     <string name="notification_channel_summary_automatic_alerted" msgid="954166812246932240">"&lt;b&gt;നില:&lt;/b&gt; ഡിഫോൾട്ടാക്കി പ്രമോട്ട് ചെയ്‌തു"</string>
@@ -744,7 +744,7 @@
     <string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"സംഭാഷണ അറിയിപ്പുകളുടെ മുകളിലും സ്ക്രീൻ ലോക്കായിരിക്കുമ്പോൾ ഒരു പ്രൊഫൈൽ ചിത്രമായും കാണിക്കുന്നു"</string>
     <string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"സംഭാഷണ അറിയിപ്പുകളുടെ മുകളിലും സ്ക്രീൻ ലോക്കായിരിക്കുമ്പോൾ ഒരു പ്രൊഫൈൽ ചിത്രമായും കാണിക്കുന്നു, ഒരു ബബിൾ രൂപത്തിൽ ദൃശ്യമാകുന്നു"</string>
     <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"സംഭാഷണ അറിയിപ്പുകളുടെ മുകളിലും സ്ക്രീൻ ലോക്കായിരിക്കുമ്പോൾ ഒരു പ്രൊഫൈൽ ചിത്രമായും കാണിക്കുന്നു, ശല്യപ്പെടുത്തരുത് മോഡ് തടസ്സപ്പെടുത്തുന്നു"</string>
-    <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"സംഭാഷണ അറിയിപ്പുകളുടെ മുകളിലും സ്ക്രീൻ ലോക്കായിരിക്കുമ്പോൾ ഒരു പ്രൊഫൈൽ ചിത്രമായും കാണിക്കുന്നു, ഒരു ബബിൾ രൂപത്തിൽ ദൃശ്യമാകുന്നു, ശല്യപ്പെടുത്തരുത് മോഡ് തടസ്സപ്പെടുത്തുന്നു"</string>
+    <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"സംഭാഷണ അറിയിപ്പുകളുടെ മുകളിലും സ്ക്രീൻ ലോക്കായിരിക്കുമ്പോൾ ഒരു പ്രൊഫൈൽ ചിത്രമായും ബബിൾ രൂപത്തിൽ ദൃശ്യമാകുന്നു, ശല്യപ്പെടുത്തരുത് മോഡ് തടസ്സപ്പെടുത്തുന്നു"</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ക്രമീകരണം"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"മുൻഗണന"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"സംഭാഷണ ഫീച്ചറുകളെ <xliff:g id="APP_NAME">%1$s</xliff:g> പിന്തുണയ്‌ക്കുന്നില്ല"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 2e3db10..54d1a5f 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -1115,8 +1115,7 @@
     <string name="basic_status" msgid="2315371112182658176">"စကားဝိုင်းကို ဖွင့်ရန်"</string>
     <string name="select_conversation_title" msgid="6716364118095089519">"စကားဝိုင်း ဝိဂျက်များ"</string>
     <string name="select_conversation_text" msgid="3376048251434956013">"စကားဝိုင်းကို သင်၏ ‘ပင်မစာမျက်နှာ’ သို့ထည့်ရန် တို့ပါ"</string>
-    <!-- no translation found for no_conversations_text (5354115541282395015) -->
-    <skip />
+    <string name="no_conversations_text" msgid="5354115541282395015">"သင်၏မကြာသေးမီက စကားဝိုင်းများကို ဤနေရာတွင် ပြပါမည်"</string>
     <string name="priority_conversations" msgid="3967482288896653039">"ဦးစားပေး စကားဝိုင်းများ"</string>
     <string name="recent_conversations" msgid="8531874684782574622">"မကြာသေးမီက စကားဝိုင်းများ"</string>
     <string name="okay" msgid="6490552955618608554">"OK"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 4802686a..9d84910 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -749,8 +749,8 @@
     <string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Stanje:&lt;/b&gt; Uvrščeno nižje"</string>
     <string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Prikaz na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu"</string>
     <string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Prikaz v obliki oblačka na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu."</string>
-    <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Prikaz na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu, preglasitev načina Ne moti"</string>
-    <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Prikaz v obliki oblačka na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu, preglasitev načina Ne moti"</string>
+    <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Prikaz na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu, preglasitev načina Ne moti."</string>
+    <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Prikaz v obliki oblačka na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu, preglasitev načina Ne moti."</string>
     <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavitve"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prednostno"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podpira pogovornih funkcij."</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 2a91263..0ec1d1f 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -137,10 +137,10 @@
     <string name="accessibility_phone_button" msgid="4256353121703100427">"ஃபோன்"</string>
     <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"குரல் உதவி"</string>
     <string name="accessibility_wallet_button" msgid="1458258783460555507">"வாலட்"</string>
-    <string name="accessibility_unlock_button" msgid="122785427241471085">"திற"</string>
+    <string name="accessibility_unlock_button" msgid="122785427241471085">"அன்லாக் செய்"</string>
     <string name="accessibility_lock_icon" msgid="661492842417875775">"சாதனம் பூட்டப்பட்டுள்ளது"</string>
     <string name="accessibility_waiting_for_fingerprint" msgid="5209142744692162598">"கைரேகைக்காகக் காத்திருக்கிறது"</string>
-    <string name="accessibility_unlock_without_fingerprint" msgid="1811563723195375298">"உங்கள் கைரேகையைப் பயன்படுத்தாமல் திறக்கவும்"</string>
+    <string name="accessibility_unlock_without_fingerprint" msgid="1811563723195375298">"உங்கள் கைரேகையைப் பயன்படுத்தாமல் அன்லாக் செய்யுங்கள்"</string>
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"முகத்தை ஸ்கேன் செய்கிறது"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"அனுப்பு"</string>
     <string name="accessibility_manage_notification" msgid="582215815790143983">"அறிவிப்புகளை நிர்வகிக்கும் பட்டன்"</string>
@@ -586,10 +586,10 @@
     <string name="monitoring_description_app_work" msgid="3713084153786663662">"உங்கள் பணிக் கணக்கை <xliff:g id="ORGANIZATION">%1$s</xliff:g> நிர்வகிக்கிறது. மின்னஞ்சல்கள், ஆப்ஸ், இணையதளங்கள் உட்பட உங்கள் பணி நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய <xliff:g id="APPLICATION">%2$s</xliff:g> உடன் அது இணைக்கப்பட்டுள்ளது.\n\nமேலும் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
     <string name="monitoring_description_app_personal_work" msgid="6175816356939166101">"உங்கள் பணிக் கணக்கை <xliff:g id="ORGANIZATION">%1$s</xliff:g> நிர்வகிக்கிறது. மின்னஞ்சல்கள், ஆப்ஸ், இணையதளங்கள் உட்பட உங்கள் பணி நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> உடன் அது இணைக்கப்பட்டுள்ளது.\n\nஉங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> உடனும் இணைக்கப்பட்டுள்ளீர்கள்."</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent இதைத் திறந்தே வைத்துள்ளது"</string>
-    <string name="keyguard_indication_trust_disabled" msgid="6820793704816727918">"நீங்கள் கைமுறையாகத் திறக்கும் வரை, சாதனம் பூட்டப்பட்டிருக்கும்"</string>
+    <string name="keyguard_indication_trust_disabled" msgid="6820793704816727918">"நீங்கள் கைமுறையாக அன்லாக் செய்யும் வரை, சாதனம் பூட்டப்பட்டிருக்கும்"</string>
     <string name="keyguard_indication_trust_unlocked_plugged_in" msgid="2323452175329362855">"<xliff:g id="KEYGUARD_INDICATION">%1$s</xliff:g>\n<xliff:g id="POWER_INDICATION">%2$s</xliff:g>"</string>
     <string name="hidden_notifications_title" msgid="1782412844777612795">"விரைவாக அறிவிப்புகளைப் பெறுதல்"</string>
-    <string name="hidden_notifications_text" msgid="5899627470450792578">"திறக்கும் முன் அவற்றைப் பார்க்கவும்"</string>
+    <string name="hidden_notifications_text" msgid="5899627470450792578">"அன்லாக் செய்யும் முன் அவற்றைப் பார்க்கவும்"</string>
     <string name="hidden_notifications_cancel" msgid="4805370226181001278">"வேண்டாம்"</string>
     <string name="hidden_notifications_setup" msgid="2064795578526982467">"அமை"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index e63aaad..64b2113 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -1145,8 +1145,7 @@
     <string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
     <string name="people_tile_description" msgid="8154966188085545556">"ดูข้อความล่าสุด สายที่ไม่ได้รับ และการอัปเดตสถานะ"</string>
     <string name="people_tile_title" msgid="6589377493334871272">"การสนทนา"</string>
-    <!-- no translation found for paused_by_dnd (7856941866433556428) -->
-    <skip />
+    <string name="paused_by_dnd" msgid="7856941866433556428">"หยุดชั่วคราวโดยฟีเจอร์ห้ามรบกวน"</string>
     <string name="new_notification_text_content_description" msgid="5574393603145263727">"<xliff:g id="NAME">%1$s</xliff:g> ส่งข้อความ"</string>
     <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ส่งรูปภาพ"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"พบปัญหาในการอ่านเครื่องวัดแบตเตอรี่"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index d785bdf..0c1d6c6 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -1115,8 +1115,7 @@
     <string name="basic_status" msgid="2315371112182658176">"Suhbatni ochish"</string>
     <string name="select_conversation_title" msgid="6716364118095089519">"Suhbat vidjetlari"</string>
     <string name="select_conversation_text" msgid="3376048251434956013">"Bosh ekranga chiqariladigan suhbat ustiga bosing"</string>
-    <!-- no translation found for no_conversations_text (5354115541282395015) -->
-    <skip />
+    <string name="no_conversations_text" msgid="5354115541282395015">"Oxirgi suhbatlaringiz shu yerda chiqadi"</string>
     <string name="priority_conversations" msgid="3967482288896653039">"Muhim suhbatlar"</string>
     <string name="recent_conversations" msgid="8531874684782574622">"Oxirgi suhbatlar"</string>
     <string name="okay" msgid="6490552955618608554">"OK"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 9cd29ae..7f2edd9 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -1115,8 +1115,7 @@
     <string name="basic_status" msgid="2315371112182658176">"開啟對話"</string>
     <string name="select_conversation_title" msgid="6716364118095089519">"對話小工具"</string>
     <string name="select_conversation_text" msgid="3376048251434956013">"輕按對話即可新增至主畫面"</string>
-    <!-- no translation found for no_conversations_text (5354115541282395015) -->
-    <skip />
+    <string name="no_conversations_text" msgid="5354115541282395015">"您最近的對話會在這裡顯示"</string>
     <string name="priority_conversations" msgid="3967482288896653039">"優先對話"</string>
     <string name="recent_conversations" msgid="8531874684782574622">"最近的對話"</string>
     <string name="okay" msgid="6490552955618608554">"確定"</string>
diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml
index d2ed601..b5337d3 100644
--- a/packages/SystemUI/res/values/attrs.xml
+++ b/packages/SystemUI/res/values/attrs.xml
@@ -143,6 +143,8 @@
     <attr name="handleThickness" format="dimension" />
     <attr name="handleColor" format="color" />
     <attr name="scrimColor" format="color" />
+    <!-- Int [0,255] for the alpha to be applied to scrimColor -->
+    <attr name="scrimAlpha" format="integer" />
     <attr name="containerBackgroundColor" format="color" />
 
     <attr name="isVertical" format="boolean" />
@@ -179,6 +181,7 @@
         <attr name="handleThickness" />
         <attr name="handleColor" />
         <attr name="scrimColor" />
+        <attr name="scrimAlpha" />
         <attr name="containerBackgroundColor" />
     </declare-styleable>
 
@@ -186,6 +189,7 @@
         <attr name="handleThickness" />
         <attr name="handleColor" />
         <attr name="scrimColor" />
+        <attr name="scrimAlpha" />
         <attr name="borderThickness" format="dimension" />
         <attr name="borderColor" format="color" />
     </declare-styleable>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index e7edb0e..2260d21 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -199,9 +199,6 @@
     <color name="global_screenshot_button_ripple">#1f000000</color>
     <color name="global_screenshot_background_protection_start">#40000000</color> <!-- 25% black -->
 
-    <!-- Long screenshot UI -->
-    <color name="screenshot_crop_scrim">#6444</color>
-
     <!-- GM2 colors -->
     <color name="GM2_grey_50">#F8F9FA</color>
     <color name="GM2_grey_100">#F1F3F4</color>
@@ -272,6 +269,7 @@
     <color name="misalignment_text_color">#F28B82</color>
 
     <color name="screenrecord_status_color">#E94235</color>
+    <color name="screenrecord_icon_color">#D93025</color><!-- red 600 -->
 
     <color name="privacy_chip_background">#3ddc84</color>
 
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index ea54bb4..a526803 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -1398,9 +1398,11 @@
     <dimen name="controls_dialog_padding">32dp</dimen>
     <dimen name="controls_dialog_control_width">200dp</dimen>
 
-    <!-- Screen Record -->
-    <dimen name="screenrecord_dialog_padding">18dp</dimen>
-    <dimen name="screenrecord_logo_size">24dp</dimen>
+    <!-- Screen record dialog -->
+    <dimen name="screenrecord_option_padding">18dp</dimen>
+    <dimen name="screenrecord_logo_size">26dp</dimen>
+    <dimen name="screenrecord_option_icon_size">24dp</dimen>
+    <!-- Screen record status bar icon -->
     <dimen name="screenrecord_status_text_size">14sp</dimen>
     <dimen name="screenrecord_status_icon_radius">7dp</dimen>
     <dimen name="screenrecord_status_icon_width">21dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index bc1c67c..e705803 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1661,6 +1661,8 @@
     <string name="wallet_action_button_label_unlock">Unlock to pay</string>
     <!-- Secondary label of the quick access wallet tile if no card. [CHAR LIMIT=NONE] -->
     <string name="wallet_secondary_label_no_card">Not set up</string>
+    <!-- Secondary label of the quick access wallet tile if wallet is still updating. [CHAR LIMIT=NONE] -->
+    <string name="wallet_secondary_label_updating">Updating</string>
     <!-- Secondary label of the quick access wallet tile if device locked. [CHAR LIMIT=NONE] -->
     <string name="wallet_secondary_label_device_locked">Unlock to use</string>
     <!-- Message shown when an unknown failure occurred when fetching cards. [CHAR LIMIT=NONE] -->
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 6d25a5b..17a984e 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -697,6 +697,15 @@
         <item name="android:windowCloseOnTouchOutside">true</item>
     </style>
 
+    <style name="ScreenRecord.Switch">
+        <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
+        <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
+        <item name="android:switchMinWidth">52dp</item>
+        <item name="android:minHeight">48dp</item>
+        <item name="android:track">@drawable/settingslib_switch_track</item>
+        <item name="android:thumb">@drawable/settingslib_switch_thumb</item>
+    </style>
+
     <!-- Screenshots -->
     <style name="LongScreenshotActivity" parent="@android:style/Theme.DeviceDefault.DayNight">
         <item name="android:windowNoTitle">true</item>
diff --git a/packages/SystemUI/res/values/tiles_states_strings.xml b/packages/SystemUI/res/values/tiles_states_strings.xml
index 5ac7c1d..a0920bb 100644
--- a/packages/SystemUI/res/values/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values/tiles_states_strings.xml
@@ -40,9 +40,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_internet">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for wifi tile: unavailable, off, on.
@@ -50,9 +50,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_wifi">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for cell (data) tile: unavailable, off, on.
@@ -60,9 +60,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear.[CHAR LIMIT=32] -->
     <string-array name="tile_states_cell">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for battery (saver) tile: unavailable, off, on.
@@ -70,9 +70,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_battery">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for dnd (Do not disturb) tile: unavailable, off, on.
@@ -80,9 +80,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_dnd">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for flashlight tile: unavailable, off, on.
@@ -90,9 +90,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_flashlight">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for rotation (lock) tile: unavailable, off, on.
@@ -100,9 +100,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_rotation">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for bt (bluetooth) tile: unavailable, off, on.
@@ -110,16 +110,16 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_bt">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for airplane tile: unavailable, off, on [CHAR LIMIT=32] -->
     <string-array name="tile_states_airplane">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for location tile: unavailable, off, on.
@@ -127,9 +127,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_location">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for hotspot tile: unavailable, off, on.
@@ -137,9 +137,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_hotspot">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for (color) inversion tile: unavailable, off, on.
@@ -147,9 +147,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_inversion">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for (data) saver tile: unavailable, off, on.
@@ -157,9 +157,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_saver">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for dark (mode) tile: unavailable, off, on.
@@ -167,9 +167,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_dark">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for work (mode) tile: unavailable, off, on.
@@ -177,9 +177,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_work">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for cast tile: unavailable, off, on.
@@ -187,9 +187,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_cast">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for night (light) tile: unavailable, off, on.
@@ -197,9 +197,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_night">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for screenrecord tile: unavailable, off, on.
@@ -207,9 +207,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_screenrecord">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for reverse (charging) tile: unavailable, off, on.
@@ -217,9 +217,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_reverse">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for reduce_brightness tile: unavailable, off, on.
@@ -227,9 +227,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_reduce_brightness">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for cameratoggle tile: unavailable, off, on.
@@ -237,9 +237,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear.[CHAR LIMIT=32] -->
     <string-array name="tile_states_cameratoggle">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for mictoggle tile: unavailable, off, on.
@@ -247,9 +247,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_mictoggle">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for (home) controls tile: unavailable, off, on.
@@ -257,9 +257,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_controls">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for (quick access) wallet tile: unavailable, off, on.
@@ -267,9 +267,9 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_wallet">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 
     <!-- State names for alarm tile: unavailable, off, on.
@@ -277,8 +277,8 @@
          subtitle, so some of these may never appear on screen. They should still be translated as
          if they could appear. [CHAR LIMIT=32] -->
     <string-array name="tile_states_alarm">
-        <item>@string/tile_unavailable</item>
-        <item>@string/switch_bar_off</item>
-        <item>@string/switch_bar_on</item>
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
     </string-array>
 </resources>
\ No newline at end of file
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java
index 2b35bcd..c90833c 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java
@@ -345,7 +345,7 @@
                 // Create our own ClassLoader so we can use our own code as the parent.
                 ClassLoader classLoader = mManager.getClassLoader(info);
                 Context pluginContext = new PluginContextWrapper(
-                        mContext.createApplicationContext(info, 0), classLoader);
+                        mContext.createPackageContext(pkg, 0), classLoader);
                 Class<?> pluginClass = Class.forName(cls, true, classLoader);
                 // TODO: Only create the plugin before version check if we need it for
                 // legacy version check.
diff --git a/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java b/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
index 08076c1..4b3af34 100644
--- a/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
+++ b/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
@@ -94,7 +94,9 @@
         @Override
         public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
             if (mKeyguardShowing && !mIsCharging && charging) {
-                mView.animateCharge(mIsDozing);
+                mView.animateCharge(() -> {
+                    return mStatusBarStateController.isDozing();
+                });
             }
             mIsCharging = charging;
         }
diff --git a/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.java b/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.java
index 63867c0..58b3865 100644
--- a/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.java
+++ b/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.java
@@ -196,20 +196,20 @@
                 null /* onAnimationEnd */);
     }
 
-    void animateCharge(boolean isDozing) {
+    void animateCharge(DozeStateGetter dozeStateGetter) {
         if (mTextAnimator == null || mTextAnimator.isRunning()) {
             // Skip charge animation if dozing animation is already playing.
             return;
         }
         Runnable startAnimPhase2 = () -> setTextStyle(
-                isDozing ? mDozingWeight : mLockScreenWeight/* weight */,
+                dozeStateGetter.isDozing() ? mDozingWeight : mLockScreenWeight/* weight */,
                 -1,
                 null,
                 true /* animate */,
                 CHARGE_ANIM_DURATION_PHASE_1,
                 0 /* delay */,
                 null /* onAnimationEnd */);
-        setTextStyle(isDozing ? mLockScreenWeight : mDozingWeight/* weight */,
+        setTextStyle(dozeStateGetter.isDozing() ? mLockScreenWeight : mDozingWeight/* weight */,
                 -1,
                 null,
                 true /* animate */,
@@ -279,4 +279,8 @@
                 context.getResources().getConfiguration().locale);
         return dtpg.getBestPattern(skeleton);
     }
+
+    interface DozeStateGetter {
+        boolean isDozing();
+    }
 }
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
index 4827cab..fde8213 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
@@ -173,7 +173,7 @@
         @Override
         public void onSwipeUp() {
             if (!mUpdateMonitor.isFaceDetectionRunning()) {
-                mUpdateMonitor.requestFaceAuth();
+                mUpdateMonitor.requestFaceAuth(true);
                 mKeyguardSecurityCallback.userActivity();
                 showMessage(null, null);
             }
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index e2e221b..bd000b2 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -315,6 +315,7 @@
     private RingerModeTracker mRingerModeTracker;
     private int mFingerprintRunningState = BIOMETRIC_STATE_STOPPED;
     private int mFaceRunningState = BIOMETRIC_STATE_STOPPED;
+    private boolean mIsFaceAuthUserRequested;
     private LockPatternUtils mLockPatternUtils;
     private final IDreamManager mDreamManager;
     private boolean mIsDreaming;
@@ -1369,7 +1370,7 @@
                     Trace.endSection();
 
                     // on auth success, we sometimes never received an acquired haptic
-                    if (!mPlayedAcquiredHaptic) {
+                    if (!mPlayedAcquiredHaptic && isUdfpsEnrolled()) {
                         playAcquiredHaptic();
                     }
                 }
@@ -1387,7 +1388,9 @@
                 @Override
                 public void onAuthenticationAcquired(int acquireInfo) {
                     handleFingerprintAcquired(acquireInfo);
-                    if (acquireInfo == FingerprintManager.FINGERPRINT_ACQUIRED_GOOD) {
+                    if (acquireInfo == FingerprintManager.FINGERPRINT_ACQUIRED_GOOD
+                            && isUdfpsEnrolled()) {
+                        mPlayedAcquiredHaptic = true;
                         playAcquiredHaptic();
                     }
                 }
@@ -1402,20 +1405,23 @@
                 public void onUdfpsPointerUp(int sensorId) {
                     Log.d(TAG, "onUdfpsPointerUp, sensorId: " + sensorId);
                 }
-
-                private void playAcquiredHaptic() {
-                    if (mAcquiredHapticEnabled && mVibrator != null && isUdfpsEnrolled()) {
-                        mPlayedAcquiredHaptic = true;
-                        String effect = Settings.Global.getString(
-                                mContext.getContentResolver(),
-                                "udfps_acquired_type");
-                        mVibrator.vibrate(UdfpsController.getVibration(effect,
-                                UdfpsController.EFFECT_TICK),
-                                UdfpsController.VIBRATION_SONIFICATION_ATTRIBUTES);
-                    }
-                }
             };
 
+    /**
+     * Play haptic to signal udfps fingeprrint acquired.
+     */
+    @VisibleForTesting
+    public void playAcquiredHaptic() {
+        if (mAcquiredHapticEnabled && mVibrator != null) {
+            String effect = Settings.Global.getString(
+                    mContext.getContentResolver(),
+                    "udfps_acquired_type");
+            mVibrator.vibrate(UdfpsController.getVibration(effect,
+                    UdfpsController.EFFECT_TICK),
+                    UdfpsController.VIBRATION_SONIFICATION_ATTRIBUTES);
+        }
+    }
+
     private final FaceManager.FaceDetectionCallback mFaceDetectionCallback
             = (sensorId, userId, isStrongBiometric) -> {
                 // Trigger the face success path so the bouncer can be shown
@@ -2106,12 +2112,18 @@
     /**
      * Requests face authentication if we're on a state where it's allowed.
      * This will re-trigger auth in case it fails.
+     * @param userInitiatedRequest true if the user explicitly requested face auth
      */
-    public void requestFaceAuth() {
-        if (DEBUG) Log.d(TAG, "requestFaceAuth()");
+    public void requestFaceAuth(boolean userInitiatedRequest) {
+        if (DEBUG) Log.d(TAG, "requestFaceAuth() userInitiated=" + userInitiatedRequest);
+        mIsFaceAuthUserRequested |= userInitiatedRequest;
         updateFaceListeningState();
     }
 
+    public boolean isFaceAuthUserRequested() {
+        return mIsFaceAuthUserRequested;
+    }
+
     /**
      * In case face auth is running, cancel it.
      */
@@ -2128,6 +2140,7 @@
         mHandler.removeCallbacks(mRetryFaceAuthentication);
         boolean shouldListenForFace = shouldListenForFace();
         if (mFaceRunningState == BIOMETRIC_STATE_RUNNING && !shouldListenForFace) {
+            mIsFaceAuthUserRequested = false;
             stopListeningForFace();
         } else if (mFaceRunningState != BIOMETRIC_STATE_RUNNING && shouldListenForFace) {
             startListeningForFace();
diff --git a/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt b/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt
index fe31a7b..c9e6771 100644
--- a/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt
+++ b/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt
@@ -29,6 +29,7 @@
 import android.util.Log
 import com.android.systemui.controls.controller.AuxiliaryPersistenceWrapper
 import com.android.systemui.controls.controller.ControlsFavoritePersistenceWrapper
+import com.android.systemui.people.widget.PeopleBackupHelper
 
 /**
  * Helper for backing up elements in SystemUI
@@ -45,18 +46,29 @@
         private const val TAG = "BackupHelper"
         internal const val CONTROLS = ControlsFavoritePersistenceWrapper.FILE_NAME
         private const val NO_OVERWRITE_FILES_BACKUP_KEY = "systemui.files_no_overwrite"
+        private const val PEOPLE_TILES_BACKUP_KEY = "systemui.people.shared_preferences"
         val controlsDataLock = Any()
         const val ACTION_RESTORE_FINISHED = "com.android.systemui.backup.RESTORE_FINISHED"
         private const val PERMISSION_SELF = "com.android.systemui.permission.SELF"
     }
 
-    override fun onCreate() {
+    override fun onCreate(userHandle: UserHandle, operationType: Int) {
         super.onCreate()
         // The map in mapOf is guaranteed to be order preserving
         val controlsMap = mapOf(CONTROLS to getPPControlsFile(this))
         NoOverwriteFileBackupHelper(controlsDataLock, this, controlsMap).also {
             addHelper(NO_OVERWRITE_FILES_BACKUP_KEY, it)
         }
+
+        // Conversations widgets backup only works for system user, because widgets' information is
+        // stored in system user's SharedPreferences files and we can't open those from other users.
+        if (!userHandle.isSystem) {
+            return
+        }
+
+        val keys = PeopleBackupHelper.getFilesToBackup()
+        addHelper(PEOPLE_TILES_BACKUP_KEY, PeopleBackupHelper(
+                this, userHandle, keys.toTypedArray()))
     }
 
     override fun onRestoreFinished() {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index 3d2c4e1..2d04d8d 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -430,21 +430,7 @@
                             mTouchLogTime = SystemClock.elapsedRealtime();
                             mPowerManager.userActivity(SystemClock.uptimeMillis(),
                                     PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
-
-                            // TODO: this should eventually be removed after ux testing
-                            if (mVibrator != null) {
-                                final ContentResolver contentResolver =
-                                        mContext.getContentResolver();
-                                int startEnabled = Settings.Global.getInt(contentResolver,
-                                        "udfps_start", 1);
-                                if (startEnabled > 0) {
-                                    String startEffectSetting = Settings.Global.getString(
-                                            contentResolver, "udfps_start_type");
-                                    mVibrator.vibrate(getVibration(startEffectSetting,
-                                            EFFECT_CLICK), VIBRATION_SONIFICATION_ATTRIBUTES);
-                                }
-                            }
-
+                            playStartHaptic();
                             handled = true;
                         } else if (sinceLastLog >= MIN_TOUCH_LOG_INTERVAL) {
                             Log.v(TAG, "onTouch | finger move: " + touchInfo);
@@ -498,6 +484,7 @@
             @NonNull LockscreenShadeTransitionController lockscreenShadeTransitionController,
             @NonNull ScreenLifecycle screenLifecycle,
             @Nullable Vibrator vibrator,
+            @NonNull UdfpsHapticsSimulator udfpsHapticsSimulator,
             @NonNull Optional<UdfpsHbmProvider> hbmProvider) {
         mContext = context;
         mExecution = execution;
@@ -544,6 +531,29 @@
         final IntentFilter filter = new IntentFilter();
         filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
         context.registerReceiver(mBroadcastReceiver, filter);
+
+        udfpsHapticsSimulator.setUdfpsController(this);
+    }
+
+    /**
+     * Play haptic to signal udfps scanning started.
+     */
+    @VisibleForTesting
+    public void playStartHaptic() {
+        if (mVibrator != null) {
+            final ContentResolver contentResolver =
+                    mContext.getContentResolver();
+            // TODO: these settings checks should eventually be removed after ux testing
+            //  (b/185124905)
+            int startEnabled = Settings.Global.getInt(contentResolver,
+                    "udfps_start", 1);
+            if (startEnabled > 0) {
+                String startEffectSetting = Settings.Global.getString(
+                        contentResolver, "udfps_start_type");
+                mVibrator.vibrate(getVibration(startEffectSetting,
+                        EFFECT_CLICK), VIBRATION_SONIFICATION_ATTRIBUTES);
+            }
+        }
     }
 
     private int getCoreLayoutParamFlags() {
@@ -836,7 +846,6 @@
         }
     }
 
-
     /**
      * get vibration to play given string
      * used for testing purposes (b/185124905)
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHapticsSimulator.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHapticsSimulator.kt
new file mode 100644
index 0000000..ea2bbfa
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHapticsSimulator.kt
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2021 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.biometrics
+
+import android.media.AudioAttributes
+import android.os.VibrationEffect
+import android.os.Vibrator
+
+import com.android.keyguard.KeyguardUpdateMonitor
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.statusbar.commandline.Command
+import com.android.systemui.statusbar.commandline.CommandRegistry
+
+import java.io.PrintWriter
+
+import javax.inject.Inject
+
+/**
+ * Used to simulate haptics that may be used for udfps authentication.
+ */
+@SysUISingleton
+class UdfpsHapticsSimulator @Inject constructor(
+    commandRegistry: CommandRegistry,
+    val vibrator: Vibrator?,
+    val keyguardUpdateMonitor: KeyguardUpdateMonitor
+) : Command {
+    val sonificationEffects =
+        AudioAttributes.Builder()
+            .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+            .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
+            .build()
+    var udfpsController: UdfpsController? = null
+
+    init {
+        commandRegistry.registerCommand("udfps-haptic") { this }
+    }
+
+    override fun execute(pw: PrintWriter, args: List<String>) {
+        if (args.isEmpty()) {
+            invalidCommand(pw)
+        } else {
+            when (args[0]) {
+                "start" -> {
+                    udfpsController?.playStartHaptic()
+                }
+                "acquired" -> {
+                    keyguardUpdateMonitor.playAcquiredHaptic()
+                }
+                "success" -> {
+                    // needs to be kept up to date with AcquisitionClient#SUCCESS_VIBRATION_EFFECT
+                    vibrator?.vibrate(
+                        VibrationEffect.get(VibrationEffect.EFFECT_CLICK),
+                        sonificationEffects)
+                }
+                "error" -> {
+                    // needs to be kept up to date with AcquisitionClient#ERROR_VIBRATION_EFFECT
+                    vibrator?.vibrate(
+                        VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK),
+                        sonificationEffects)
+                }
+                else -> invalidCommand(pw)
+            }
+        }
+    }
+
+    override fun help(pw: PrintWriter) {
+        pw.println("Usage: adb shell cmd statusbar udfps-haptic <haptic>")
+        pw.println("Available commands:")
+        pw.println("  start")
+        pw.println("  acquired")
+        pw.println("  success, always plays CLICK haptic")
+        pw.println("  error, always plays DOUBLE_CLICK haptic")
+    }
+
+    fun invalidCommand(pw: PrintWriter) {
+        pw.println("invalid command")
+        help(pw)
+    }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
index e37d3d5..a641ad4 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
@@ -30,7 +30,6 @@
 import android.widget.TextView;
 
 import com.android.internal.R;
-import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.settingslib.Utils;
 import com.android.systemui.plugins.GlobalActions;
 import com.android.systemui.scrim.ScrimDrawable;
@@ -51,7 +50,6 @@
     private final KeyguardStateController mKeyguardStateController;
     private final DeviceProvisionedController mDeviceProvisionedController;
     private final BlurUtils mBlurUtils;
-    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
     private final CommandQueue mCommandQueue;
     private GlobalActionsDialogLite mGlobalActionsDialog;
     private boolean mDisabled;
@@ -60,15 +58,13 @@
     public GlobalActionsImpl(Context context, CommandQueue commandQueue,
             Lazy<GlobalActionsDialogLite> globalActionsDialogLazy, BlurUtils blurUtils,
             KeyguardStateController keyguardStateController,
-            DeviceProvisionedController deviceProvisionedController,
-            KeyguardUpdateMonitor keyguardUpdateMonitor) {
+            DeviceProvisionedController deviceProvisionedController) {
         mContext = context;
         mGlobalActionsDialogLazy = globalActionsDialogLazy;
         mKeyguardStateController = keyguardStateController;
         mDeviceProvisionedController = deviceProvisionedController;
         mCommandQueue = commandQueue;
         mBlurUtils = blurUtils;
-        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
         mCommandQueue.addCallback(this);
     }
 
@@ -87,7 +83,6 @@
         mGlobalActionsDialog = mGlobalActionsDialogLazy.get();
         mGlobalActionsDialog.showOrHideDialog(mKeyguardStateController.isShowing(),
                 mDeviceProvisionedController.isDeviceProvisioned());
-        mKeyguardUpdateMonitor.requestFaceAuth();
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndication.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndication.java
index 2873cd3..9b83b75 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndication.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndication.java
@@ -40,18 +40,22 @@
     private final View.OnClickListener mOnClickListener;
     @Nullable
     private final Drawable mBackground;
+    @Nullable
+    private final Long mMinVisibilityMillis; // in milliseconds
 
     private KeyguardIndication(
             CharSequence message,
             ColorStateList textColor,
             Drawable icon,
             View.OnClickListener onClickListener,
-            Drawable background) {
+            Drawable background,
+            Long minVisibilityMillis) {
         mMessage = message;
         mTextColor = textColor;
         mIcon = icon;
         mOnClickListener = onClickListener;
         mBackground = background;
+        mMinVisibilityMillis = minVisibilityMillis;
     }
 
     /**
@@ -89,6 +93,14 @@
         return mBackground;
     }
 
+    /**
+     * Minimum time to show text in milliseconds.
+     * @return null if unspecified
+     */
+    public @Nullable Long getMinVisibilityMillis() {
+        return mMinVisibilityMillis;
+    }
+
     @Override
     public String toString() {
         String str = "KeyguardIndication{";
@@ -96,6 +108,7 @@
         if (mIcon != null) str += " mIcon=" + mIcon;
         if (mOnClickListener != null) str += " mOnClickListener=" + mOnClickListener;
         if (mBackground != null) str += " mBackground=" + mBackground;
+        if (mMinVisibilityMillis != null) str += " mMinVisibilityMillis=" + mMinVisibilityMillis;
         str += "}";
         return str;
     }
@@ -109,6 +122,7 @@
         private View.OnClickListener mOnClickListener;
         private ColorStateList mTextColor;
         private Drawable mBackground;
+        private Long mMinVisibilityMillis;
 
         public Builder() { }
 
@@ -155,6 +169,15 @@
         }
 
         /**
+         * Optional. Set a required minimum visibility time in milliseconds for the text
+         * to show.
+         */
+        public Builder setMinVisibilityMillis(Long minVisibilityMillis) {
+            this.mMinVisibilityMillis = minVisibilityMillis;
+            return this;
+        }
+
+        /**
          * Build the KeyguardIndication.
          */
         public KeyguardIndication build() {
@@ -166,7 +189,8 @@
             }
 
             return new KeyguardIndication(
-                    mMessage, mTextColor, mIcon, mOnClickListener, mBackground);
+                    mMessage, mTextColor, mIcon, mOnClickListener, mBackground,
+                    mMinVisibilityMillis);
         }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewController.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewController.java
index fc5f3b8..df9977f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardIndicationRotateTextViewController.java
@@ -167,12 +167,14 @@
      * - can be presented with an "error" color if isError is true
      */
     public void showTransient(CharSequence newIndication, boolean isError) {
+        final long inAnimationDuration = 600L; // see KeyguardIndicationTextView.getYInDuration
         updateIndication(INDICATION_TYPE_TRANSIENT,
                 new KeyguardIndication.Builder()
                         .setMessage(newIndication)
                         .setTextColor(isError
                                 ? Utils.getColorError(getContext())
                                 : mInitialTextColorState)
+                        .setMinVisibilityMillis(2000L + inAnimationDuration)
                         .build(),
                 /* showImmediately */true);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index c6fd20e..b5fd739 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -2161,6 +2161,15 @@
             if (!mHiding
                     && !mSurfaceBehindRemoteAnimationRequested
                     && !mKeyguardStateController.isFlingingToDismissKeyguardDuringSwipeGesture()) {
+                if (finishedCallback != null) {
+                    // There will not execute animation, send a finish callback to ensure the remote
+                    // animation won't hanging there.
+                    try {
+                        finishedCallback.onAnimationFinished();
+                    } catch (RemoteException e) {
+                        Slog.w(TAG, "Failed to call onAnimationFinished", e);
+                    }
+                }
                 setShowingLocked(mShowing, true /* force */);
                 return;
             }
@@ -2178,12 +2187,6 @@
                 mDrawnCallback = null;
             }
 
-            // only play "unlock" noises if not on a call (since the incall UI
-            // disables the keyguard)
-            if (TelephonyManager.EXTRA_STATE_IDLE.equals(mPhoneState)) {
-                playSounds(false);
-            }
-
             LatencyTracker.getInstance(mContext)
                     .onActionEnd(LatencyTracker.ACTION_LOCKSCREEN_UNLOCK);
 
@@ -2301,6 +2304,13 @@
     }
 
     private void onKeyguardExitFinished() {
+        // only play "unlock" noises if not on a call (since the incall UI
+        // disables the keyguard)
+        if (TelephonyManager.EXTRA_STATE_IDLE.equals(mPhoneState)) {
+            Log.i("TEST", "playSounds: false");
+            playSounds(false);
+        }
+
         setShowingLocked(false);
         mWakeAndUnlocking = false;
         mDismissCallbackRegistry.notifyDismissSucceeded();
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
index 19a67e9..a3d7a81 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
@@ -347,10 +347,11 @@
         artistText.setText(data.getArtist());
 
         // Transfer chip
-        mPlayerViewHolder.getSeamless().setVisibility(View.VISIBLE);
+        ViewGroup seamlessView = mPlayerViewHolder.getSeamless();
+        seamlessView.setVisibility(View.VISIBLE);
         setVisibleAndAlpha(collapsedSet, R.id.media_seamless, true /*visible */);
         setVisibleAndAlpha(expandedSet, R.id.media_seamless, true /*visible */);
-        mPlayerViewHolder.getSeamless().setOnClickListener(v -> {
+        seamlessView.setOnClickListener(v -> {
             mMediaOutputDialogFactory.create(data.getPackageName(), true);
         });
 
@@ -374,9 +375,9 @@
         collapsedSet.setAlpha(seamlessId, seamlessAlpha);
         // Disable clicking on output switcher for resumption controls.
         mPlayerViewHolder.getSeamless().setEnabled(!data.getResumption());
+        String deviceString = null;
         if (showFallback) {
             iconView.setImageDrawable(null);
-            deviceName.setText(null);
         } else if (device != null) {
             Drawable icon = device.getIcon();
             iconView.setVisibility(View.VISIBLE);
@@ -387,13 +388,16 @@
             } else {
                 iconView.setImageDrawable(icon);
             }
-            deviceName.setText(device.getName());
+            deviceString = device.getName();
         } else {
             // Reset to default
             Log.w(TAG, "device is null. Not binding output chip.");
             iconView.setVisibility(View.GONE);
-            deviceName.setText(com.android.internal.R.string.ext_media_seamless_action);
+            deviceString = mContext.getString(
+                    com.android.internal.R.string.ext_media_seamless_action);
         }
+        deviceName.setText(deviceString);
+        seamlessView.setContentDescription(deviceString);
 
         List<Integer> actionsWhenCollapsed = data.getActionsToShowInCompact();
         // Media controls
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleBackupFollowUpJob.java b/packages/SystemUI/src/com/android/systemui/people/PeopleBackupFollowUpJob.java
new file mode 100644
index 0000000..452484f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleBackupFollowUpJob.java
@@ -0,0 +1,229 @@
+/*
+ * Copyright (C) 2021 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.people;
+
+import static com.android.systemui.people.PeopleSpaceUtils.DEBUG;
+import static com.android.systemui.people.PeopleSpaceUtils.EMPTY_STRING;
+import static com.android.systemui.people.PeopleSpaceUtils.removeSharedPreferencesStorageForTile;
+import static com.android.systemui.people.widget.PeopleBackupHelper.isReadyForRestore;
+
+import android.app.job.JobInfo;
+import android.app.job.JobParameters;
+import android.app.job.JobScheduler;
+import android.app.job.JobService;
+import android.app.people.IPeopleManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.os.PersistableBundle;
+import android.os.ServiceManager;
+import android.preference.PreferenceManager;
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.systemui.people.widget.PeopleBackupHelper;
+import com.android.systemui.people.widget.PeopleTileKey;
+
+import java.time.Duration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Follow-up job that runs after a Conversations widgets restore operation. Check if shortcuts that
+ * were not available before are now available. If any shortcut doesn't become available after
+ * 1 day, we clean up its storage.
+ */
+public class PeopleBackupFollowUpJob extends JobService {
+    private static final String TAG = "PeopleBackupFollowUpJob";
+    private static final String START_DATE = "start_date";
+
+    /** Follow-up job id. */
+    public static final int JOB_ID = 74823873;
+
+    private static final long JOB_PERIODIC_DURATION = Duration.ofHours(6).toMillis();
+    private static final long CLEAN_UP_STORAGE_AFTER_DURATION = Duration.ofHours(24).toMillis();
+
+    /** SharedPreferences file name for follow-up specific storage.*/
+    public static final String SHARED_FOLLOW_UP = "shared_follow_up";
+
+    private final Object mLock = new Object();
+    private Context mContext;
+    private PackageManager mPackageManager;
+    private IPeopleManager mIPeopleManager;
+    private JobScheduler mJobScheduler;
+
+    /** Schedules a PeopleBackupFollowUpJob every 2 hours. */
+    public static void scheduleJob(Context context) {
+        JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
+        PersistableBundle bundle = new PersistableBundle();
+        bundle.putLong(START_DATE, System.currentTimeMillis());
+        JobInfo jobInfo = new JobInfo
+                .Builder(JOB_ID, new ComponentName(context, PeopleBackupFollowUpJob.class))
+                .setPeriodic(JOB_PERIODIC_DURATION)
+                .setExtras(bundle)
+                .build();
+        jobScheduler.schedule(jobInfo);
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        mContext = getApplicationContext();
+        mPackageManager = getApplicationContext().getPackageManager();
+        mIPeopleManager = IPeopleManager.Stub.asInterface(
+                ServiceManager.getService(Context.PEOPLE_SERVICE));
+        mJobScheduler = mContext.getSystemService(JobScheduler.class);
+
+    }
+
+    /** Sets necessary managers for testing. */
+    @VisibleForTesting
+    public void setManagers(Context context, PackageManager packageManager,
+            IPeopleManager iPeopleManager, JobScheduler jobScheduler) {
+        mContext = context;
+        mPackageManager = packageManager;
+        mIPeopleManager = iPeopleManager;
+        mJobScheduler = jobScheduler;
+    }
+
+    @Override
+    public boolean onStartJob(JobParameters params) {
+        if (DEBUG) Log.d(TAG, "Starting job.");
+        synchronized (mLock) {
+            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
+            SharedPreferences.Editor editor = sp.edit();
+            SharedPreferences followUp = this.getSharedPreferences(
+                    SHARED_FOLLOW_UP, Context.MODE_PRIVATE);
+            SharedPreferences.Editor followUpEditor = followUp.edit();
+
+            // Remove from SHARED_FOLLOW_UP storage all widgets that are now ready to be updated.
+            Map<String, Set<String>> remainingWidgets =
+                    processFollowUpFile(followUp, followUpEditor);
+
+            // Check if all widgets were restored or if enough time elapsed to cancel the job.
+            long start = params.getExtras().getLong(START_DATE);
+            long now = System.currentTimeMillis();
+            if (shouldCancelJob(remainingWidgets, start, now)) {
+                cancelJobAndClearRemainingWidgets(remainingWidgets, followUpEditor, sp);
+            }
+
+            editor.apply();
+            followUpEditor.apply();
+        }
+
+        // Ensure all widgets modified from SHARED_FOLLOW_UP storage are now updated.
+        PeopleBackupHelper.updateWidgets(mContext);
+        return false;
+    }
+
+    /**
+     * Iterates through follow-up file entries and checks which shortcuts are now available.
+     * Returns a map of shortcuts that should be checked at a later time.
+     */
+    public Map<String, Set<String>> processFollowUpFile(SharedPreferences followUp,
+            SharedPreferences.Editor followUpEditor) {
+        Map<String, Set<String>> remainingWidgets = new HashMap<>();
+        Map<String, ?> all = followUp.getAll();
+        for (Map.Entry<String, ?> entry : all.entrySet()) {
+            String key = entry.getKey();
+
+            PeopleTileKey peopleTileKey = PeopleTileKey.fromString(key);
+            boolean restored = isReadyForRestore(mIPeopleManager, mPackageManager, peopleTileKey);
+            if (restored) {
+                if (DEBUG) Log.d(TAG, "Removing key from follow-up: " + key);
+                followUpEditor.remove(key);
+                continue;
+            }
+
+            if (DEBUG) Log.d(TAG, "Key should not be restored yet, try later: " + key);
+            try {
+                remainingWidgets.put(entry.getKey(), (Set<String>) entry.getValue());
+            } catch (Exception e) {
+                Log.e(TAG, "Malformed entry value: " + entry.getValue());
+            }
+        }
+        return remainingWidgets;
+    }
+
+    /** Returns whether all shortcuts were restored or if enough time elapsed to cancel the job. */
+    public boolean shouldCancelJob(Map<String, Set<String>> remainingWidgets,
+            long start, long now) {
+        if (remainingWidgets.isEmpty()) {
+            if (DEBUG) Log.d(TAG, "All widget storage was successfully restored.");
+            return true;
+        }
+
+        boolean oneDayHasPassed = (now - start) > CLEAN_UP_STORAGE_AFTER_DURATION;
+        if (oneDayHasPassed) {
+            if (DEBUG) {
+                Log.w(TAG, "One or more widgets were not properly restored, "
+                        + "but cancelling job because it has been a day.");
+            }
+            return true;
+        }
+        if (DEBUG) Log.d(TAG, "There are still non-restored widgets, run job again.");
+        return false;
+    }
+
+    /** Cancels job and removes storage of any shortcut that was not restored. */
+    public void cancelJobAndClearRemainingWidgets(Map<String, Set<String>> remainingWidgets,
+            SharedPreferences.Editor followUpEditor, SharedPreferences sp) {
+        if (DEBUG) Log.d(TAG, "Cancelling follow up job.");
+        removeUnavailableShortcutsFromSharedStorage(remainingWidgets, sp);
+        followUpEditor.clear();
+        mJobScheduler.cancel(JOB_ID);
+    }
+
+    private void removeUnavailableShortcutsFromSharedStorage(Map<String,
+            Set<String>> remainingWidgets, SharedPreferences sp) {
+        for (Map.Entry<String, Set<String>> entry : remainingWidgets.entrySet()) {
+            PeopleTileKey peopleTileKey = PeopleTileKey.fromString(entry.getKey());
+            if (!PeopleTileKey.isValid(peopleTileKey)) {
+                Log.e(TAG, "Malformed peopleTileKey in follow-up file: " + entry.getKey());
+                continue;
+            }
+            Set<String> widgetIds;
+            try {
+                widgetIds = (Set<String>) entry.getValue();
+            } catch (Exception e) {
+                Log.e(TAG, "Malformed widget ids in follow-up file: " + e);
+                continue;
+            }
+            for (String id : widgetIds) {
+                int widgetId;
+                try {
+                    widgetId = Integer.parseInt(id);
+                } catch (NumberFormatException ex) {
+                    Log.e(TAG, "Malformed widget id in follow-up file: " + ex);
+                    continue;
+                }
+
+                String contactUriString = sp.getString(String.valueOf(widgetId), EMPTY_STRING);
+                removeSharedPreferencesStorageForTile(
+                        mContext, peopleTileKey, widgetId, contactUriString);
+            }
+        }
+    }
+
+    @Override
+    public boolean onStopJob(JobParameters params) {
+        return false;
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
index 917a060..dcab86b 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
@@ -25,6 +25,7 @@
 
 import android.annotation.Nullable;
 import android.app.Notification;
+import android.app.backup.BackupManager;
 import android.app.people.ConversationChannel;
 import android.app.people.IPeopleManager;
 import android.app.people.PeopleSpaceTile;
@@ -89,7 +90,7 @@
 
     /** Returns stored widgets for the conversation specified. */
     public static Set<String> getStoredWidgetIds(SharedPreferences sp, PeopleTileKey key) {
-        if (!key.isValid()) {
+        if (!PeopleTileKey.isValid(key)) {
             return new HashSet<>();
         }
         return new HashSet<>(sp.getStringSet(key.toString(), new HashSet<>()));
@@ -97,19 +98,16 @@
 
     /** Sets all relevant storage for {@code appWidgetId} association to {@code tile}. */
     public static void setSharedPreferencesStorageForTile(Context context, PeopleTileKey key,
-            int appWidgetId, Uri contactUri) {
-        if (!key.isValid()) {
+            int appWidgetId, Uri contactUri, BackupManager backupManager) {
+        if (!PeopleTileKey.isValid(key)) {
             Log.e(TAG, "Not storing for invalid key");
             return;
         }
         // Write relevant persisted storage.
         SharedPreferences widgetSp = context.getSharedPreferences(String.valueOf(appWidgetId),
                 Context.MODE_PRIVATE);
-        SharedPreferences.Editor widgetEditor = widgetSp.edit();
-        widgetEditor.putString(PeopleSpaceUtils.PACKAGE_NAME, key.getPackageName());
-        widgetEditor.putString(PeopleSpaceUtils.SHORTCUT_ID, key.getShortcutId());
-        widgetEditor.putInt(PeopleSpaceUtils.USER_ID, key.getUserId());
-        widgetEditor.apply();
+        SharedPreferencesHelper.setPeopleTileKey(widgetSp, key);
+
         SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
         SharedPreferences.Editor editor = sp.edit();
         String contactUriString = contactUri == null ? EMPTY_STRING : contactUri.toString();
@@ -117,14 +115,18 @@
 
         // Don't overwrite existing widgets with the same key.
         addAppWidgetIdForKey(sp, editor, appWidgetId, key.toString());
-        addAppWidgetIdForKey(sp, editor, appWidgetId, contactUriString);
+        if (!TextUtils.isEmpty(contactUriString)) {
+            addAppWidgetIdForKey(sp, editor, appWidgetId, contactUriString);
+        }
         editor.apply();
+        backupManager.dataChanged();
     }
 
     /** Removes stored data when tile is deleted. */
     public static void removeSharedPreferencesStorageForTile(Context context, PeopleTileKey key,
             int widgetId, String contactUriString) {
         // Delete widgetId mapping to key.
+        if (DEBUG) Log.d(TAG, "Removing widget info from sharedPrefs");
         SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
         SharedPreferences.Editor editor = sp.edit();
         editor.remove(String.valueOf(widgetId));
@@ -230,7 +232,7 @@
      */
     public static PeopleSpaceTile augmentTileFromNotification(Context context, PeopleSpaceTile tile,
             PeopleTileKey key, NotificationEntry notificationEntry, int messagesCount,
-            Optional<Integer> appWidgetId) {
+            Optional<Integer> appWidgetId, BackupManager backupManager) {
         if (notificationEntry == null || notificationEntry.getSbn().getNotification() == null) {
             if (DEBUG) Log.d(TAG, "Tile key: " + key.toString() + ". Notification is null");
             return removeNotificationFields(tile);
@@ -246,7 +248,7 @@
             Uri contactUri = Uri.parse(uriFromNotification);
             // Update storage.
             setSharedPreferencesStorageForTile(context, new PeopleTileKey(tile), appWidgetId.get(),
-                    contactUri);
+                    contactUri, backupManager);
             // Update cached tile in-memory.
             updatedTile.setContactUri(contactUri);
         }
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
index 844a8c6..730e850 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
@@ -330,11 +330,8 @@
                     R.layout.people_tile_suppressed_layout);
         }
         Drawable appIcon = mContext.getDrawable(R.drawable.ic_conversation_icon);
-        Bitmap appIconAsBitmap = convertDrawableToBitmap(appIcon);
-        FastBitmapDrawable drawable = new FastBitmapDrawable(appIconAsBitmap);
-        drawable.setIsDisabled(true);
-        Bitmap convertedBitmap = convertDrawableToBitmap(drawable);
-        views.setImageViewBitmap(R.id.icon, convertedBitmap);
+        Bitmap disabledBitmap = convertDrawableToDisabledBitmap(appIcon);
+        views.setImageViewBitmap(R.id.icon, disabledBitmap);
         return views;
     }
 
@@ -504,6 +501,11 @@
     }
 
     private RemoteViews setLaunchIntents(RemoteViews views) {
+        if (!PeopleTileKey.isValid(mKey) || mTile == null) {
+            if (DEBUG) Log.d(TAG, "Skipping launch intent, Null tile or invalid key: " + mKey);
+            return views;
+        }
+
         try {
             Intent activityIntent = new Intent(mContext, LaunchConversationActivity.class);
             activityIntent.addFlags(
@@ -1067,7 +1069,8 @@
 
         Icon icon = tile.getUserIcon();
         if (icon == null) {
-            return null;
+            Drawable placeholder = context.getDrawable(R.drawable.ic_avatar_with_badge);
+            return convertDrawableToDisabledBitmap(placeholder);
         }
         PeopleStoryIconFactory storyIcon = new PeopleStoryIconFactory(context,
                 context.getPackageManager(),
@@ -1179,4 +1182,11 @@
             mAvatarSize = avatarSize;
         }
     }
+
+    private static Bitmap convertDrawableToDisabledBitmap(Drawable icon) {
+        Bitmap appIconAsBitmap = convertDrawableToBitmap(icon);
+        FastBitmapDrawable drawable = new FastBitmapDrawable(appIconAsBitmap);
+        drawable.setIsDisabled(true);
+        return convertDrawableToBitmap(drawable);
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/people/SharedPreferencesHelper.java b/packages/SystemUI/src/com/android/systemui/people/SharedPreferencesHelper.java
new file mode 100644
index 0000000..aef08fb
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/people/SharedPreferencesHelper.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2021 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.people;
+
+import static com.android.systemui.people.PeopleSpaceUtils.INVALID_USER_ID;
+import static com.android.systemui.people.PeopleSpaceUtils.PACKAGE_NAME;
+import static com.android.systemui.people.PeopleSpaceUtils.SHORTCUT_ID;
+import static com.android.systemui.people.PeopleSpaceUtils.USER_ID;
+
+import android.content.SharedPreferences;
+
+import com.android.systemui.people.widget.PeopleTileKey;
+
+/** Helper class for Conversations widgets SharedPreferences storage. */
+public class SharedPreferencesHelper {
+    /** Clears all storage from {@code sp}. */
+    public static void clear(SharedPreferences sp) {
+        SharedPreferences.Editor editor = sp.edit();
+        editor.clear();
+        editor.apply();
+    }
+
+    /** Sets {@code sp}'s storage to identify a {@link PeopleTileKey}. */
+    public static void setPeopleTileKey(SharedPreferences sp, PeopleTileKey key) {
+        setPeopleTileKey(sp, key.getShortcutId(), key.getUserId(), key.getPackageName());
+    }
+
+    /** Sets {@code sp}'s storage to identify a {@link PeopleTileKey}. */
+    public static void setPeopleTileKey(SharedPreferences sp, String shortcutId, int userId,
+            String packageName) {
+        SharedPreferences.Editor editor = sp.edit();
+        editor.putString(SHORTCUT_ID, shortcutId);
+        editor.putInt(USER_ID, userId);
+        editor.putString(PACKAGE_NAME, packageName);
+        editor.apply();
+    }
+
+    /** Returns a {@link PeopleTileKey} based on storage from {@code sp}. */
+    public static PeopleTileKey getPeopleTileKey(SharedPreferences sp) {
+        String shortcutId = sp.getString(SHORTCUT_ID, null);
+        String packageName = sp.getString(PACKAGE_NAME, null);
+        int userId = sp.getInt(USER_ID, INVALID_USER_ID);
+        return new PeopleTileKey(shortcutId, userId, packageName);
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/LaunchConversationActivity.java b/packages/SystemUI/src/com/android/systemui/people/widget/LaunchConversationActivity.java
index b031637..79318d6 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/LaunchConversationActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/LaunchConversationActivity.java
@@ -152,7 +152,7 @@
                 launcherApps.startShortcut(
                         packageName, tileId, null, null, userHandle);
             } catch (Exception e) {
-                Log.e(TAG, "Exception:" + e);
+                Log.e(TAG, "Exception launching shortcut:" + e);
             }
         } else {
             if (DEBUG) Log.d(TAG, "Trying to launch conversation with null shortcutInfo.");
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleBackupHelper.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleBackupHelper.java
new file mode 100644
index 0000000..d8c96dd
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleBackupHelper.java
@@ -0,0 +1,508 @@
+/*
+ * Copyright (C) 2021 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.people.widget;
+
+import static com.android.systemui.people.PeopleBackupFollowUpJob.SHARED_FOLLOW_UP;
+import static com.android.systemui.people.PeopleSpaceUtils.DEBUG;
+import static com.android.systemui.people.PeopleSpaceUtils.INVALID_USER_ID;
+import static com.android.systemui.people.PeopleSpaceUtils.USER_ID;
+
+import android.app.backup.BackupDataInputStream;
+import android.app.backup.BackupDataOutput;
+import android.app.backup.SharedPreferencesBackupHelper;
+import android.app.people.IPeopleManager;
+import android.appwidget.AppWidgetManager;
+import android.content.ComponentName;
+import android.content.ContentProvider;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.preference.PreferenceManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.people.PeopleBackupFollowUpJob;
+import com.android.systemui.people.SharedPreferencesHelper;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Helper class to backup and restore Conversations widgets storage.
+ * It is used by SystemUI's BackupHelper agent.
+ * TODO(b/192334798): Lock access to storage using PeopleSpaceWidgetManager's lock.
+ */
+public class PeopleBackupHelper extends SharedPreferencesBackupHelper {
+    private static final String TAG = "PeopleBackupHelper";
+
+    public static final String ADD_USER_ID_TO_URI = "add_user_id_to_uri_";
+    public static final String SHARED_BACKUP = "shared_backup";
+
+    private final Context mContext;
+    private final UserHandle mUserHandle;
+    private final PackageManager mPackageManager;
+    private final IPeopleManager mIPeopleManager;
+    private final AppWidgetManager mAppWidgetManager;
+
+    /**
+     * Types of entries stored in the default SharedPreferences file for Conversation widgets.
+     * Widget ID corresponds to a pair [widgetId, contactURI].
+     * PeopleTileKey corresponds to a pair [PeopleTileKey, {widgetIds}].
+     * Contact URI corresponds to a pair [Contact URI, {widgetIds}].
+     */
+    enum SharedFileEntryType {
+        UNKNOWN,
+        WIDGET_ID,
+        PEOPLE_TILE_KEY,
+        CONTACT_URI
+    }
+
+    /**
+     * Returns the file names that should be backed up and restored by SharedPreferencesBackupHelper
+     * infrastructure.
+     */
+    public static List<String> getFilesToBackup() {
+        return Collections.singletonList(SHARED_BACKUP);
+    }
+
+    public PeopleBackupHelper(Context context, UserHandle userHandle,
+            String[] sharedPreferencesKey) {
+        super(context, sharedPreferencesKey);
+        mContext = context;
+        mUserHandle = userHandle;
+        mPackageManager = context.getPackageManager();
+        mIPeopleManager = IPeopleManager.Stub.asInterface(
+                ServiceManager.getService(Context.PEOPLE_SERVICE));
+        mAppWidgetManager = AppWidgetManager.getInstance(context);
+    }
+
+    @VisibleForTesting
+    public PeopleBackupHelper(Context context, UserHandle userHandle,
+            String[] sharedPreferencesKey, PackageManager packageManager,
+            IPeopleManager peopleManager) {
+        super(context, sharedPreferencesKey);
+        mContext = context;
+        mUserHandle = userHandle;
+        mPackageManager = packageManager;
+        mIPeopleManager = peopleManager;
+        mAppWidgetManager = AppWidgetManager.getInstance(context);
+    }
+
+    /**
+     * Reads values from default storage, backs them up appropriately to a specified backup file,
+     * and calls super's performBackup, which backs up the values of the backup file.
+     */
+    @Override
+    public void performBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
+            ParcelFileDescriptor newState) {
+        if (DEBUG) Log.d(TAG, "Backing up conversation widgets, writing to: " + SHARED_BACKUP);
+        // Open default value for readings values.
+        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
+        if (sp.getAll().isEmpty()) {
+            if (DEBUG) Log.d(TAG, "No information to be backed up, finishing.");
+            return;
+        }
+
+        // Open backup file for writing.
+        SharedPreferences backupSp = mContext.getSharedPreferences(
+                SHARED_BACKUP, Context.MODE_PRIVATE);
+        SharedPreferences.Editor backupEditor = backupSp.edit();
+        backupEditor.clear();
+
+        // Fetch Conversations widgets corresponding to this user.
+        List<String> existingWidgets = getExistingWidgetsForUser(mUserHandle.getIdentifier());
+        if (existingWidgets.isEmpty()) {
+            if (DEBUG) Log.d(TAG, "No existing Conversations widgets, returning.");
+            return;
+        }
+
+        // Writes each entry to backup file.
+        sp.getAll().entrySet().forEach(entry -> backupKey(entry, backupEditor, existingWidgets));
+        backupEditor.apply();
+
+        super.performBackup(oldState, data, newState);
+    }
+
+    /**
+     * Restores backed up values to backup file via super's restoreEntity, then transfers them
+     * back to regular storage. Restore operations for each users are done in sequence, so we can
+     * safely use the same backup file names.
+     */
+    @Override
+    public void restoreEntity(BackupDataInputStream data) {
+        if (DEBUG) Log.d(TAG, "Restoring Conversation widgets.");
+        super.restoreEntity(data);
+
+        // Open backup file for reading values.
+        SharedPreferences backupSp = mContext.getSharedPreferences(
+                SHARED_BACKUP, Context.MODE_PRIVATE);
+
+        // Open default file and follow-up file for writing.
+        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
+        SharedPreferences.Editor editor = sp.edit();
+        SharedPreferences followUp = mContext.getSharedPreferences(
+                SHARED_FOLLOW_UP, Context.MODE_PRIVATE);
+        SharedPreferences.Editor followUpEditor = followUp.edit();
+
+        // Writes each entry back to default value.
+        boolean shouldScheduleJob = false;
+        for (Map.Entry<String, ?> entry : backupSp.getAll().entrySet()) {
+            boolean restored = restoreKey(entry, editor, followUpEditor, backupSp);
+            if (!restored) {
+                shouldScheduleJob = true;
+            }
+        }
+
+        editor.apply();
+        followUpEditor.apply();
+        SharedPreferencesHelper.clear(backupSp);
+
+        // If any of the widgets is not yet available, schedule a follow-up job to check later.
+        if (shouldScheduleJob) {
+            if (DEBUG) Log.d(TAG, "At least one shortcut is not available, scheduling follow-up.");
+            PeopleBackupFollowUpJob.scheduleJob(mContext);
+        }
+
+        updateWidgets(mContext);
+    }
+
+    /** Backs up an entry from default file to backup file. */
+    public void backupKey(Map.Entry<String, ?> entry, SharedPreferences.Editor backupEditor,
+            List<String> existingWidgets) {
+        String key = entry.getKey();
+        if (TextUtils.isEmpty(key)) {
+            return;
+        }
+
+        SharedFileEntryType entryType = getEntryType(entry);
+        switch(entryType) {
+            case WIDGET_ID:
+                backupWidgetIdKey(key, String.valueOf(entry.getValue()), backupEditor,
+                        existingWidgets);
+                break;
+            case PEOPLE_TILE_KEY:
+                backupPeopleTileKey(key, (Set<String>) entry.getValue(), backupEditor,
+                        existingWidgets);
+                break;
+            case CONTACT_URI:
+                backupContactUriKey(key, (Set<String>) entry.getValue(), backupEditor);
+                break;
+            case UNKNOWN:
+            default:
+                Log.w(TAG, "Key not identified, skipping: " + key);
+        }
+    }
+
+    /**
+     * Tries to restore an entry from backup file to default file.
+     * Returns true if restore is finished, false if it needs to be checked later.
+     */
+    boolean restoreKey(Map.Entry<String, ?> entry, SharedPreferences.Editor editor,
+            SharedPreferences.Editor followUpEditor, SharedPreferences backupSp) {
+        String key = entry.getKey();
+        SharedFileEntryType keyType = getEntryType(entry);
+        int storedUserId = backupSp.getInt(ADD_USER_ID_TO_URI + key, INVALID_USER_ID);
+        switch (keyType) {
+            case WIDGET_ID:
+                restoreWidgetIdKey(key, String.valueOf(entry.getValue()), editor, storedUserId);
+                return true;
+            case PEOPLE_TILE_KEY:
+                return restorePeopleTileKeyAndCorrespondingWidgetFile(
+                        key, (Set<String>) entry.getValue(), editor, followUpEditor);
+            case CONTACT_URI:
+                restoreContactUriKey(key, (Set<String>) entry.getValue(), editor, storedUserId);
+                return true;
+            case UNKNOWN:
+            default:
+                Log.e(TAG, "Key not identified, skipping:" + key);
+                return true;
+        }
+    }
+
+    /**
+     * Backs up a [widgetId, contactURI] pair, if widget id corresponds to current user.
+     * If contact URI has a user id, stores it so it can be re-added on restore.
+     */
+    private void backupWidgetIdKey(String key, String uriString, SharedPreferences.Editor editor,
+            List<String> existingWidgets) {
+        if (!existingWidgets.contains(key)) {
+            if (DEBUG) Log.d(TAG, "Widget: " + key + " does't correspond to this user, skipping.");
+            return;
+        }
+        Uri uri = Uri.parse(uriString);
+        if (ContentProvider.uriHasUserId(uri)) {
+            if (DEBUG) Log.d(TAG, "Contact URI value has user ID, removing from: " + uri);
+            int userId = ContentProvider.getUserIdFromUri(uri);
+            editor.putInt(ADD_USER_ID_TO_URI + key, userId);
+            uri = ContentProvider.getUriWithoutUserId(uri);
+        }
+        if (DEBUG) Log.d(TAG, "Backing up widgetId key: " + key + " . Value: " + uri.toString());
+        editor.putString(key, uri.toString());
+    }
+
+    /** Restores a [widgetId, contactURI] pair, and a potential {@code storedUserId}. */
+    private void restoreWidgetIdKey(String key, String uriString, SharedPreferences.Editor editor,
+            int storedUserId) {
+        Uri uri = Uri.parse(uriString);
+        if (storedUserId != INVALID_USER_ID) {
+            uri = ContentProvider.createContentUriForUser(uri, UserHandle.of(storedUserId));
+            if (DEBUG) Log.d(TAG, "UserId was removed from URI on back up, re-adding as:" + uri);
+
+        }
+        if (DEBUG) Log.d(TAG, "Restoring widgetId key: " + key + " . Value: " + uri.toString());
+        editor.putString(key, uri.toString());
+    }
+
+    /**
+     * Backs up a [PeopleTileKey, {widgetIds}] pair, if PeopleTileKey's user is the same as current
+     * user, stripping out the user id.
+     */
+    private void backupPeopleTileKey(String key, Set<String> widgetIds,
+            SharedPreferences.Editor editor, List<String> existingWidgets) {
+        PeopleTileKey peopleTileKey = PeopleTileKey.fromString(key);
+        if (peopleTileKey.getUserId() != mUserHandle.getIdentifier()) {
+            if (DEBUG) Log.d(TAG, "PeopleTileKey corresponds to different user, skipping backup.");
+            return;
+        }
+
+        Set<String> filteredWidgets = widgetIds.stream()
+                .filter(id -> existingWidgets.contains(id))
+                .collect(Collectors.toSet());
+        if (filteredWidgets.isEmpty()) {
+            return;
+        }
+
+        peopleTileKey.setUserId(INVALID_USER_ID);
+        if (DEBUG) {
+            Log.d(TAG, "Backing up PeopleTileKey key: " + peopleTileKey.toString() + ". Value: "
+                    + filteredWidgets);
+        }
+        editor.putStringSet(peopleTileKey.toString(), filteredWidgets);
+    }
+
+    /**
+     * Restores a [PeopleTileKey, {widgetIds}] pair, restoring the user id. Checks if the
+     * corresponding shortcut exists, and if not, we should schedule a follow up to check later.
+     * Also restores corresponding [widgetId, PeopleTileKey], which is not backed up since the
+     * information can be inferred from this.
+     * Returns true if restore is finished, false if we should check if shortcut is available later.
+     */
+    private boolean restorePeopleTileKeyAndCorrespondingWidgetFile(String key,
+            Set<String> widgetIds, SharedPreferences.Editor editor,
+            SharedPreferences.Editor followUpEditor) {
+        PeopleTileKey peopleTileKey = PeopleTileKey.fromString(key);
+        // Should never happen, as type of key has been checked.
+        if (peopleTileKey == null) {
+            if (DEBUG) Log.d(TAG, "PeopleTileKey key to be restored is null, skipping.");
+            return true;
+        }
+
+        peopleTileKey.setUserId(mUserHandle.getIdentifier());
+        if (!PeopleTileKey.isValid(peopleTileKey)) {
+            if (DEBUG) Log.d(TAG, "PeopleTileKey key to be restored is not valid, skipping.");
+            return true;
+        }
+
+        boolean restored = isReadyForRestore(
+                mIPeopleManager, mPackageManager, peopleTileKey);
+        if (!restored) {
+            if (DEBUG) Log.d(TAG, "Adding key to follow-up storage: " + peopleTileKey.toString());
+            // Follow-up file stores shortcuts that need to be checked later, and possibly wiped
+            // from our storage.
+            followUpEditor.putStringSet(peopleTileKey.toString(), widgetIds);
+        }
+
+        if (DEBUG) {
+            Log.d(TAG, "Restoring PeopleTileKey key: " + peopleTileKey.toString() + " . Value: "
+                    + widgetIds);
+        }
+        editor.putStringSet(peopleTileKey.toString(), widgetIds);
+        restoreWidgetIdFiles(mContext, widgetIds, peopleTileKey);
+        return restored;
+    }
+
+    /**
+     * Backs up a [contactURI, {widgetIds}] pair. If contactURI contains a userId, we back up
+     * this entry in the corresponding user. If it doesn't, we back it up as user 0.
+     * If contact URI has a user id, stores it so it can be re-added on restore.
+     * We do not take existing widgets for this user into consideration.
+     */
+    private void backupContactUriKey(String key, Set<String> widgetIds,
+            SharedPreferences.Editor editor) {
+        Uri uri = Uri.parse(String.valueOf(key));
+        if (ContentProvider.uriHasUserId(uri)) {
+            int userId = ContentProvider.getUserIdFromUri(uri);
+            if (DEBUG) Log.d(TAG, "Contact URI has user Id: " + userId);
+            if (userId == mUserHandle.getIdentifier()) {
+                uri = ContentProvider.getUriWithoutUserId(uri);
+                if (DEBUG) {
+                    Log.d(TAG, "Backing up contactURI key: " + uri.toString() + " . Value: "
+                            + widgetIds);
+                }
+                editor.putInt(ADD_USER_ID_TO_URI + uri.toString(), userId);
+                editor.putStringSet(uri.toString(), widgetIds);
+            } else {
+                if (DEBUG) Log.d(TAG, "ContactURI corresponds to different user, skipping.");
+            }
+        } else if (mUserHandle.isSystem()) {
+            if (DEBUG) {
+                Log.d(TAG, "Backing up contactURI key: " + uri.toString() + " . Value: "
+                        + widgetIds);
+            }
+            editor.putStringSet(uri.toString(), widgetIds);
+        }
+    }
+
+    /** Restores a [contactURI, {widgetIds}] pair, and a potential {@code storedUserId}. */
+    private void restoreContactUriKey(String key, Set<String> widgetIds,
+            SharedPreferences.Editor editor, int storedUserId) {
+        Uri uri = Uri.parse(key);
+        if (storedUserId != INVALID_USER_ID) {
+            uri = ContentProvider.createContentUriForUser(uri, UserHandle.of(storedUserId));
+            if (DEBUG) Log.d(TAG, "UserId was removed from URI on back up, re-adding as:" + uri);
+        }
+        if (DEBUG) {
+            Log.d(TAG, "Restoring contactURI key: " + uri.toString() + " . Value: " + widgetIds);
+        }
+        editor.putStringSet(uri.toString(), widgetIds);
+    }
+
+    /** Restores the widget-specific files that contain PeopleTileKey information. */
+    public static void restoreWidgetIdFiles(Context context, Set<String> widgetIds,
+            PeopleTileKey key) {
+        for (String id : widgetIds) {
+            if (DEBUG) Log.d(TAG, "Restoring widget Id file: " + id + " . Value: " + key);
+            SharedPreferences dest = context.getSharedPreferences(id, Context.MODE_PRIVATE);
+            SharedPreferencesHelper.setPeopleTileKey(dest, key);
+        }
+    }
+
+    private List<String> getExistingWidgetsForUser(int userId) {
+        List<String> existingWidgets = new ArrayList<>();
+        int[] ids = mAppWidgetManager.getAppWidgetIds(
+                new ComponentName(mContext, PeopleSpaceWidgetProvider.class));
+        for (int id : ids) {
+            String idString = String.valueOf(id);
+            SharedPreferences sp = mContext.getSharedPreferences(idString, Context.MODE_PRIVATE);
+            if (sp.getInt(USER_ID, INVALID_USER_ID) == userId) {
+                existingWidgets.add(idString);
+            }
+        }
+        if (DEBUG) Log.d(TAG, "Existing widgets: " + existingWidgets);
+        return existingWidgets;
+    }
+
+    /**
+     * Returns whether {@code key} corresponds to a shortcut that is ready for restore, either
+     * because it is available or because it never will be. If not ready, we schedule a job to check
+     * again later.
+     */
+    public static boolean isReadyForRestore(IPeopleManager peopleManager,
+            PackageManager packageManager, PeopleTileKey key) {
+        if (DEBUG) Log.d(TAG, "Checking if we should schedule a follow up job : " + key);
+        if (!PeopleTileKey.isValid(key)) {
+            if (DEBUG) Log.d(TAG, "Key is invalid, should not follow up.");
+            return true;
+        }
+
+        try {
+            PackageInfo info = packageManager.getPackageInfoAsUser(
+                    key.getPackageName(), 0, key.getUserId());
+        } catch (PackageManager.NameNotFoundException e) {
+            if (DEBUG) Log.d(TAG, "Package is not installed, should follow up.");
+            return false;
+        }
+
+        try {
+            boolean isConversation = peopleManager.isConversation(
+                    key.getPackageName(), key.getUserId(), key.getShortcutId());
+            if (DEBUG) {
+                Log.d(TAG, "Checked if shortcut exists, should follow up: " + !isConversation);
+            }
+            return isConversation;
+        } catch (Exception e) {
+            if (DEBUG) Log.d(TAG, "Error checking if backed up info is a shortcut.");
+            return false;
+        }
+    }
+
+    /** Parses default file {@code entry} to determine the entry's type.*/
+    public static SharedFileEntryType getEntryType(Map.Entry<String, ?> entry) {
+        String key = entry.getKey();
+        if (key == null) {
+            return SharedFileEntryType.UNKNOWN;
+        }
+
+        try {
+            int id = Integer.parseInt(key);
+            try {
+                String contactUri = (String) entry.getValue();
+            } catch (Exception e) {
+                Log.w(TAG, "Malformed value, skipping:" + entry.getValue());
+                return SharedFileEntryType.UNKNOWN;
+            }
+            return SharedFileEntryType.WIDGET_ID;
+        } catch (NumberFormatException ignored) { }
+
+        try {
+            Set<String> widgetIds = (Set<String>) entry.getValue();
+        } catch (Exception e) {
+            Log.w(TAG, "Malformed value, skipping:" + entry.getValue());
+            return SharedFileEntryType.UNKNOWN;
+        }
+
+        PeopleTileKey peopleTileKey = PeopleTileKey.fromString(key);
+        if (peopleTileKey != null) {
+            return SharedFileEntryType.PEOPLE_TILE_KEY;
+        }
+
+        try {
+            Uri uri = Uri.parse(key);
+            return SharedFileEntryType.CONTACT_URI;
+        } catch (Exception e) {
+            return SharedFileEntryType.UNKNOWN;
+        }
+    }
+
+    /** Sends a broadcast to update the existing Conversation widgets. */
+    public static void updateWidgets(Context context) {
+        int[] widgetIds = AppWidgetManager.getInstance(context)
+                .getAppWidgetIds(new ComponentName(context, PeopleSpaceWidgetProvider.class));
+        if (DEBUG) {
+            for (int id : widgetIds) {
+                Log.d(TAG, "Calling update to widget: " + id);
+            }
+        }
+        if (widgetIds != null && widgetIds.length != 0) {
+            Intent intent = new Intent(context, PeopleSpaceWidgetProvider.class);
+            intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
+            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIds);
+            context.sendBroadcast(intent);
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
index 62a0df2..72cddd0 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
@@ -22,6 +22,7 @@
 import static android.app.NotificationManager.INTERRUPTION_FILTER_NONE;
 import static android.app.NotificationManager.INTERRUPTION_FILTER_PRIORITY;
 import static android.content.Intent.ACTION_BOOT_COMPLETED;
+import static android.content.Intent.ACTION_PACKAGE_ADDED;
 import static android.content.Intent.ACTION_PACKAGE_REMOVED;
 import static android.service.notification.ZenPolicy.CONVERSATION_SENDERS_ANYONE;
 
@@ -29,6 +30,7 @@
 import static com.android.systemui.people.NotificationHelper.getHighestPriorityNotification;
 import static com.android.systemui.people.NotificationHelper.shouldFilterOut;
 import static com.android.systemui.people.NotificationHelper.shouldMatchNotificationByUri;
+import static com.android.systemui.people.PeopleBackupFollowUpJob.SHARED_FOLLOW_UP;
 import static com.android.systemui.people.PeopleSpaceUtils.EMPTY_STRING;
 import static com.android.systemui.people.PeopleSpaceUtils.INVALID_USER_ID;
 import static com.android.systemui.people.PeopleSpaceUtils.PACKAGE_NAME;
@@ -38,6 +40,7 @@
 import static com.android.systemui.people.PeopleSpaceUtils.getMessagesCount;
 import static com.android.systemui.people.PeopleSpaceUtils.getNotificationsByUri;
 import static com.android.systemui.people.PeopleSpaceUtils.removeNotificationFields;
+import static com.android.systemui.people.widget.PeopleBackupHelper.getEntryType;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -46,6 +49,8 @@
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.app.Person;
+import android.app.backup.BackupManager;
+import android.app.job.JobScheduler;
 import android.app.people.ConversationChannel;
 import android.app.people.IPeopleManager;
 import android.app.people.PeopleManager;
@@ -84,8 +89,10 @@
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.people.NotificationHelper;
+import com.android.systemui.people.PeopleBackupFollowUpJob;
 import com.android.systemui.people.PeopleSpaceUtils;
 import com.android.systemui.people.PeopleTileViewHelper;
+import com.android.systemui.people.SharedPreferencesHelper;
 import com.android.systemui.statusbar.NotificationListener;
 import com.android.systemui.statusbar.NotificationListener.NotificationHandler;
 import com.android.systemui.statusbar.notification.NotificationEntryManager;
@@ -93,6 +100,7 @@
 import com.android.wm.shell.bubbles.Bubbles;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -126,6 +134,7 @@
     private Optional<Bubbles> mBubblesOptional;
     private UserManager mUserManager;
     private PeopleSpaceWidgetManager mManager;
+    private BackupManager mBackupManager;
     public UiEventLogger mUiEventLogger = new UiEventLoggerImpl();
     private NotificationManager mNotificationManager;
     private BroadcastDispatcher mBroadcastDispatcher;
@@ -164,6 +173,7 @@
                 ServiceManager.getService(Context.NOTIFICATION_SERVICE));
         mBubblesOptional = bubblesOptional;
         mUserManager = userManager;
+        mBackupManager = new BackupManager(context);
         mNotificationManager = notificationManager;
         mManager = this;
         mBroadcastDispatcher = broadcastDispatcher;
@@ -189,6 +199,7 @@
 
                         null /* executor */, UserHandle.ALL);
                 IntentFilter perAppFilter = new IntentFilter(ACTION_PACKAGE_REMOVED);
+                perAppFilter.addAction(ACTION_PACKAGE_ADDED);
                 perAppFilter.addDataScheme("package");
                 // BroadcastDispatcher doesn't allow data schemes.
                 mContext.registerReceiver(mBaseBroadcastReceiver, perAppFilter);
@@ -224,7 +235,7 @@
             AppWidgetManager appWidgetManager, IPeopleManager iPeopleManager,
             PeopleManager peopleManager, LauncherApps launcherApps,
             NotificationEntryManager notificationEntryManager, PackageManager packageManager,
-            Optional<Bubbles> bubblesOptional, UserManager userManager,
+            Optional<Bubbles> bubblesOptional, UserManager userManager, BackupManager backupManager,
             INotificationManager iNotificationManager, NotificationManager notificationManager,
             @Background Executor executor) {
         mContext = context;
@@ -236,6 +247,7 @@
         mPackageManager = packageManager;
         mBubblesOptional = bubblesOptional;
         mUserManager = userManager;
+        mBackupManager = backupManager;
         mINotificationManager = iNotificationManager;
         mNotificationManager = notificationManager;
         mManager = this;
@@ -257,8 +269,6 @@
                 if (DEBUG) Log.d(TAG, "no widgets to update");
                 return;
             }
-
-            if (DEBUG) Log.d(TAG, "updating " + widgetIds.length + " widgets: " + widgetIds);
             synchronized (mLock) {
                 updateSingleConversationWidgets(widgetIds);
             }
@@ -274,6 +284,7 @@
     public void updateSingleConversationWidgets(int[] appWidgetIds) {
         Map<Integer, PeopleSpaceTile> widgetIdToTile = new HashMap<>();
         for (int appWidgetId : appWidgetIds) {
+            if (DEBUG) Log.d(TAG, "Updating widget: " + appWidgetId);
             PeopleSpaceTile tile = getTileForExistingWidget(appWidgetId);
             if (tile == null) {
                 Log.e(TAG, "Matching conversation not found for shortcut ID");
@@ -293,7 +304,8 @@
     private void updateAppWidgetViews(int appWidgetId, PeopleSpaceTile tile, Bundle options) {
         PeopleTileKey key = getKeyFromStorageByWidgetId(appWidgetId);
         if (DEBUG) Log.d(TAG, "Widget: " + appWidgetId + " for: " + key.toString());
-        if (!key.isValid()) {
+
+        if (!PeopleTileKey.isValid(key)) {
             Log.e(TAG, "Cannot update invalid widget");
             return;
         }
@@ -301,6 +313,7 @@
                 options, key);
 
         // Tell the AppWidgetManager to perform an update on the current app widget.
+        if (DEBUG) Log.d(TAG, "Calling update widget for widgetId: " + appWidgetId);
         mAppWidgetManager.updateAppWidget(appWidgetId, views);
     }
 
@@ -314,6 +327,9 @@
 
     /** Updates tile in app widget options and the current view. */
     public void updateAppWidgetOptionsAndView(int appWidgetId, PeopleSpaceTile tile) {
+        if (tile == null) {
+            if (DEBUG) Log.w(TAG, "Storing null tile");
+        }
         synchronized (mTiles) {
             mTiles.put(appWidgetId, tile);
         }
@@ -368,7 +384,7 @@
     @Nullable
     public PeopleSpaceTile getTileFromPersistentStorage(PeopleTileKey key, int appWidgetId) throws
             PackageManager.NameNotFoundException {
-        if (!key.isValid()) {
+        if (!PeopleTileKey.isValid(key)) {
             Log.e(TAG, "PeopleTileKey invalid: " + key.toString());
             return null;
         }
@@ -430,7 +446,8 @@
         try {
             PeopleTileKey key = new PeopleTileKey(
                     sbn.getShortcutId(), sbn.getUser().getIdentifier(), sbn.getPackageName());
-            if (!key.isValid()) {
+            if (!PeopleTileKey.isValid(key)) {
+                Log.d(TAG, "Sbn doesn't contain valid PeopleTileKey: " + key.toString());
                 return;
             }
             int[] widgetIds = mAppWidgetManager.getAppWidgetIds(
@@ -561,7 +578,7 @@
 
         if (DEBUG) Log.d(TAG, "Augmenting tile from notification, key: " + key.toString());
         return augmentTileFromNotification(mContext, tile, key, highestPriority, messagesCount,
-                appWidgetId);
+                appWidgetId, mBackupManager);
     }
 
     /** Returns an augmented tile for an existing widget. */
@@ -588,7 +605,7 @@
 
     /** Returns stored widgets for the conversation specified. */
     public Set<String> getMatchingKeyWidgetIds(PeopleTileKey key) {
-        if (!key.isValid()) {
+        if (!PeopleTileKey.isValid(key)) {
             return new HashSet<>();
         }
         return new HashSet<>(mSharedPrefs.getStringSet(key.toString(), new HashSet<>()));
@@ -776,7 +793,7 @@
         // PeopleTileKey arguments.
         if (DEBUG) Log.d(TAG, "onAppWidgetOptionsChanged called for widget: " + appWidgetId);
         PeopleTileKey optionsKey = AppWidgetOptionsHelper.getPeopleTileKeyFromBundle(newOptions);
-        if (optionsKey.isValid()) {
+        if (PeopleTileKey.isValid(optionsKey)) {
             if (DEBUG) {
                 Log.d(TAG, "PeopleTileKey was present in Options, shortcutId: "
                         + optionsKey.getShortcutId());
@@ -808,7 +825,7 @@
             existingKeyIfStored = getKeyFromStorageByWidgetId(appWidgetId);
         }
         // Delete previous storage if the widget already existed and is just reconfigured.
-        if (existingKeyIfStored.isValid()) {
+        if (PeopleTileKey.isValid(existingKeyIfStored)) {
             if (DEBUG) Log.d(TAG, "Remove previous storage for widget: " + appWidgetId);
             deleteWidgets(new int[]{appWidgetId});
         } else {
@@ -820,7 +837,7 @@
         synchronized (mLock) {
             if (DEBUG) Log.d(TAG, "Add storage for : " + key.toString());
             PeopleSpaceUtils.setSharedPreferencesStorageForTile(mContext, key, appWidgetId,
-                    tile.getContactUri());
+                    tile.getContactUri(), mBackupManager);
         }
         if (DEBUG) Log.d(TAG, "Ensure listener is registered for widget: " + appWidgetId);
         registerConversationListenerIfNeeded(appWidgetId, key);
@@ -838,7 +855,7 @@
     /** Registers a conversation listener for {@code appWidgetId} if not already registered. */
     public void registerConversationListenerIfNeeded(int widgetId, PeopleTileKey key) {
         // Retrieve storage needed for registration.
-        if (!key.isValid()) {
+        if (!PeopleTileKey.isValid(key)) {
             if (DEBUG) Log.w(TAG, "Could not register listener for widget: " + widgetId);
             return;
         }
@@ -887,7 +904,7 @@
                         widgetSp.getString(SHORTCUT_ID, null),
                         widgetSp.getInt(USER_ID, INVALID_USER_ID),
                         widgetSp.getString(PACKAGE_NAME, null));
-                if (!key.isValid()) {
+                if (!PeopleTileKey.isValid(key)) {
                     if (DEBUG) Log.e(TAG, "Could not delete " + widgetId);
                     return;
                 }
@@ -1053,6 +1070,7 @@
             return;
         }
         for (int appWidgetId : appWidgetIds) {
+            if (DEBUG) Log.d(TAG, "Updating widget from broadcast, widget id: " +  appWidgetId);
             PeopleSpaceTile existingTile = null;
             PeopleSpaceTile updatedTile = null;
             try {
@@ -1060,7 +1078,7 @@
                     existingTile = getTileForExistingWidgetThrowing(appWidgetId);
                     if (existingTile == null) {
                         Log.e(TAG, "Matching conversation not found for shortcut ID");
-                        return;
+                        continue;
                     }
                     updatedTile = getTileWithCurrentState(existingTile, entryPoint);
                     updateAppWidgetOptionsAndView(appWidgetId, updatedTile);
@@ -1068,6 +1086,14 @@
             } catch (PackageManager.NameNotFoundException e) {
                 // Delete data for uninstalled widgets.
                 Log.e(TAG, "Package no longer found for tile: " + e);
+                JobScheduler jobScheduler = mContext.getSystemService(JobScheduler.class);
+                if (jobScheduler != null
+                        && jobScheduler.getPendingJob(PeopleBackupFollowUpJob.JOB_ID) != null) {
+                    if (DEBUG) {
+                        Log.d(TAG, "Device was recently restored, wait before deleting storage.");
+                    }
+                    continue;
+                }
                 synchronized (mLock) {
                     updateAppWidgetOptionsAndView(appWidgetId, updatedTile);
                 }
@@ -1185,4 +1211,139 @@
                 return PeopleSpaceTile.BLOCK_CONVERSATIONS;
         }
     }
+
+    /**
+     * Modifies widgets storage after a restore operation, since widget ids get remapped on restore.
+     * This is guaranteed to run after the PeopleBackupHelper restore operation.
+     */
+    public void remapWidgets(int[] oldWidgetIds, int[] newWidgetIds) {
+        if (DEBUG) {
+            Log.d(TAG, "Remapping widgets, old: " + Arrays.toString(oldWidgetIds) + ". new: "
+                    + Arrays.toString(newWidgetIds));
+        }
+
+        Map<String, String> widgets = new HashMap<>();
+        for (int i = 0; i < oldWidgetIds.length; i++) {
+            widgets.put(String.valueOf(oldWidgetIds[i]), String.valueOf(newWidgetIds[i]));
+        }
+
+        remapWidgetFiles(widgets);
+        remapSharedFile(widgets);
+        remapFollowupFile(widgets);
+
+        int[] widgetIds = mAppWidgetManager.getAppWidgetIds(
+                new ComponentName(mContext, PeopleSpaceWidgetProvider.class));
+        Bundle b = new Bundle();
+        b.putBoolean(AppWidgetManager.OPTION_APPWIDGET_RESTORE_COMPLETED, true);
+        for (int id : widgetIds) {
+            if (DEBUG) Log.d(TAG, "Setting widget as restored, widget id:" + id);
+            mAppWidgetManager.updateAppWidgetOptions(id, b);
+        }
+
+        updateWidgets(widgetIds);
+    }
+
+    /** Remaps widget ids in widget specific files. */
+    public void remapWidgetFiles(Map<String, String> widgets) {
+        if (DEBUG) Log.d(TAG, "Remapping widget files");
+        for (Map.Entry<String, String> entry : widgets.entrySet()) {
+            String from = String.valueOf(entry.getKey());
+            String to = String.valueOf(entry.getValue());
+
+            SharedPreferences src = mContext.getSharedPreferences(from, Context.MODE_PRIVATE);
+            PeopleTileKey key = SharedPreferencesHelper.getPeopleTileKey(src);
+            if (PeopleTileKey.isValid(key)) {
+                if (DEBUG) {
+                    Log.d(TAG, "Moving PeopleTileKey: " + key.toString() + " from file: "
+                            + from + ", to file: " + to);
+                }
+                SharedPreferences dest = mContext.getSharedPreferences(to, Context.MODE_PRIVATE);
+                SharedPreferencesHelper.setPeopleTileKey(dest, key);
+                SharedPreferencesHelper.clear(src);
+            }
+        }
+    }
+
+    /** Remaps widget ids in default shared storage. */
+    public void remapSharedFile(Map<String, String> widgets) {
+        if (DEBUG) Log.d(TAG, "Remapping shared file");
+        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
+        SharedPreferences.Editor editor = sp.edit();
+        Map<String, ?> all = sp.getAll();
+        for (Map.Entry<String, ?> entry : all.entrySet()) {
+            String key = entry.getKey();
+            PeopleBackupHelper.SharedFileEntryType keyType = getEntryType(entry);
+            if (DEBUG) Log.d(TAG, "Remapping key:" + key);
+            switch (keyType) {
+                case WIDGET_ID:
+                    String newId = widgets.get(key);
+                    if (TextUtils.isEmpty(newId)) {
+                        Log.w(TAG, "Key is widget id without matching new id, skipping: " + key);
+                        break;
+                    }
+                    if (DEBUG) Log.d(TAG, "Key is widget id: " + key + ", replace with: " + newId);
+                    try {
+                        editor.putString(newId, (String) entry.getValue());
+                    } catch (Exception e) {
+                        Log.e(TAG, "Malformed entry value: " + entry.getValue());
+                    }
+                    editor.remove(key);
+                    break;
+                case PEOPLE_TILE_KEY:
+                case CONTACT_URI:
+                    Set<String> oldWidgetIds;
+                    try {
+                        oldWidgetIds = (Set<String>) entry.getValue();
+                    } catch (Exception e) {
+                        Log.e(TAG, "Malformed entry value: " + entry.getValue());
+                        editor.remove(key);
+                        break;
+                    }
+                    Set<String> newWidgets = getNewWidgets(oldWidgetIds, widgets);
+                    if (DEBUG) {
+                        Log.d(TAG, "Key is PeopleTileKey or contact URI: " + key
+                                + ", replace values with new ids: " + newWidgets);
+                    }
+                    editor.putStringSet(key, newWidgets);
+                    break;
+                case UNKNOWN:
+                    Log.e(TAG, "Key not identified:" + key);
+            }
+        }
+        editor.apply();
+    }
+
+    /** Remaps widget ids in follow-up job file. */
+    public void remapFollowupFile(Map<String, String> widgets) {
+        if (DEBUG) Log.d(TAG, "Remapping follow up file");
+        SharedPreferences followUp = mContext.getSharedPreferences(
+                SHARED_FOLLOW_UP, Context.MODE_PRIVATE);
+        SharedPreferences.Editor followUpEditor = followUp.edit();
+        Map<String, ?> followUpAll = followUp.getAll();
+        for (Map.Entry<String, ?> entry : followUpAll.entrySet()) {
+            String key = entry.getKey();
+            Set<String> oldWidgetIds;
+            try {
+                oldWidgetIds = (Set<String>) entry.getValue();
+            } catch (Exception e) {
+                Log.e(TAG, "Malformed entry value: " + entry.getValue());
+                followUpEditor.remove(key);
+                continue;
+            }
+            Set<String> newWidgets = getNewWidgets(oldWidgetIds, widgets);
+            if (DEBUG) {
+                Log.d(TAG, "Follow up key: " + key + ", replace with new ids: " + newWidgets);
+            }
+            followUpEditor.putStringSet(key, newWidgets);
+        }
+        followUpEditor.apply();
+    }
+
+    private Set<String> getNewWidgets(Set<String> oldWidgets, Map<String, String> widgetsMapping) {
+        return oldWidgets
+                .stream()
+                .map(widgetsMapping::get)
+                .filter(id -> !TextUtils.isEmpty(id))
+                .collect(Collectors.toSet());
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetPinnedReceiver.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetPinnedReceiver.java
index a28da43..c4be197 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetPinnedReceiver.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetPinnedReceiver.java
@@ -75,7 +75,7 @@
         String packageName = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
         int userId = intent.getIntExtra(Intent.EXTRA_USER_ID, INVALID_USER_ID);
         PeopleTileKey key = new PeopleTileKey(shortcutId, userId, packageName);
-        if (!key.isValid()) {
+        if (!PeopleTileKey.isValid(key)) {
             if (DEBUG) Log.w(TAG, "Skipping: key is not valid: " + key.toString());
             return;
         }
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetProvider.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetProvider.java
index 3522b76..36939b7 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetProvider.java
@@ -70,6 +70,13 @@
         mPeopleSpaceWidgetManager.deleteWidgets(appWidgetIds);
     }
 
+    @Override
+    public void onRestored(Context context, int[] oldWidgetIds, int[] newWidgetIds) {
+        super.onRestored(context, oldWidgetIds, newWidgetIds);
+        ensurePeopleSpaceWidgetManagerInitialized();
+        mPeopleSpaceWidgetManager.remapWidgets(oldWidgetIds, newWidgetIds);
+    }
+
     private void ensurePeopleSpaceWidgetManagerInitialized() {
         mPeopleSpaceWidgetManager.init();
     }
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleTileKey.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleTileKey.java
index 319df85..6e6ca25 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleTileKey.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleTileKey.java
@@ -25,6 +25,8 @@
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 
 import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /** Class that encapsulates fields identifying a Conversation. */
 public class PeopleTileKey {
@@ -32,6 +34,8 @@
     private int mUserId;
     private String mPackageName;
 
+    private static final Pattern KEY_PATTERN = Pattern.compile("(.+)/(-?\\d+)/(\\p{L}.*)");
+
     public PeopleTileKey(String shortcutId, int userId, String packageName) {
         mShortcutId = shortcutId;
         mUserId = userId;
@@ -66,8 +70,12 @@
         return mPackageName;
     }
 
+    public void setUserId(int userId) {
+        mUserId = userId;
+    }
+
     /** Returns whether PeopleTileKey is valid/well-formed. */
-    public boolean isValid() {
+    private boolean validate() {
         return !TextUtils.isEmpty(mShortcutId) && !TextUtils.isEmpty(mPackageName) && mUserId >= 0;
     }
 
@@ -88,10 +96,31 @@
      */
     @Override
     public String toString() {
-        if (!isValid()) return EMPTY_STRING;
         return mShortcutId + "/" + mUserId + "/" + mPackageName;
     }
 
+    /** Parses {@code key} into a {@link PeopleTileKey}. */
+    public static PeopleTileKey fromString(String key) {
+        if (key == null) {
+            return null;
+        }
+        Matcher m = KEY_PATTERN.matcher(key);
+        if (m.find()) {
+            try {
+                int userId = Integer.parseInt(m.group(2));
+                return new PeopleTileKey(m.group(1), userId, m.group(3));
+            } catch (NumberFormatException e) {
+                return null;
+            }
+        }
+        return null;
+    }
+
+    /** Returns whether {@code key} is a valid {@link PeopleTileKey}. */
+    public static boolean isValid(PeopleTileKey key) {
+        return key != null && key.validate();
+    }
+
     @Override
     public boolean equals(Object other) {
         if (this == other) {
diff --git a/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java b/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java
index 1ed98c0..03d1f15 100644
--- a/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java
+++ b/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java
@@ -93,6 +93,8 @@
         setAlpha(1f);
         setVisibility(View.VISIBLE);
         mWindowManager.addView(this, getLayoutParams(mWindowToken));
+        announceForAccessibility(
+                getContext().getString(R.string.inattentive_sleep_warning_message));
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index 6660081..74550f2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -28,12 +28,8 @@
 import android.view.WindowInsets;
 import android.widget.FrameLayout;
 
-import androidx.dynamicanimation.animation.FloatPropertyCompat;
-import androidx.dynamicanimation.animation.SpringForce;
-
 import com.android.systemui.R;
 import com.android.systemui.qs.customize.QSCustomizer;
-import com.android.wm.shell.animation.PhysicsAnimator;
 
 /**
  * Wrapper view with background which contains {@link QSPanel} and {@link QuickStatusBarHeader}
@@ -41,26 +37,10 @@
 public class QSContainerImpl extends FrameLayout {
 
     private final Point mSizePoint = new Point();
-    private static final FloatPropertyCompat<QSContainerImpl> BACKGROUND_BOTTOM =
-            new FloatPropertyCompat<QSContainerImpl>("backgroundBottom") {
-                @Override
-                public float getValue(QSContainerImpl qsImpl) {
-                    return qsImpl.getBackgroundBottom();
-                }
-
-                @Override
-                public void setValue(QSContainerImpl background, float value) {
-                    background.setBackgroundBottom((int) value);
-                }
-            };
-    private static final PhysicsAnimator.SpringConfig BACKGROUND_SPRING
-            = new PhysicsAnimator.SpringConfig(SpringForce.STIFFNESS_MEDIUM,
-            SpringForce.DAMPING_RATIO_LOW_BOUNCY);
     private int mFancyClippingTop;
     private int mFancyClippingBottom;
     private final float[] mFancyClippingRadii = new float[] {0, 0, 0, 0, 0, 0, 0, 0};
     private  final Path mFancyClippingPath = new Path();
-    private int mBackgroundBottom = 0;
     private int mHeightOverride = -1;
     private View mQSDetail;
     private QuickStatusBarHeader mHeader;
@@ -71,7 +51,6 @@
     private int mSideMargins;
     private boolean mQsDisabled;
     private int mContentPadding = -1;
-    private boolean mAnimateBottomOnNextLayout;
     private int mNavBarInset = 0;
     private boolean mClippingEnabled;
 
@@ -86,11 +65,6 @@
         mQSDetail = findViewById(R.id.qs_detail);
         mHeader = findViewById(R.id.header);
         mQSCustomizer = findViewById(R.id.qs_customize);
-        mHeader.getHeaderQsPanel().setMediaVisibilityChangedListener((visible) -> {
-            if (mHeader.getHeaderQsPanel().isShown()) {
-                mAnimateBottomOnNextLayout = true;
-            }
-        });
         setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
     }
 
@@ -99,20 +73,6 @@
         return false;
     }
 
-    void onMediaVisibilityChanged(boolean qsVisible) {
-        mAnimateBottomOnNextLayout = qsVisible;
-    }
-
-    private void setBackgroundBottom(int value) {
-        // We're saving the bottom separately since otherwise the bottom would be overridden in
-        // the layout and the animation wouldn't properly start at the old position.
-        mBackgroundBottom = value;
-    }
-
-    private float getBackgroundBottom() {
-        return mBackgroundBottom;
-    }
-
     @Override
     protected void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
@@ -186,8 +146,7 @@
     @Override
     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
         super.onLayout(changed, left, top, right, bottom);
-        updateExpansion(mAnimateBottomOnNextLayout /* animate */);
-        mAnimateBottomOnNextLayout = false;
+        updateExpansion();
         updateClippingPath();
     }
 
@@ -230,31 +189,12 @@
     }
 
     public void updateExpansion() {
-        updateExpansion(false /* animate */);
-    }
-
-    public void updateExpansion(boolean animate) {
         int height = calculateContainerHeight();
         int scrollBottom = calculateContainerBottom();
         setBottom(getTop() + height);
         mQSDetail.setBottom(getTop() + scrollBottom);
         int qsDetailBottomMargin = ((MarginLayoutParams) mQSDetail.getLayoutParams()).bottomMargin;
         mQSDetail.setBottom(getTop() + scrollBottom - qsDetailBottomMargin);
-        updateBackgroundBottom(scrollBottom, animate);
-    }
-
-    private void updateBackgroundBottom(int height, boolean animated) {
-        PhysicsAnimator<QSContainerImpl> physicsAnimator = PhysicsAnimator.getInstance(this);
-        if (physicsAnimator.isPropertyAnimating(BACKGROUND_BOTTOM) || animated) {
-            // An animation is running or we want to animate
-            // Let's make sure to set the currentValue again, since the call below might only
-            // start in the next frame and otherwise we'd flicker
-            BACKGROUND_BOTTOM.setValue(this, BACKGROUND_BOTTOM.getValue(this));
-            physicsAnimator.spring(BACKGROUND_BOTTOM, height, BACKGROUND_SPRING).start();
-        } else {
-            BACKGROUND_BOTTOM.setValue(this, height);
-        }
-
     }
 
     protected int calculateContainerHeight() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java
index 3638395..7d61991 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java
@@ -61,12 +61,6 @@
     @Override
     protected void onViewAttached() {
         mView.updateResources(mQsPanelController, mQuickStatusBarHeaderController);
-        mQsPanelController.setMediaVisibilityChangedListener((visible) -> {
-            if (mQsPanelController.isShown()) {
-                mView.onMediaVisibilityChanged(true);
-            }
-        });
-
         mConfigurationController.addCallback(mConfigurationListener);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index c28c649..998cff2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -53,6 +53,8 @@
 import com.android.systemui.util.LifecycleFragment;
 import com.android.systemui.util.Utils;
 
+import java.util.function.Consumer;
+
 import javax.inject.Inject;
 import javax.inject.Named;
 
@@ -281,6 +283,11 @@
         return mLastQSExpansion == 0.0f || mLastQSExpansion == -1;
     }
 
+    @Override
+    public void setCollapsedMediaVisibilityChangedListener(Consumer<Boolean> listener) {
+        mQuickQSPanelController.setMediaVisibilityChangedListener(listener);
+    }
+
     private void setEditLocation(View view) {
         View edit = view.findViewById(android.R.id.edit);
         int[] loc = edit.getLocationOnScreen();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index c70eaff..7c7f566 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -46,7 +46,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.function.Consumer;
 
 /** View that represents the quick settings tile panel (when expanded/pulled down). **/
 public class QSPanel extends LinearLayout implements Tunable {
@@ -99,13 +98,8 @@
     private LinearLayout mHorizontalLinearLayout;
     protected LinearLayout mHorizontalContentContainer;
 
-    // Only used with media
-    private QSTileLayout mHorizontalTileLayout;
-    protected QSTileLayout mRegularTileLayout;
     protected QSTileLayout mTileLayout;
-    private int mLastOrientation = -1;
     private int mMediaTotalBottomMargin;
-    private Consumer<Boolean> mMediaVisibilityChangedListener;
 
     public QSPanel(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -121,8 +115,7 @@
     }
 
     void initialize() {
-        mRegularTileLayout = createRegularTileLayout();
-        mTileLayout = mRegularTileLayout;
+        mTileLayout = getOrCreateTileLayout();
 
         if (mUsingMediaPlayer) {
             mHorizontalLinearLayout = new RemeasuringLinearLayout(mContext);
@@ -135,7 +128,6 @@
             mHorizontalContentContainer.setClipChildren(true);
             mHorizontalContentContainer.setClipToPadding(false);
 
-            mHorizontalTileLayout = createHorizontalTileLayout();
             LayoutParams lp = new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1);
             int marginSize = (int) mContext.getResources().getDimension(R.dimen.qs_media_padding);
             lp.setMarginStart(0);
@@ -148,12 +140,6 @@
         }
     }
 
-    protected void onMediaVisibilityChanged(Boolean visible) {
-        if (mMediaVisibilityChangedListener != null) {
-            mMediaVisibilityChangedListener.accept(visible);
-        }
-    }
-
     /**
      * Add brightness view above the tile layout.
      *
@@ -184,17 +170,12 @@
     }
 
     /** */
-    public QSTileLayout createRegularTileLayout() {
-        if (mRegularTileLayout == null) {
-            mRegularTileLayout = (QSTileLayout) LayoutInflater.from(mContext)
+    public QSTileLayout getOrCreateTileLayout() {
+        if (mTileLayout == null) {
+            mTileLayout = (QSTileLayout) LayoutInflater.from(mContext)
                     .inflate(R.layout.qs_paged_tile_layout, this, false);
         }
-        return mRegularTileLayout;
-    }
-
-
-    protected QSTileLayout createHorizontalTileLayout() {
-        return createRegularTileLayout();
+        return mTileLayout;
     }
 
     @Override
@@ -281,18 +262,18 @@
      * @param pageIndicator indicator to use for page scrolling
      */
     public void setFooterPageIndicator(PageIndicator pageIndicator) {
-        if (mRegularTileLayout instanceof PagedTileLayout) {
+        if (mTileLayout instanceof PagedTileLayout) {
             mFooterPageIndicator = pageIndicator;
             updatePageIndicator();
         }
     }
 
     private void updatePageIndicator() {
-        if (mRegularTileLayout instanceof PagedTileLayout) {
+        if (mTileLayout instanceof PagedTileLayout) {
             if (mFooterPageIndicator != null) {
                 mFooterPageIndicator.setVisibility(View.GONE);
 
-                ((PagedTileLayout) mRegularTileLayout).setPageIndicator(mFooterPageIndicator);
+                ((PagedTileLayout) mTileLayout).setPageIndicator(mFooterPageIndicator);
             }
         }
     }
@@ -362,7 +343,7 @@
         return true;
     }
 
-    protected boolean needsDynamicRowsAndColumns() {
+    private boolean needsDynamicRowsAndColumns() {
         return true;
     }
 
@@ -667,10 +648,6 @@
         mHeaderContainer = headerContainer;
     }
 
-    public void setMediaVisibilityChangedListener(Consumer<Boolean> visibilityChangedListener) {
-        mMediaVisibilityChangedListener = visibilityChangedListener;
-    }
-
     public boolean isListening() {
         return mListening;
     }
@@ -681,39 +658,20 @@
     }
 
     protected void setPageMargin(int pageMargin) {
-        if (mRegularTileLayout instanceof PagedTileLayout) {
-            ((PagedTileLayout) mRegularTileLayout).setPageMargin(pageMargin);
-        }
-        if (mHorizontalTileLayout != mRegularTileLayout
-                && mHorizontalTileLayout instanceof PagedTileLayout) {
-            ((PagedTileLayout) mHorizontalTileLayout).setPageMargin(pageMargin);
+        if (mTileLayout instanceof PagedTileLayout) {
+            ((PagedTileLayout) mTileLayout).setPageMargin(pageMargin);
         }
     }
 
-    void setUsingHorizontalLayout(boolean horizontal, ViewGroup mediaHostView, boolean force,
-            UiEventLogger uiEventLogger) {
+    void setUsingHorizontalLayout(boolean horizontal, ViewGroup mediaHostView, boolean force) {
         if (horizontal != mUsingHorizontalLayout || force) {
             mUsingHorizontalLayout = horizontal;
-            View visibleView = horizontal ? mHorizontalLinearLayout : (View) mRegularTileLayout;
-            View hiddenView = horizontal ? (View) mRegularTileLayout : mHorizontalLinearLayout;
             ViewGroup newParent = horizontal ? mHorizontalContentContainer : this;
-            QSPanel.QSTileLayout newLayout = horizontal
-                    ? mHorizontalTileLayout : mRegularTileLayout;
-            if (hiddenView != null
-                    && (mRegularTileLayout != mHorizontalTileLayout
-                    || hiddenView != mRegularTileLayout)) {
-                // Only hide the view if the horizontal and the regular view are different,
-                // otherwise its reattached.
-                hiddenView.setVisibility(View.GONE);
-            }
-            visibleView.setVisibility(View.VISIBLE);
-            switchAllContentToParent(newParent, newLayout);
+            switchAllContentToParent(newParent, mTileLayout);
             reAttachMediaHost(mediaHostView, horizontal);
-            mTileLayout = newLayout;
-            newLayout.setListening(mListening, uiEventLogger);
             if (needsDynamicRowsAndColumns()) {
-                newLayout.setMinRows(horizontal ? 2 : 1);
-                newLayout.setMaxColumns(horizontal ? 2 : 4);
+                mTileLayout.setMinRows(horizontal ? 2 : 1);
+                mTileLayout.setMaxColumns(horizontal ? 2 : 4);
             }
             updateMargins(mediaHostView);
         }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
index ac92d4f..ae0f510 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
@@ -45,8 +45,6 @@
 import com.android.systemui.statusbar.policy.BrightnessMirrorController;
 import com.android.systemui.tuner.TunerService;
 
-import java.util.function.Consumer;
-
 import javax.inject.Inject;
 import javax.inject.Named;
 
@@ -149,14 +147,14 @@
             mBrightnessMirrorController.addCallback(mBrightnessMirrorListener);
         }
 
-        ((PagedTileLayout) mView.createRegularTileLayout())
+        ((PagedTileLayout) mView.getOrCreateTileLayout())
                 .setOnTouchListener(mTileLayoutTouchListener);
     }
 
     @Override
     protected QSTileRevealController createTileRevealController() {
         return mQsTileRevealControllerFactory.create(
-                this, (PagedTileLayout) mView.createRegularTileLayout());
+                this, (PagedTileLayout) mView.getOrCreateTileLayout());
     }
 
     @Override
@@ -289,11 +287,6 @@
         mView.setPageListener(listener);
     }
 
-    /** */
-    public void setMediaVisibilityChangedListener(Consumer<Boolean> visibilityChangedListener) {
-        mView.setMediaVisibilityChangedListener(visibilityChangedListener);
-    }
-
     public boolean isShown() {
         return mView.isShown();
     }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
index 170785c..7a09826 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
@@ -19,6 +19,8 @@
 import static com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import static com.android.systemui.qs.dagger.QSFragmentModule.QS_USING_MEDIA_PLAYER;
 
+import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.content.ComponentName;
 import android.content.res.Configuration;
 import android.metrics.LogMaker;
@@ -42,6 +44,7 @@
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 import javax.inject.Named;
@@ -68,6 +71,8 @@
     protected final ArrayList<TileRecord> mRecords = new ArrayList<>();
     private boolean mShouldUseSplitNotificationShade;
 
+    @Nullable
+    private Consumer<Boolean> mMediaVisibilityChangedListener;
     private int mLastOrientation;
     private String mCachedSpecs = "";
     private QSTileRevealController mQsTileRevealController;
@@ -89,7 +94,9 @@
             };
 
     private final Function1<Boolean, Unit> mMediaHostVisibilityListener = (visible) -> {
-        mView.onMediaVisibilityChanged(visible);
+        if (mMediaVisibilityChangedListener != null) {
+            mMediaVisibilityChangedListener.accept(visible);
+        }
         switchTileLayout(false);
         return null;
     };
@@ -136,7 +143,6 @@
         }
 
         mMediaHost.addVisibilityChangeListener(mMediaHostVisibilityListener);
-        mView.onMediaVisibilityChanged(mMediaHost.getVisible());
         mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener);
         mHost.addCallback(mQSHostCallback);
         setTiles();
@@ -291,20 +297,12 @@
     }
 
     boolean switchTileLayout(boolean force) {
-        /** Whether or not the QuickQSPanel currently contains a media player. */
+        /* Whether or not the panel currently contains a media player. */
         boolean horizontal = shouldUseHorizontalLayout();
         if (horizontal != mUsingHorizontalLayout || force) {
             mUsingHorizontalLayout = horizontal;
-            for (QSPanelControllerBase.TileRecord record : mRecords) {
-                mView.removeTile(record);
-                record.tile.removeCallback(record.callback);
-            }
-            mView.setUsingHorizontalLayout(mUsingHorizontalLayout, mMediaHost.getHostView(), force,
-                    mUiEventLogger);
+            mView.setUsingHorizontalLayout(mUsingHorizontalLayout, mMediaHost.getHostView(), force);
             updateMediaDisappearParameters();
-
-            setTiles();
-
             return true;
         }
         return false;
@@ -381,6 +379,13 @@
         return mView.getTileLayout();
     }
 
+    /**
+     * Add a listener for when the media visibility changes.
+     */
+    public void setMediaVisibilityChangedListener(@NonNull Consumer<Boolean> listener) {
+        mMediaVisibilityChangedListener = listener;
+    }
+
     /** */
     public static final class TileRecord extends QSPanel.Record {
         public QSTile tile;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
index 3a6f1d5..7f19d0e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
@@ -185,15 +185,22 @@
         final boolean isProfileOwnerOfOrganizationOwnedDevice =
                 mSecurityController.isProfileOwnerOfOrganizationOwnedDevice();
         final boolean isParentalControlsEnabled = mSecurityController.isParentalControlsEnabled();
+        final boolean isWorkProfileOn = mSecurityController.isWorkProfileOn();
+        final boolean hasDisclosableWorkProfilePolicy = hasCACertsInWorkProfile
+                || vpnNameWorkProfile != null || (hasWorkProfile && isNetworkLoggingEnabled);
         // Update visibility of footer
-        mIsVisible = (isDeviceManaged && !isDemoDevice) || hasCACerts || hasCACertsInWorkProfile
-                || vpnName != null || vpnNameWorkProfile != null
-                || isProfileOwnerOfOrganizationOwnedDevice || isParentalControlsEnabled
-                || (hasWorkProfile && isNetworkLoggingEnabled);
+        mIsVisible = (isDeviceManaged && !isDemoDevice)
+                || hasCACerts
+                || vpnName != null
+                || isProfileOwnerOfOrganizationOwnedDevice
+                || isParentalControlsEnabled
+                || (hasDisclosableWorkProfilePolicy && isWorkProfileOn);
         // Update the view to be untappable if the device is an organization-owned device with a
-        // managed profile and there is no policy set which requires a privacy disclosure.
-        if (mIsVisible && isProfileOwnerOfOrganizationOwnedDevice && !isNetworkLoggingEnabled
-                && !hasCACertsInWorkProfile && vpnNameWorkProfile == null) {
+        // managed profile and there is either:
+        // a) no policy set which requires a privacy disclosure.
+        // b) a specific work policy set but the work profile is turned off.
+        if (mIsVisible && isProfileOwnerOfOrganizationOwnedDevice
+                && (!hasDisclosableWorkProfilePolicy || !isWorkProfileOn)) {
             mRootView.setClickable(false);
             mRootView.findViewById(R.id.footer_icon).setVisibility(View.GONE);
         } else {
@@ -204,7 +211,8 @@
         mFooterTextContent = getFooterText(isDeviceManaged, hasWorkProfile,
                 hasCACerts, hasCACertsInWorkProfile, isNetworkLoggingEnabled, vpnName,
                 vpnNameWorkProfile, organizationName, workProfileOrganizationName,
-                isProfileOwnerOfOrganizationOwnedDevice, isParentalControlsEnabled);
+                isProfileOwnerOfOrganizationOwnedDevice, isParentalControlsEnabled,
+                isWorkProfileOn);
         // Update the icon
         int footerIconId = R.drawable.ic_info_outline;
         if (vpnName != null || vpnNameWorkProfile != null) {
@@ -236,7 +244,8 @@
             boolean hasCACerts, boolean hasCACertsInWorkProfile, boolean isNetworkLoggingEnabled,
             String vpnName, String vpnNameWorkProfile, CharSequence organizationName,
             CharSequence workProfileOrganizationName,
-            boolean isProfileOwnerOfOrganizationOwnedDevice, boolean isParentalControlsEnabled) {
+            boolean isProfileOwnerOfOrganizationOwnedDevice, boolean isParentalControlsEnabled,
+            boolean isWorkProfileOn) {
         if (isParentalControlsEnabled) {
             return mContext.getString(R.string.quick_settings_disclosure_parental_controls);
         }
@@ -280,7 +289,7 @@
                         organizationName);
             }
         } // end if(isDeviceManaged)
-        if (hasCACertsInWorkProfile) {
+        if (hasCACertsInWorkProfile && isWorkProfileOn) {
             if (workProfileOrganizationName == null) {
                 return mContext.getString(
                         R.string.quick_settings_disclosure_managed_profile_monitoring);
@@ -295,7 +304,7 @@
         if (vpnName != null && vpnNameWorkProfile != null) {
             return mContext.getString(R.string.quick_settings_disclosure_vpns);
         }
-        if (vpnNameWorkProfile != null) {
+        if (vpnNameWorkProfile != null && isWorkProfileOn) {
             return mContext.getString(R.string.quick_settings_disclosure_managed_profile_named_vpn,
                     vpnNameWorkProfile);
         }
@@ -308,7 +317,7 @@
             return mContext.getString(R.string.quick_settings_disclosure_named_vpn,
                     vpnName);
         }
-        if (hasWorkProfile && isNetworkLoggingEnabled) {
+        if (hasWorkProfile && isNetworkLoggingEnabled && isWorkProfileOn) {
             return mContext.getString(
                     R.string.quick_settings_disclosure_managed_profile_network_activity);
         }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index 659475d..68962b0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -61,21 +61,10 @@
     }
 
     @Override
-    public TileLayout createRegularTileLayout() {
+    public TileLayout getOrCreateTileLayout() {
         return new QQSSideLabelTileLayout(mContext);
     }
 
-    @Override
-    protected QSTileLayout createHorizontalTileLayout() {
-        TileLayout t = createRegularTileLayout();
-        t.setMaxColumns(2);
-        return t;
-    }
-
-    @Override
-    protected boolean needsDynamicRowsAndColumns() {
-        return false; // QQS always have the same layout
-    }
 
     @Override
     protected boolean displayMediaMarginsOnMedia() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
index d017c74..b904505 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
@@ -567,6 +567,8 @@
 
         public void clearDrag() {
             itemView.clearAnimation();
+            itemView.setScaleX(1);
+            itemView.setScaleY(1);
         }
 
         public void startDrag() {
@@ -812,5 +814,12 @@
         @Override
         public void onSwiped(ViewHolder viewHolder, int direction) {
         }
+
+        // Just in case, make sure to animate to base state.
+        @Override
+        public void clearView(@NonNull RecyclerView recyclerView, @NonNull ViewHolder viewHolder) {
+            ((Holder) viewHolder).stopDrag();
+            super.clearView(recyclerView, viewHolder);
+        }
     };
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
index 98cd88a..4dc7508 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
@@ -73,6 +73,7 @@
     private final QuickAccessWalletController mController;
 
     private WalletCard mSelectedCard;
+    private boolean mIsWalletUpdating = true;
     @VisibleForTesting Drawable mCardViewDrawable;
 
     @Inject
@@ -110,7 +111,8 @@
         super.handleSetListening(listening);
         if (listening) {
             mController.setupWalletChangeObservers(mCardRetriever, DEFAULT_PAYMENT_APP_CHANGE);
-            if (!mController.getWalletClient().isWalletServiceAvailable()) {
+            if (!mController.getWalletClient().isWalletServiceAvailable()
+                    || !mController.getWalletClient().isWalletFeatureAvailable()) {
                 Log.i(TAG, "QAW service is unavailable, recreating the wallet client.");
                 mController.reCreateWalletClient();
             }
@@ -158,7 +160,8 @@
         state.contentDescription = state.label;
         state.icon = ResourceIcon.get(R.drawable.ic_wallet_lockscreen);
         boolean isDeviceLocked = !mKeyguardStateController.isUnlocked();
-        if (mController.getWalletClient().isWalletServiceAvailable()) {
+        if (mController.getWalletClient().isWalletServiceAvailable()
+                && mController.getWalletClient().isWalletFeatureAvailable()) {
             if (mSelectedCard != null) {
                 if (isDeviceLocked) {
                     state.state = Tile.STATE_INACTIVE;
@@ -172,7 +175,11 @@
                 }
             } else {
                 state.state = Tile.STATE_INACTIVE;
-                state.secondaryLabel = mContext.getString(R.string.wallet_secondary_label_no_card);
+                state.secondaryLabel =
+                        mContext.getString(
+                                mIsWalletUpdating
+                                        ? R.string.wallet_secondary_label_updating
+                                        : R.string.wallet_secondary_label_no_card);
                 state.sideViewCustomDrawable = null;
             }
             state.stateDescription = state.secondaryLabel;
@@ -218,6 +225,7 @@
         @Override
         public void onWalletCardsRetrieved(@NonNull GetWalletCardsResponse response) {
             Log.i(TAG, "Successfully retrieved wallet cards.");
+            mIsWalletUpdating = false;
             List<WalletCard> cards = response.getWalletCards();
             if (cards.isEmpty()) {
                 Log.d(TAG, "No wallet cards exist.");
@@ -240,7 +248,7 @@
 
         @Override
         public void onWalletCardRetrievalError(@NonNull GetWalletCardsError error) {
-            Log.w(TAG, "Error retrieve wallet cards");
+            mIsWalletUpdating = false;
             mCardViewDrawable = null;
             mSelectedCard = null;
             refreshState();
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java
index 57125f3..df766f3 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java
@@ -30,9 +30,9 @@
 import android.view.Window;
 import android.view.WindowManager;
 import android.widget.ArrayAdapter;
-import android.widget.Button;
 import android.widget.Spinner;
 import android.widget.Switch;
+import android.widget.TextView;
 
 import com.android.systemui.R;
 import com.android.systemui.settings.UserContextProvider;
@@ -78,12 +78,12 @@
 
         setContentView(R.layout.screen_record_dialog);
 
-        Button cancelBtn = findViewById(R.id.button_cancel);
+        TextView cancelBtn = findViewById(R.id.button_cancel);
         cancelBtn.setOnClickListener(v -> {
             finish();
         });
 
-        Button startBtn = findViewById(R.id.button_start);
+        TextView startBtn = findViewById(R.id.button_start);
         startBtn.setOnClickListener(v -> {
             requestScreenCapture();
             finish();
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/CropView.java b/packages/SystemUI/src/com/android/systemui/screenshot/CropView.java
index 0a60f6d..a9cecaa 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/CropView.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/CropView.java
@@ -44,6 +44,7 @@
 import androidx.customview.widget.ExploreByTouchHelper;
 import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
 
+import com.android.internal.graphics.ColorUtils;
 import com.android.systemui.R;
 
 import java.util.List;
@@ -95,7 +96,9 @@
         TypedArray t = context.getTheme().obtainStyledAttributes(
                 attrs, R.styleable.CropView, 0, 0);
         mShadePaint = new Paint();
-        mShadePaint.setColor(t.getColor(R.styleable.CropView_scrimColor, Color.TRANSPARENT));
+        int alpha = t.getInteger(R.styleable.CropView_scrimAlpha, 255);
+        int scrimColor = t.getColor(R.styleable.CropView_scrimColor, Color.TRANSPARENT);
+        mShadePaint.setColor(ColorUtils.setAlphaComponent(scrimColor, alpha));
         mContainerBackgroundPaint = new Paint();
         mContainerBackgroundPaint.setColor(t.getColor(R.styleable.CropView_containerBackgroundColor,
                 Color.TRANSPARENT));
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/MagnifierView.java b/packages/SystemUI/src/com/android/systemui/screenshot/MagnifierView.java
index 34b40f7..7873732 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/MagnifierView.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/MagnifierView.java
@@ -33,6 +33,7 @@
 
 import androidx.annotation.Nullable;
 
+import com.android.internal.graphics.ColorUtils;
 import com.android.systemui.R;
 
 /**
@@ -83,7 +84,9 @@
         TypedArray t = context.getTheme().obtainStyledAttributes(
                 attrs, R.styleable.MagnifierView, 0, 0);
         mShadePaint = new Paint();
-        mShadePaint.setColor(t.getColor(R.styleable.MagnifierView_scrimColor, Color.TRANSPARENT));
+        int alpha = t.getInteger(R.styleable.MagnifierView_scrimAlpha, 255);
+        int scrimColor = t.getColor(R.styleable.MagnifierView_scrimColor, Color.TRANSPARENT);
+        mShadePaint.setColor(ColorUtils.setAlphaComponent(scrimColor, alpha));
         mHandlePaint = new Paint();
         mHandlePaint.setColor(t.getColor(R.styleable.MagnifierView_handleColor, Color.BLACK));
         mHandlePaint.setStrokeWidth(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 0bb702f..c09f98d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -885,6 +885,11 @@
                     .isUnlockingWithBiometricAllowed(true /* isStrongBiometric */)) {
                 return;
             }
+
+            if (biometricSourceType == BiometricSourceType.FACE && shouldSuppressFaceMsg()) {
+                return;
+            }
+
             boolean showSwipeToUnlock =
                     msgId == KeyguardUpdateMonitor.BIOMETRIC_HELP_FACE_NOT_RECOGNIZED;
             if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
@@ -912,7 +917,8 @@
                 // The face timeout message is not very actionable, let's ask the user to
                 // manually retry.
                 if (!mStatusBarKeyguardViewManager.isBouncerShowing()
-                        && mKeyguardUpdateMonitor.isUdfpsEnrolled()) {
+                        && mKeyguardUpdateMonitor.isUdfpsEnrolled()
+                        && mKeyguardUpdateMonitor.isFingerprintDetectionRunning()) {
                     // suggest trying fingerprint
                     showTransientIndication(R.string.keyguard_try_fingerprint);
                 } else {
@@ -952,7 +958,18 @@
                     || msgId == FingerprintManager.FINGERPRINT_ERROR_USER_CANCELED);
         }
 
+        private boolean shouldSuppressFaceMsg() {
+            // For dual biometric, don't show face auth messages unless face auth was explicitly
+            // requested by the user.
+            return mKeyguardUpdateMonitor.isUdfpsEnrolled()
+                && mKeyguardUpdateMonitor.isFingerprintDetectionRunning()
+                && !mKeyguardUpdateMonitor.isFaceAuthUserRequested();
+        }
+
         private boolean shouldSuppressFaceError(int msgId, KeyguardUpdateMonitor updateMonitor) {
+            if (shouldSuppressFaceMsg()) {
+                return true;
+            }
             // Only checking if unlocking with Biometric is allowed (no matter strong or non-strong
             // as long as primary auth, i.e. PIN/pattern/password, is not required), so it's ok to
             // pass true for isStrongBiometric to isUnlockingWithBiometricAllowed() to bypass the
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
index 0b67e7e..4552138 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
@@ -369,7 +369,7 @@
         });
         mSmartReplyController.setCallback((entry, reply) -> {
             StatusBarNotification newSbn =
-                    rebuildNotificationWithRemoteInput(entry, reply, true /* showSpinner */,
+                    rebuildNotificationWithRemoteInputInserted(entry, reply, true /* showSpinner */,
                             null /* mimeType */, null /* uri */);
             mEntryManager.updateNotification(newSbn, null /* ranking */);
         });
@@ -638,12 +638,12 @@
     @VisibleForTesting
     StatusBarNotification rebuildNotificationForCanceledSmartReplies(
             NotificationEntry entry) {
-        return rebuildNotificationWithRemoteInput(entry, null /* remoteInputTest */,
+        return rebuildNotificationWithRemoteInputInserted(entry, null /* remoteInputTest */,
                 false /* showSpinner */, null /* mimeType */, null /* uri */);
     }
 
     @VisibleForTesting
-    StatusBarNotification rebuildNotificationWithRemoteInput(NotificationEntry entry,
+    StatusBarNotification rebuildNotificationWithRemoteInputInserted(NotificationEntry entry,
             CharSequence remoteInputText, boolean showSpinner, String mimeType, Uri uri) {
         StatusBarNotification sbn = entry.getSbn();
 
@@ -746,7 +746,7 @@
                 }
                 String remoteInputMimeType = entry.remoteInputMimeType;
                 Uri remoteInputUri = entry.remoteInputUri;
-                StatusBarNotification newSbn = rebuildNotificationWithRemoteInput(entry,
+                StatusBarNotification newSbn = rebuildNotificationWithRemoteInputInserted(entry,
                         remoteInputText, false /* showSpinner */, remoteInputMimeType,
                         remoteInputUri);
                 entry.onRemoteInputInserted();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
index 9765ace..b34bfad 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
@@ -179,7 +179,10 @@
     }
 
     override fun onTouchEvent(event: MotionEvent): Boolean {
-        if (!canHandleMotionEvent()) {
+        val finishExpanding = (event.action == MotionEvent.ACTION_CANCEL ||
+            event.action == MotionEvent.ACTION_UP) && isExpanding
+        if (!canHandleMotionEvent() && !finishExpanding) {
+            // We allow cancellations/finishing to still go through here to clean up the state
             return false
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
index 9f82152..96b0e78 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
@@ -51,6 +51,7 @@
 import android.service.notification.SnoozeCriterion;
 import android.service.notification.StatusBarNotification;
 import android.util.ArraySet;
+import android.view.ContentInfo;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -126,8 +127,12 @@
     public int targetSdk;
     private long lastFullScreenIntentLaunchTime = NOT_LAUNCHED_YET;
     public CharSequence remoteInputText;
+    // Mimetype and Uri used to display the image in the notification *after* it has been sent.
     public String remoteInputMimeType;
     public Uri remoteInputUri;
+    // ContentInfo used to keep the attachment permission alive until RemoteInput is sent or
+    // cancelled.
+    public ContentInfo remoteInputAttachment;
     private Notification.BubbleMetadata mBubbleMetadata;
     private ShortcutInfo mShortcutInfo;
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index 5ccb064..ba2f555 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -77,7 +77,6 @@
 import com.android.systemui.Dumpable;
 import com.android.systemui.ExpandHelper;
 import com.android.systemui.R;
-import com.android.systemui.animation.ActivityLaunchAnimator;
 import com.android.systemui.animation.Interpolators;
 import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper;
 import com.android.systemui.statusbar.CommandQueue;
@@ -201,6 +200,7 @@
     private int mPaddingBetweenElements;
     private int mMaxTopPadding;
     private int mTopPadding;
+    private boolean mAnimateNextTopPaddingChange;
     private int mBottomMargin;
     private int mBottomInset = 0;
     private float mQsExpansionFraction;
@@ -1212,16 +1212,18 @@
     @ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
     private void setTopPadding(int topPadding, boolean animate) {
         if (mTopPadding != topPadding) {
+            boolean shouldAnimate = animate || mAnimateNextTopPaddingChange;
             mTopPadding = topPadding;
             updateAlgorithmHeightAndPadding();
             updateContentHeight();
-            if (animate && mAnimationsEnabled && mIsExpanded) {
+            if (shouldAnimate && mAnimationsEnabled && mIsExpanded) {
                 mTopPaddingNeedsAnimation = true;
                 mNeedsAnimation = true;
             }
             updateStackPosition();
             requestChildrenUpdate();
-            notifyHeightChangeListener(null, animate);
+            notifyHeightChangeListener(null, shouldAnimate);
+            mAnimateNextTopPaddingChange = false;
         }
     }
 
@@ -2071,6 +2073,9 @@
         int scrollRange = Math.max(0, contentHeight - mMaxLayoutHeight);
         int imeInset = getImeInset();
         scrollRange += Math.min(imeInset, Math.max(0, contentHeight - (getHeight() - imeInset)));
+        if (scrollRange > 0) {
+            scrollRange = Math.max(getScrollAmountToScrollBoundary(), scrollRange);
+        }
         return scrollRange;
     }
 
@@ -5552,6 +5557,13 @@
     }
 
     /**
+     * Request an animation whenever the toppadding changes next
+     */
+    public void animateNextTopPaddingChange() {
+        mAnimateNextTopPaddingChange = true;
+    }
+
+    /**
      * A listener that is notified when the empty space below the notifications is clicked on
      */
     @ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
index e71f7db..09afedb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
@@ -1459,6 +1459,13 @@
     }
 
     /**
+     * Request an animation whenever the toppadding changes next
+     */
+    public void animateNextTopPaddingChange() {
+        mView.animateNextTopPaddingChange();
+    }
+
+    /**
      * Enum for UiEvent logged from this class
      */
     enum NotificationPanelEvent implements UiEventLogger.UiEventEnum {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
index 8f4a71c..9ce9aa8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
@@ -420,8 +420,9 @@
                 // When pulsing (incoming notification on AOD), innerHeight is 0; clamp all
                 // to shelf start, thereby hiding all notifications (except the first one, which we
                 // later unhide in updatePulsingState)
-                final int shelfStart = ambientState.getInnerHeight()
-                        - ambientState.getShelf().getIntrinsicHeight();
+                final int stackBottom = !ambientState.isShadeExpanded() || ambientState.isDozing()
+                        ? ambientState.getInnerHeight() : (int) ambientState.getStackHeight();
+                final int shelfStart = stackBottom - ambientState.getShelf().getIntrinsicHeight();
                 viewState.yTranslation = Math.min(viewState.yTranslation, shelfStart);
                 if (viewState.yTranslation >= shelfStart) {
                     viewState.hidden = !view.isExpandAnimationRunning()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java
index 96276f4..1789743 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java
@@ -38,7 +38,7 @@
  * A view to show hints on Keyguard ("Swipe up to unlock", "Tap again to open").
  */
 public class KeyguardIndicationTextView extends TextView {
-    private static final long MSG_DURATION_MILLIS = 1500;
+    private static final long MSG_MIN_DURATION_MILLIS_DEFAULT = 1500;
     private long mNextAnimationTime = 0;
     private boolean mAnimationsEnabled = true;
     private LinkedList<CharSequence> mMessages = new LinkedList<>();
@@ -104,8 +104,13 @@
         long delay = Math.max(0, mNextAnimationTime - timeInMillis);
         setNextAnimationTime(timeInMillis + delay + getFadeOutDuration());
 
+        final long minDurationMillis =
+                (indication != null && indication.getMinVisibilityMillis() != null)
+                    ? indication.getMinVisibilityMillis()
+                    : MSG_MIN_DURATION_MILLIS_DEFAULT;
+
         if (!text.equals("") || hasIcon) {
-            setNextAnimationTime(mNextAnimationTime + MSG_DURATION_MILLIS);
+            setNextAnimationTime(mNextAnimationTime + minDurationMillis);
             animSetBuilder.before(getInAnimator());
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt
index bfe0684..ec2d036 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt
@@ -53,7 +53,7 @@
             // Not listening anymore since trigger events unregister themselves
             isListening = false
             updateListeningState()
-            keyguardUpdateMonitor.requestFaceAuth()
+            keyguardUpdateMonitor.requestFaceAuth(true)
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
index 5d31786..1a2b989 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -557,6 +557,11 @@
     private long mNotificationBoundsAnimationDelay;
 
     /**
+     * The duration of the notification bounds animation
+     */
+    private long mNotificationBoundsAnimationDuration;
+
+    /**
      * Is this a collapse that started on the panel where we should allow the panel to intercept
      */
     private boolean mIsPanelCollapseOnQQS;
@@ -2038,7 +2043,7 @@
         // When expanding QS, let's authenticate the user if possible,
         // this will speed up notification actions.
         if (height == 0) {
-            mStatusBar.requestFaceAuth();
+            mStatusBar.requestFaceAuth(false);
         }
     }
 
@@ -2214,7 +2219,8 @@
     private void onStackYChanged(boolean shouldAnimate) {
         if (mQs != null) {
             if (shouldAnimate) {
-                mAnimateNextNotificationBounds = true;
+                animateNextNotificationBounds(StackStateAnimator.ANIMATION_DURATION_STANDARD,
+                        0 /* delay */);
                 mNotificationBoundsAnimationDelay = 0;
             }
             setQSClippingBounds();
@@ -2293,8 +2299,7 @@
             final int startBottom = mKeyguardStatusAreaClipBounds.bottom;
             mQsClippingAnimation = ValueAnimator.ofFloat(0.0f, 1.0f);
             mQsClippingAnimation.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
-            mQsClippingAnimation.setDuration(
-                    StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE);
+            mQsClippingAnimation.setDuration(mNotificationBoundsAnimationDuration);
             mQsClippingAnimation.setStartDelay(mNotificationBoundsAnimationDelay);
             mQsClippingAnimation.addUpdateListener(animation -> {
                 float fraction = animation.getAnimatedFraction();
@@ -2470,8 +2475,10 @@
      * shade. 0.0f means we're not transitioning yet.
      */
     public void setTransitionToFullShadeAmount(float pxAmount, boolean animate, long delay) {
-        mAnimateNextNotificationBounds = animate && !mShouldUseSplitNotificationShade;
-        mNotificationBoundsAnimationDelay = delay;
+        if (animate && !mShouldUseSplitNotificationShade) {
+            animateNextNotificationBounds(StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE,
+                    delay);
+        }
 
         float endPosition = 0;
         if (pxAmount > 0.0f) {
@@ -3176,7 +3183,7 @@
             case KEYGUARD:
                 if (!mDozingOnDown) {
                     if (mKeyguardBypassController.getBypassEnabled()) {
-                        mUpdateMonitor.requestFaceAuth();
+                        mUpdateMonitor.requestFaceAuth(true);
                     } else {
                         mLockscreenGestureLogger.write(MetricsEvent.ACTION_LS_HINT,
                                 0 /* lengthDp - N/A */, 0 /* velocityDp - N/A */);
@@ -3470,7 +3477,6 @@
             mQs.setPanelView(mHeightListener);
             mQs.setExpandClickListener(mOnClickListener);
             mQs.setHeaderClickable(mQsExpansionEnabled);
-            mQs.setTranslateWhileExpanding(mShouldUseSplitNotificationShade);
             updateQSPulseExpansion();
             mQs.setOverscrolling(mStackScrollerOverscrolling);
             mQs.setTranslateWhileExpanding(mShouldUseSplitNotificationShade);
@@ -3484,6 +3490,13 @@
                             mHeightListener.onQsHeightChanged();
                         }
                     });
+            mQs.setCollapsedMediaVisibilityChangedListener((visible) -> {
+                if (mQs.getHeader().isShown()) {
+                    animateNextNotificationBounds(StackStateAnimator.ANIMATION_DURATION_STANDARD,
+                            0 /* delay */);
+                    mNotificationStackScrollLayoutController.animateNextTopPaddingChange();
+                }
+            });
             mLockscreenShadeTransitionController.setQS(mQs);
             mNotificationStackScrollLayoutController.setQsContainer((ViewGroup) mQs.getView());
             updateQsExpansion();
@@ -3500,6 +3513,12 @@
         }
     };
 
+    private void animateNextNotificationBounds(long duration, long delay) {
+        mAnimateNextNotificationBounds = true;
+        mNotificationBoundsAnimationDuration = duration;
+        mNotificationBoundsAnimationDelay = delay;
+    }
+
     @Override
     public void setTouchAndAnimationDisabled(boolean disabled) {
         super.setTouchAndAnimationDisabled(disabled);
@@ -3821,8 +3840,13 @@
                     expand(true /* animate */);
                 }
                 initDownStates(event);
-                if (!mIsExpanding && !shouldQuickSettingsIntercept(mDownX, mDownY, 0)
-                        && mPulseExpansionHandler.onTouchEvent(event)) {
+
+                // If pulse is expanding already, let's give it the touch. There are situations
+                // where the panel starts expanding even though we're also pulsing
+                boolean pulseShouldGetTouch = (!mIsExpanding
+                        && !shouldQuickSettingsIntercept(mDownX, mDownY, 0))
+                        || mPulseExpansionHandler.isExpanding();
+                if (pulseShouldGetTouch && mPulseExpansionHandler.onTouchEvent(event)) {
                     // We're expanding all the other ones shouldn't get this anymore
                     return true;
                 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 53394c3..61a0d63 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -1723,9 +1723,9 @@
     /**
      * Asks {@link KeyguardUpdateMonitor} to run face auth.
      */
-    public void requestFaceAuth() {
+    public void requestFaceAuth(boolean userInitiatedRequest) {
         if (!mKeyguardStateController.canDismissLockScreen()) {
-            mKeyguardUpdateMonitor.requestFaceAuth();
+            mKeyguardUpdateMonitor.requestFaceAuth(userInitiatedRequest);
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt
index 9a04d39..6b00dd4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt
@@ -57,7 +57,7 @@
 
     private val lightRevealAnimator = ValueAnimator.ofFloat(1f, 0f).apply {
         duration = LIGHT_REVEAL_ANIMATION_DURATION
-        interpolator = Interpolators.FAST_OUT_SLOW_IN_REVERSE
+        interpolator = Interpolators.LINEAR
         addUpdateListener { lightRevealScrim.revealAmount = it.animatedValue as Float }
         addListener(object : AnimatorListenerAdapter() {
             override fun onAnimationCancel(animation: Animator?) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
index d5965ec..c20730e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
@@ -25,6 +25,7 @@
 import android.util.Log
 import android.view.View
 import android.widget.Chronometer
+import androidx.annotation.VisibleForTesting
 import com.android.internal.jank.InteractionJankMonitor
 import com.android.systemui.R
 import com.android.systemui.animation.ActivityLaunchAnimator
@@ -122,6 +123,7 @@
      * Should only be called from [CollapsedStatusBarFragment].
      */
     fun setChipView(chipView: View) {
+        tearDownChipView()
         this.chipView = chipView
         if (hasOngoingCall()) {
             updateChip()
@@ -165,8 +167,7 @@
         val currentCallNotificationInfo = callNotificationInfo ?: return
 
         val currentChipView = chipView
-        val timeView =
-            currentChipView?.findViewById<Chronometer>(R.id.ongoing_call_chip_time)
+        val timeView = currentChipView?.getTimeView()
         val backgroundView =
             currentChipView?.findViewById<View>(R.id.ongoing_call_chip_background)
 
@@ -248,12 +249,19 @@
 
     private fun removeChip() {
         callNotificationInfo = null
+        tearDownChipView()
         mListeners.forEach { l -> l.onOngoingCallStateChanged(animate = true) }
         if (uidObserver != null) {
             iActivityManager.unregisterUidObserver(uidObserver)
         }
     }
 
+    /** Tear down anything related to the chip view to prevent leaks. */
+    @VisibleForTesting
+    fun tearDownChipView() = chipView?.getTimeView()?.stop()
+
+    private fun View.getTimeView(): Chronometer? = this.findViewById(R.id.ongoing_call_chip_time)
+
     private data class CallNotificationInfo(
         val key: String,
         val callStartTime: Long,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
index e6c4e82..b18dfd2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
@@ -20,7 +20,6 @@
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
-import android.annotation.Nullable;
 import android.app.ActivityManager;
 import android.app.Notification;
 import android.app.PendingIntent;
@@ -38,7 +37,6 @@
 import android.graphics.drawable.GradientDrawable;
 import android.net.Uri;
 import android.os.Bundle;
-import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.os.UserHandle;
 import android.text.Editable;
@@ -72,13 +70,13 @@
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import com.android.internal.graphics.ColorUtils;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.UiEvent;
 import com.android.internal.logging.UiEventLogger;
 import com.android.internal.logging.nano.MetricsProto;
-import com.android.internal.statusbar.IStatusBarService;
 import com.android.internal.util.ContrastColorUtil;
 import com.android.systemui.Dependency;
 import com.android.systemui.R;
@@ -111,8 +109,8 @@
 
     private final SendButtonTextWatcher mTextWatcher;
     private final TextView.OnEditorActionListener mEditorActionHandler;
-    private final NotificationRemoteInputManager mRemoteInputManager;
     private final UiEventLogger mUiEventLogger;
+    private final RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
     private final List<OnFocusChangeListener> mEditTextFocusChangeListeners = new ArrayList<>();
     private final List<OnSendRemoteInputListener> mOnSendListeners = new ArrayList<>();
     private RemoteEditText mEditText;
@@ -123,9 +121,6 @@
     private RemoteInput[] mRemoteInputs;
     private RemoteInput mRemoteInput;
     private RemoteInputController mController;
-    private RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
-
-    private IStatusBarService mStatusBarManagerService;
 
     private NotificationEntry mEntry;
 
@@ -134,7 +129,6 @@
     private int mRevealCx;
     private int mRevealCy;
     private int mRevealR;
-    private ContentInfo mAttachment;
 
     private boolean mColorized;
     private int mTint;
@@ -143,7 +137,6 @@
     private NotificationViewWrapper mWrapper;
     private Consumer<Boolean> mOnVisibilityChangedListener;
     private NotificationRemoteInputManager.BouncerChecker mBouncerChecker;
-    private LinearLayout mContentView;
     private ImageView mDelete;
     private ImageView mDeleteBg;
 
@@ -174,10 +167,7 @@
         mTextWatcher = new SendButtonTextWatcher();
         mEditorActionHandler = new EditorActionHandler();
         mRemoteInputQuickSettingsDisabler = Dependency.get(RemoteInputQuickSettingsDisabler.class);
-        mRemoteInputManager = Dependency.get(NotificationRemoteInputManager.class);
         mUiEventLogger = Dependency.get(UiEventLogger.class);
-        mStatusBarManagerService = IStatusBarService.Stub.asInterface(
-                ServiceManager.getService(Context.STATUS_BAR_SERVICE));
         TypedArray ta = getContext().getTheme().obtainStyledAttributes(new int[]{
                 com.android.internal.R.attr.colorAccent,
                 com.android.internal.R.attr.colorSurface,
@@ -266,8 +256,8 @@
         mDeleteBg.setImageTintBlendMode(BlendMode.SRC_IN);
         mDelete.setImageTintBlendMode(BlendMode.SRC_IN);
         mDelete.setOnClickListener(v -> setAttachment(null));
-        mContentView = findViewById(R.id.remote_input_content);
-        mContentView.setBackground(mContentBackground);
+        LinearLayout contentView = findViewById(R.id.remote_input_content);
+        contentView.setBackground(mContentBackground);
         mEditText = findViewById(R.id.remote_input_text);
         mEditText.setInnerFocusable(false);
         mEditText.setWindowInsetsAnimationCallback(
@@ -293,15 +283,19 @@
     }
 
     private void setAttachment(ContentInfo item) {
-        if (mAttachment != null) {
+        if (mEntry.remoteInputAttachment != null && mEntry.remoteInputAttachment != item) {
             // We need to release permissions when sending the attachment to the target
             // app or if it is deleted by the user. When sending to the target app, we
             // can safely release permissions as soon as the call to
             // `mController.grantInlineReplyUriPermission` is made (ie, after the grant
             // to the target app has been created).
-            mAttachment.releasePermissions();
+            mEntry.remoteInputAttachment.releasePermissions();
         }
-        mAttachment = item;
+        mEntry.remoteInputAttachment = item;
+        if (item != null) {
+            mEntry.remoteInputUri = item.getClip().getItemAt(0).getUri();
+            mEntry.remoteInputMimeType = item.getClip().getDescription().getMimeType(0);
+        }
         View attachment = findViewById(R.id.remote_input_content_container);
         ImageView iconView = findViewById(R.id.remote_input_attachment_image);
         iconView.setImageDrawable(null);
@@ -323,10 +317,9 @@
      * @return returns intent with granted URI permissions that should be used immediately
      */
     private Intent prepareRemoteInput() {
-        if (mAttachment == null) return prepareRemoteInputFromText();
-        return prepareRemoteInputFromData(
-                mAttachment.getClip().getDescription().getMimeType(0),
-                mAttachment.getClip().getItemAt(0).getUri());
+        return mEntry.remoteInputAttachment == null
+                ? prepareRemoteInputFromText()
+                : prepareRemoteInputFromData(mEntry.remoteInputMimeType, mEntry.remoteInputUri);
     }
 
     private Intent prepareRemoteInputFromText() {
@@ -337,7 +330,7 @@
                 results);
 
         mEntry.remoteInputText = mEditText.getText().toString();
-        // TODO(b/188646667): store attachment to entry
+        setAttachment(null);
         mEntry.remoteInputUri = null;
         mEntry.remoteInputMimeType = null;
 
@@ -363,7 +356,8 @@
         RemoteInput.addResultsToIntent(mRemoteInputs, fillInIntent,
                 bundle);
 
-        CharSequence attachmentText = mAttachment.getClip().getDescription().getLabel();
+        CharSequence attachmentText =
+                mEntry.remoteInputAttachment.getClip().getDescription().getLabel();
 
         CharSequence attachmentLabel = TextUtils.isEmpty(attachmentText)
                 ? mContext.getString(R.string.remote_input_image_insertion_text)
@@ -374,14 +368,11 @@
                 : "\"" + attachmentLabel + "\" " + mEditText.getText();
 
         mEntry.remoteInputText = fullText;
-        // TODO(b/188646667): store attachment to entry
-        mEntry.remoteInputMimeType = contentType;
-        mEntry.remoteInputUri = data;
 
         // mirror prepareRemoteInputFromText for text input
         if (mEntry.editedSuggestionInfo == null) {
             RemoteInput.setResultsSource(fillInIntent, RemoteInput.SOURCE_FREE_FORM_INPUT);
-        } else if (mAttachment == null) {
+        } else if (mEntry.remoteInputAttachment == null) {
             RemoteInput.setResultsSource(fillInIntent, RemoteInput.SOURCE_CHOICE);
         }
 
@@ -437,6 +428,7 @@
                     mEntry.getSbn().getUid(), mEntry.getSbn().getPackageName(),
                     mEntry.getSbn().getInstanceId());
         }
+
         setAttachment(null);
     }
 
@@ -477,7 +469,6 @@
     private void onDefocus(boolean animate, boolean logClose) {
         mController.removeRemoteInput(mEntry, mToken);
         mEntry.remoteInputText = mEditText.getText();
-        // TODO(b/188646667): store attachment to entry
 
         // During removal, we get reattached and lose focus. Not hiding in that
         // case to prevent flicker.
@@ -565,7 +556,7 @@
         mEntry.editedSuggestionInfo = editedSuggestionInfo;
         if (editedSuggestionInfo != null) {
             mEntry.remoteInputText = editedSuggestionInfo.originalText;
-            // TODO(b/188646667): store attachment to entry
+            mEntry.remoteInputAttachment = null;
         }
     }
 
@@ -608,7 +599,7 @@
         mEditText.setSelection(mEditText.length());
         mEditText.requestFocus();
         mController.addRemoteInput(mEntry, mToken);
-        // TODO(b/188646667): restore attachment from entry
+        setAttachment(mEntry.remoteInputAttachment);
 
         mRemoteInputQuickSettingsDisabler.setRemoteInputActive(true);
 
@@ -631,7 +622,6 @@
     private void reset() {
         mResetting = true;
         mEntry.remoteInputTextWhenReset = SpannedString.valueOf(mEditText.getText());
-        // TODO(b/188646667): store attachment at time of reset to entry
 
         mEditText.getText().clear();
         mEditText.setEnabled(true);
@@ -640,7 +630,7 @@
         mController.removeSpinning(mEntry.getKey(), mToken);
         updateSendButton();
         onDefocus(false /* animate */, false /* logClose */);
-        // TODO(b/188646667): clear attachment
+        setAttachment(null);
 
         mResetting = false;
     }
@@ -657,7 +647,7 @@
     }
 
     private void updateSendButton() {
-        mSendButton.setEnabled(mEditText.length() != 0 || mAttachment != null);
+        mSendButton.setEnabled(mEditText.length() != 0 || mEntry.remoteInputAttachment != null);
     }
 
     public void close() {
@@ -857,7 +847,7 @@
                     && event.getAction() == KeyEvent.ACTION_DOWN;
 
             if (isSoftImeEvent || isKeyboardEnterKey) {
-                if (mEditText.length() > 0 || mAttachment != null) {
+                if (mEditText.length() > 0 || mEntry.remoteInputAttachment != null) {
                     sendRemoteInput(prepareRemoteInput());
                 }
                 // Consume action to prevent IME from closing.
@@ -928,7 +918,6 @@
                     // our focus, so we'll need to save our text here.
                     if (mRemoteInputView != null) {
                         mRemoteInputView.mEntry.remoteInputText = getText();
-                        // TODO(b/188646667): store attachment to entry
                     }
                 }
                 return;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java
index e76b803..2a93844 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java
@@ -28,6 +28,8 @@
     boolean isDeviceManaged();
     boolean hasProfileOwner();
     boolean hasWorkProfile();
+    /** Whether the work profile is turned on. */
+    boolean isWorkProfileOn();
     /** Whether this device is organization-owned with a work profile **/
     boolean isProfileOwnerOfOrganizationOwnedDevice();
     String getDeviceOwnerName();
@@ -57,7 +59,6 @@
     /** Label for admin */
     CharSequence getLabel(DeviceAdminInfo info);
 
-
     public interface SecurityControllerCallback {
         void onStateChanged();
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
index 4afb86b..3e661df 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
@@ -211,6 +211,12 @@
     }
 
     @Override
+    public boolean isWorkProfileOn() {
+        final UserHandle userHandle = UserHandle.of(getWorkProfileUserId(mCurrentUserId));
+        return userHandle != null && !mUserManager.isQuietModeEnabled(userHandle);
+    }
+
+    @Override
     public boolean isProfileOwnerOfOrganizationOwnedDevice() {
         return mDevicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile();
     }
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java b/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java
index 65f236b..a262bf1 100644
--- a/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java
+++ b/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java
@@ -25,10 +25,11 @@
 import android.service.quickaccesswallet.GetWalletCardsRequest;
 import android.service.quickaccesswallet.QuickAccessWalletClient;
 import android.service.quickaccesswallet.QuickAccessWalletClientImpl;
+import android.util.Log;
 
 import com.android.systemui.R;
 import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.util.settings.SecureSettings;
 
 import java.util.concurrent.Executor;
@@ -65,7 +66,7 @@
     @Inject
     public QuickAccessWalletController(
             Context context,
-            @Main Executor executor,
+            @Background Executor executor,
             SecureSettings secureSettings,
             QuickAccessWalletClient quickAccessWalletClient) {
         mContext = context;
@@ -142,6 +143,10 @@
      */
     public void queryWalletCards(
             QuickAccessWalletClient.OnWalletCardsRetrievedCallback cardsRetriever) {
+        if (!mQuickAccessWalletClient.isWalletFeatureAvailable()) {
+            Log.d(TAG, "QuickAccessWallet feature is not available.");
+            return;
+        }
         int cardWidth =
                 mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_width);
         int cardHeight =
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index 657553f..fc0214a 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -573,7 +573,7 @@
         // Stop scanning when bouncer becomes visible
         setKeyguardBouncerVisibility(true);
         clearInvocations(mFaceManager);
-        mKeyguardUpdateMonitor.requestFaceAuth();
+        mKeyguardUpdateMonitor.requestFaceAuth(true);
         verify(mFaceManager, never()).authenticate(any(), any(), any(), any(), anyInt());
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
index 8ab32bb..25722e1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
@@ -126,6 +126,8 @@
     private ScreenLifecycle mScreenLifecycle;
     @Mock
     private Vibrator mVibrator;
+    @Mock
+    private UdfpsHapticsSimulator mUdfpsHapticsSimulator;
 
     private FakeExecutor mFgExecutor;
 
@@ -188,6 +190,7 @@
                 mLockscreenShadeTransitionController,
                 mScreenLifecycle,
                 mVibrator,
+                mUdfpsHapticsSimulator,
                 Optional.of(mHbmProvider));
         verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
         mOverlayController = mOverlayCaptor.getValue();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
index 2d19f7d..c9d4190 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
@@ -232,6 +232,7 @@
                 emptyList(), PACKAGE, session.getSessionToken(), null, device, true, null)
         player.bindPlayer(state, PACKAGE)
         assertThat(seamlessText.getText()).isEqualTo(DEVICE_NAME)
+        assertThat(seamless.contentDescription).isEqualTo(DEVICE_NAME)
         assertThat(seamless.isEnabled()).isTrue()
     }
 
@@ -251,13 +252,15 @@
 
     @Test
     fun bindNullDevice() {
+        val fallbackString = context.getResources().getString(
+                com.android.internal.R.string.ext_media_seamless_action)
         player.attachPlayer(holder)
         val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(),
                 emptyList(), PACKAGE, session.getSessionToken(), null, null, true, null)
         player.bindPlayer(state, PACKAGE)
         assertThat(seamless.isEnabled()).isTrue()
-        assertThat(seamlessText.getText()).isEqualTo(context.getResources().getString(
-                com.android.internal.R.string.ext_media_seamless_action))
+        assertThat(seamlessText.getText()).isEqualTo(fallbackString)
+        assertThat(seamless.contentDescription).isEqualTo(fallbackString)
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleBackupFollowUpJobTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleBackupFollowUpJobTest.java
new file mode 100644
index 0000000..00e012e
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleBackupFollowUpJobTest.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2021 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.people;
+
+import static com.android.systemui.people.PeopleBackupFollowUpJob.SHARED_FOLLOW_UP;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.job.JobScheduler;
+import android.app.people.IPeopleManager;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.RemoteException;
+import android.preference.PreferenceManager;
+import android.testing.AndroidTestingRunner;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.people.widget.PeopleTileKey;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.time.Duration;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+@RunWith(AndroidTestingRunner.class)
+@SmallTest
+public class PeopleBackupFollowUpJobTest extends SysuiTestCase {
+    private static final String SHORTCUT_ID_1 = "101";
+    private static final String PACKAGE_NAME_1 = "package_name";
+    private static final int USER_ID_1 = 0;
+
+    private static final PeopleTileKey PEOPLE_TILE_KEY =
+            new PeopleTileKey(SHORTCUT_ID_1, USER_ID_1, PACKAGE_NAME_1);
+
+    private static final String WIDGET_ID_STRING = "3";
+    private static final String SECOND_WIDGET_ID_STRING = "12";
+    private static final Set<String> WIDGET_IDS = new HashSet<>(
+            Arrays.asList(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING));
+
+    private static final Uri URI = Uri.parse("fake_uri");
+
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private PackageInfo mPackageInfo;
+    @Mock
+    private IPeopleManager mIPeopleManager;
+    @Mock
+    private JobScheduler mJobScheduler;
+
+    private final SharedPreferences mSp = PreferenceManager.getDefaultSharedPreferences(mContext);
+    private final SharedPreferences.Editor mEditor = mSp.edit();
+    private final SharedPreferences mFollowUpSp = mContext.getSharedPreferences(
+            SHARED_FOLLOW_UP, Context.MODE_PRIVATE);
+    private final SharedPreferences.Editor mFollowUpEditor = mFollowUpSp.edit();
+    private final SharedPreferences mWidgetIdSp = mContext.getSharedPreferences(
+            WIDGET_ID_STRING, Context.MODE_PRIVATE);
+    private final SharedPreferences mSecondWidgetIdSp = mContext.getSharedPreferences(
+            SECOND_WIDGET_ID_STRING, Context.MODE_PRIVATE);
+
+    private PeopleBackupFollowUpJob mPeopleBackupFollowUpJob;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+
+        when(mPackageManager.getPackageInfoAsUser(any(), anyInt(), anyInt()))
+                .thenReturn(mPackageInfo);
+        when(mIPeopleManager.isConversation(any(), anyInt(), any())).thenReturn(true);
+
+        mPeopleBackupFollowUpJob = new PeopleBackupFollowUpJob();
+        mPeopleBackupFollowUpJob.setManagers(
+                mContext, mPackageManager, mIPeopleManager, mJobScheduler);
+    }
+
+    @After
+    public void tearDown() {
+        mEditor.clear().commit();
+        mFollowUpEditor.clear().commit();
+        mWidgetIdSp.edit().clear().commit();
+        mSecondWidgetIdSp.edit().clear().commit();
+    }
+
+    @Test
+    public void testProcessFollowUpFile_shouldFollowUp() throws RemoteException {
+        when(mIPeopleManager.isConversation(any(), anyInt(), any())).thenReturn(false);
+        mFollowUpEditor.putStringSet(PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+        mFollowUpEditor.apply();
+
+        Map<String, Set<String>> remainingWidgets =
+                mPeopleBackupFollowUpJob.processFollowUpFile(mFollowUpSp, mFollowUpEditor);
+        mEditor.apply();
+        mFollowUpEditor.apply();
+
+        assertThat(remainingWidgets.size()).isEqualTo(1);
+        assertThat(remainingWidgets.get(PEOPLE_TILE_KEY.toString()))
+                .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+        assertThat(mFollowUpSp.getStringSet(PEOPLE_TILE_KEY.toString(), new HashSet<>()))
+                .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+    }
+
+    @Test
+    public void testProcessFollowUpFile_shouldRestore() {
+        mFollowUpEditor.putStringSet(PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+        mFollowUpEditor.apply();
+
+        Map<String, Set<String>> remainingWidgets =
+                mPeopleBackupFollowUpJob.processFollowUpFile(mFollowUpSp, mFollowUpEditor);
+        mEditor.apply();
+        mFollowUpEditor.apply();
+
+        assertThat(remainingWidgets).isEmpty();
+        assertThat(mFollowUpSp.getStringSet(PEOPLE_TILE_KEY.toString(), new HashSet<>())).isEmpty();
+    }
+
+    @Test
+    public void testShouldCancelJob_noRemainingWidgets_shouldCancel() {
+        assertThat(mPeopleBackupFollowUpJob.shouldCancelJob(
+                new HashMap<>(), 10, Duration.ofMinutes(1).toMillis())).isTrue();
+    }
+
+    @Test
+    public void testShouldCancelJob_noRemainingWidgets_longTimeElapsed_shouldCancel() {
+        assertThat(mPeopleBackupFollowUpJob.shouldCancelJob(
+                new HashMap<>(), 10, Duration.ofHours(25).toMillis())).isTrue();
+    }
+
+    @Test
+    public void testShouldCancelJob_remainingWidgets_shortTimeElapsed_shouldNotCancel() {
+        Map<String, Set<String>> remainingWidgets = new HashMap<>();
+        remainingWidgets.put(PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+        assertThat(mPeopleBackupFollowUpJob.shouldCancelJob(remainingWidgets, 10, 1000)).isFalse();
+    }
+
+    @Test
+    public void testShouldCancelJob_remainingWidgets_longTimeElapsed_shouldCancel() {
+        Map<String, Set<String>> remainingWidgets = new HashMap<>();
+        remainingWidgets.put(PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+        assertThat(mPeopleBackupFollowUpJob.shouldCancelJob(
+                remainingWidgets, 10, 1000 * 60 * 60 * 25)).isTrue();
+    }
+
+    @Test
+    public void testCancelJobAndClearRemainingWidgets() {
+        SharedPreferencesHelper.setPeopleTileKey(mWidgetIdSp, PEOPLE_TILE_KEY);
+        SharedPreferencesHelper.setPeopleTileKey(mSecondWidgetIdSp, PEOPLE_TILE_KEY);
+        mEditor.putStringSet(URI.toString(), WIDGET_IDS);
+        mEditor.putString(WIDGET_ID_STRING, URI.toString());
+        mEditor.putString(SECOND_WIDGET_ID_STRING, URI.toString());
+        mEditor.apply();
+        Map<String, Set<String>> remainingWidgets = new HashMap<>();
+        remainingWidgets.put(PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+
+        mPeopleBackupFollowUpJob.cancelJobAndClearRemainingWidgets(
+                remainingWidgets, mFollowUpEditor, mSp);
+        mEditor.apply();
+        mFollowUpEditor.apply();
+
+        verify(mJobScheduler, times(1)).cancel(anyInt());
+        assertThat(mFollowUpSp.getAll()).isEmpty();
+        assertThat(mWidgetIdSp.getAll()).isEmpty();
+        assertThat(mSecondWidgetIdSp.getAll()).isEmpty();
+        assertThat(mSp.getStringSet(PEOPLE_TILE_KEY.toString(), new HashSet<>())).isEmpty();
+        assertThat(mSp.getStringSet(URI.toString(), new HashSet<>())).isEmpty();
+        assertThat(mSp.getString(WIDGET_ID_STRING, null)).isNull();
+        assertThat(mSp.getString(SECOND_WIDGET_ID_STRING, null)).isNull();
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java
index 33c7a57..fba1986 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java
@@ -33,6 +33,7 @@
 import android.app.INotificationManager;
 import android.app.Notification;
 import android.app.Person;
+import android.app.backup.BackupManager;
 import android.app.people.IPeopleManager;
 import android.app.people.PeopleSpaceTile;
 import android.appwidget.AppWidgetManager;
@@ -198,6 +199,8 @@
     private NotificationEntryManager mNotificationEntryManager;
     @Mock
     private PeopleSpaceWidgetManager mPeopleSpaceWidgetManager;
+    @Mock
+    private BackupManager mBackupManager;
 
     private Bundle mOptions;
 
@@ -252,7 +255,7 @@
         PeopleTileKey key = new PeopleTileKey(tile);
         PeopleSpaceTile actual = PeopleSpaceUtils
                 .augmentTileFromNotification(mContext, tile, key, mNotificationEntry1, 0,
-                        Optional.empty());
+                        Optional.empty(), mBackupManager);
 
         assertThat(actual.getNotificationContent().toString()).isEqualTo(NOTIFICATION_TEXT_2);
         assertThat(actual.getNotificationSender()).isEqualTo(null);
@@ -292,7 +295,7 @@
         PeopleTileKey key = new PeopleTileKey(tile);
         PeopleSpaceTile actual = PeopleSpaceUtils
                 .augmentTileFromNotification(mContext, tile, key, notificationEntry, 0,
-                        Optional.empty());
+                        Optional.empty(), mBackupManager);
 
         assertThat(actual.getNotificationContent().toString()).isEqualTo(NOTIFICATION_TEXT_2);
         assertThat(actual.getNotificationSender().toString()).isEqualTo("name");
@@ -325,7 +328,7 @@
         PeopleTileKey key = new PeopleTileKey(tile);
         PeopleSpaceTile actual = PeopleSpaceUtils
                 .augmentTileFromNotification(mContext, tile, key, notificationEntry, 0,
-                        Optional.empty());
+                        Optional.empty(), mBackupManager);
 
         assertThat(actual.getNotificationContent().toString()).isEqualTo(NOTIFICATION_TEXT_1);
         assertThat(actual.getNotificationDataUri()).isEqualTo(URI);
@@ -358,7 +361,7 @@
         PeopleTileKey key = new PeopleTileKey(tile);
         PeopleSpaceTile actual = PeopleSpaceUtils
                 .augmentTileFromNotification(mContext, tile, key, notificationEntry, 0,
-                        Optional.empty());
+                        Optional.empty(), mBackupManager);
 
         assertThat(actual.getNotificationContent().toString()).isEqualTo(NOTIFICATION_TEXT_1);
         assertThat(actual.getNotificationDataUri()).isNull();
@@ -376,7 +379,7 @@
         PeopleTileKey key = new PeopleTileKey(tile);
         PeopleSpaceTile actual = PeopleSpaceUtils
                 .augmentTileFromNotification(mContext, tile, key, mNotificationEntry3, 0,
-                        Optional.empty());
+                        Optional.empty(), mBackupManager);
 
         assertThat(actual.getNotificationContent()).isEqualTo(null);
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/SharedPreferencesHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/SharedPreferencesHelperTest.java
new file mode 100644
index 0000000..7cd5e22
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/SharedPreferencesHelperTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2021 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.people;
+
+import static com.android.systemui.people.PeopleSpaceUtils.INVALID_USER_ID;
+import static com.android.systemui.people.PeopleSpaceUtils.PACKAGE_NAME;
+import static com.android.systemui.people.PeopleSpaceUtils.SHORTCUT_ID;
+import static com.android.systemui.people.PeopleSpaceUtils.USER_ID;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.testing.AndroidTestingRunner;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.people.widget.PeopleTileKey;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidTestingRunner.class)
+@SmallTest
+public class SharedPreferencesHelperTest extends SysuiTestCase {
+    private static final String SHORTCUT_ID_1 = "101";
+    private static final String PACKAGE_NAME_1 = "package_name";
+    private static final int USER_ID_1 = 0;
+
+    private static final PeopleTileKey PEOPLE_TILE_KEY =
+            new PeopleTileKey(SHORTCUT_ID_1, USER_ID_1, PACKAGE_NAME_1);
+
+    private static final int WIDGET_ID = 1;
+
+    private void setStorageForTile(PeopleTileKey peopleTileKey, int widgetId) {
+        SharedPreferences widgetSp = mContext.getSharedPreferences(
+                String.valueOf(widgetId),
+                Context.MODE_PRIVATE);
+        SharedPreferences.Editor widgetEditor = widgetSp.edit();
+        widgetEditor.putString(PeopleSpaceUtils.PACKAGE_NAME, peopleTileKey.getPackageName());
+        widgetEditor.putString(PeopleSpaceUtils.SHORTCUT_ID, peopleTileKey.getShortcutId());
+        widgetEditor.putInt(PeopleSpaceUtils.USER_ID, peopleTileKey.getUserId());
+        widgetEditor.apply();
+    }
+
+    @Test
+    public void testGetPeopleTileKey() {
+        setStorageForTile(PEOPLE_TILE_KEY, WIDGET_ID);
+
+        SharedPreferences sp = mContext.getSharedPreferences(
+                String.valueOf(WIDGET_ID),
+                Context.MODE_PRIVATE);
+        PeopleTileKey actual = SharedPreferencesHelper.getPeopleTileKey(sp);
+
+        assertThat(actual.getPackageName()).isEqualTo(PACKAGE_NAME_1);
+        assertThat(actual.getShortcutId()).isEqualTo(SHORTCUT_ID_1);
+        assertThat(actual.getUserId()).isEqualTo(USER_ID_1);
+    }
+
+    @Test
+    public void testSetPeopleTileKey() {
+        SharedPreferences sp = mContext.getSharedPreferences(
+                String.valueOf(WIDGET_ID),
+                Context.MODE_PRIVATE);
+        SharedPreferencesHelper.setPeopleTileKey(sp, PEOPLE_TILE_KEY);
+
+        assertThat(sp.getString(SHORTCUT_ID, null)).isEqualTo(SHORTCUT_ID_1);
+        assertThat(sp.getString(PACKAGE_NAME, null)).isEqualTo(PACKAGE_NAME_1);
+        assertThat(sp.getInt(USER_ID, INVALID_USER_ID)).isEqualTo(USER_ID_1);
+    }
+
+    @Test
+    public void testClear() {
+        setStorageForTile(PEOPLE_TILE_KEY, WIDGET_ID);
+
+        SharedPreferences sp = mContext.getSharedPreferences(
+                String.valueOf(WIDGET_ID),
+                Context.MODE_PRIVATE);
+        SharedPreferencesHelper.clear(sp);
+
+        assertThat(sp.getString(SHORTCUT_ID, null)).isEqualTo(null);
+        assertThat(sp.getString(PACKAGE_NAME, null)).isEqualTo(null);
+        assertThat(sp.getInt(USER_ID, INVALID_USER_ID)).isEqualTo(INVALID_USER_ID);
+
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleBackupHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleBackupHelperTest.java
new file mode 100644
index 0000000..5d526e1
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleBackupHelperTest.java
@@ -0,0 +1,537 @@
+/*
+ * Copyright (C) 2021 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.people.widget;
+
+import static com.android.systemui.people.PeopleBackupFollowUpJob.SHARED_FOLLOW_UP;
+import static com.android.systemui.people.PeopleSpaceUtils.INVALID_USER_ID;
+import static com.android.systemui.people.widget.PeopleBackupHelper.ADD_USER_ID_TO_URI;
+import static com.android.systemui.people.widget.PeopleBackupHelper.SHARED_BACKUP;
+import static com.android.systemui.people.widget.PeopleBackupHelper.SharedFileEntryType;
+import static com.android.systemui.people.widget.PeopleBackupHelper.getEntryType;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.when;
+
+import android.app.people.IPeopleManager;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.preference.PreferenceManager;
+import android.testing.AndroidTestingRunner;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.people.SharedPreferencesHelper;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.AbstractMap;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+@RunWith(AndroidTestingRunner.class)
+@SmallTest
+public class PeopleBackupHelperTest extends SysuiTestCase {
+    private static final String SHORTCUT_ID_1 = "101";
+    private static final String PACKAGE_NAME_1 = "package_name";
+    private static final int USER_ID_0 = 0;
+    private static final int USER_ID_10 = 10;
+
+    private static final PeopleTileKey PEOPLE_TILE_KEY =
+            new PeopleTileKey(SHORTCUT_ID_1, USER_ID_0, PACKAGE_NAME_1);
+    private static final PeopleTileKey OTHER_PEOPLE_TILE_KEY =
+            new PeopleTileKey(SHORTCUT_ID_1, USER_ID_10, PACKAGE_NAME_1);
+    private static final PeopleTileKey INVALID_USER_ID_PEOPLE_TILE_KEY =
+            new PeopleTileKey(SHORTCUT_ID_1, INVALID_USER_ID, PACKAGE_NAME_1);
+
+    private static final String WIDGET_ID_STRING = "3";
+    private static final String SECOND_WIDGET_ID_STRING = "12";
+    private static final String OTHER_WIDGET_ID_STRING = "7";
+    private static final Set<String> WIDGET_IDS = new HashSet<>(
+            Arrays.asList(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING));
+
+    private static final String URI_STRING = "content://mms";
+    private static final String URI_WITH_USER_ID_0 = "content://0@mms";
+    private static final String URI_WITH_USER_ID_10 = "content://10@mms";
+
+    private final SharedPreferences mBackupSp = mContext.getSharedPreferences(
+            SHARED_BACKUP, Context.MODE_PRIVATE);
+    private final SharedPreferences.Editor mBackupEditor = mBackupSp.edit();
+    private final SharedPreferences mSp = PreferenceManager.getDefaultSharedPreferences(mContext);
+    private final SharedPreferences.Editor mEditor = mSp.edit();
+    private final SharedPreferences mFollowUpSp = mContext.getSharedPreferences(
+            SHARED_FOLLOW_UP, Context.MODE_PRIVATE);
+    private final SharedPreferences.Editor mFollowUpEditor = mFollowUpSp.edit();
+    private final SharedPreferences mWidgetIdSp = mContext.getSharedPreferences(
+            WIDGET_ID_STRING, Context.MODE_PRIVATE);
+    private final SharedPreferences mSecondWidgetIdSp = mContext.getSharedPreferences(
+            SECOND_WIDGET_ID_STRING, Context.MODE_PRIVATE);
+
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private PackageInfo mPackageInfo;
+    @Mock
+    private IPeopleManager mIPeopleManager;
+
+    private PeopleBackupHelper mHelper;
+    private PeopleBackupHelper mOtherHelper;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mHelper = new PeopleBackupHelper(mContext,
+                UserHandle.of(0), new String[]{SHARED_BACKUP}, mPackageManager, mIPeopleManager);
+        mOtherHelper = new PeopleBackupHelper(mContext,
+                UserHandle.of(10), new String[]{SHARED_BACKUP}, mPackageManager, mIPeopleManager);
+
+        when(mPackageManager.getPackageInfoAsUser(any(), anyInt(), anyInt()))
+                .thenReturn(mPackageInfo);
+        when(mIPeopleManager.isConversation(any(), anyInt(), any())).thenReturn(true);
+    }
+
+    @After
+    public void tearDown() {
+        mBackupEditor.clear().commit();
+        mEditor.clear().commit();
+        mFollowUpEditor.clear().commit();
+        mWidgetIdSp.edit().clear().commit();
+        mSecondWidgetIdSp.edit().clear().commit();
+    }
+
+    @Test
+    public void testGetKeyType_widgetId() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(WIDGET_ID_STRING, "contact");
+        assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.WIDGET_ID);
+    }
+
+    @Test
+    public void testGetKeyType_widgetId_twoDigits() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                SECOND_WIDGET_ID_STRING, URI_STRING);
+        assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.WIDGET_ID);
+    }
+
+    @Test
+    public void testGetKeyType_peopleTileKey_valid() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                "shortcut_id/12/com.android.systemui", WIDGET_IDS);
+        assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.PEOPLE_TILE_KEY);
+    }
+
+    @Test
+    public void testGetKeyType_peopleTileKey_validWithSlashes() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                "shortcut_id/with/slashes/12/com.android.systemui2", WIDGET_IDS);
+        assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.PEOPLE_TILE_KEY);
+    }
+
+    @Test
+    public void testGetKeyType_peopleTileKey_negativeNumber() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                "shortcut_id/with/slashes/-1/com.android.systemui2", WIDGET_IDS);
+        assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.PEOPLE_TILE_KEY);
+    }
+
+    @Test
+    public void testGetKeyType_contactUri() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                "shortcut_id/1f/com.android.systemui2", WIDGET_IDS);
+        assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.CONTACT_URI);
+    }
+
+    @Test
+    public void testGetKeyType_contactUri_valid() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                "http://content.fake", WIDGET_IDS);
+        assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.CONTACT_URI);
+    }
+
+    @Test
+    public void testGetKeyType_contactUri_invalidPackageName() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                "shortcut_id/with/slashes/12/2r/com.android.systemui2", WIDGET_IDS);
+        assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.CONTACT_URI);
+    }
+
+    @Test
+    public void testGetKeyType_unknown_unexpectedValueForPeopleTileKey() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                "shortcut_id/12/com.android.systemui", URI_STRING);
+        assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.UNKNOWN);
+    }
+
+    @Test
+    public void testGetKeyType_unknown_unexpectedValueForContactUri() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                URI_STRING, "12");
+        assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.UNKNOWN);
+    }
+
+    @Test
+    public void testGetKeyType_unknown() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                null, WIDGET_IDS);
+        assertThat(getEntryType(entry)).isEqualTo(SharedFileEntryType.UNKNOWN);
+    }
+
+    @Test
+    public void testBackupKey_widgetIdKey_containsWidget_noUserIdInUri() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(WIDGET_ID_STRING, URI_STRING);
+
+        mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+        mBackupEditor.apply();
+
+        assertThat(mBackupSp.getString(WIDGET_ID_STRING, null)).isEqualTo(URI_STRING);
+    }
+
+    @Test
+    public void testBackupKey_widgetIdKey_doesNotContainWidget_noUserIdInUri() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(WIDGET_ID_STRING, URI_STRING);
+
+        mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(OTHER_WIDGET_ID_STRING));
+        mBackupEditor.apply();
+
+        assertThat(mBackupSp.getString(WIDGET_ID_STRING, null)).isNull();
+    }
+
+    @Test
+    public void testBackupKey_widgetIdKey_containsOneWidget_differentUserIdInUri() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(WIDGET_ID_STRING,
+                URI_WITH_USER_ID_10);
+
+        mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+        mBackupEditor.apply();
+
+        assertThat(mBackupSp.getString(WIDGET_ID_STRING, null)).isEqualTo(URI_STRING);
+        assertThat(mBackupSp.getInt(ADD_USER_ID_TO_URI + WIDGET_ID_STRING, INVALID_USER_ID))
+                .isEqualTo(USER_ID_10);
+    }
+
+    @Test
+    public void testBackupKey_widgetIdKey_containsWidget_SameUserIdInUri() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                WIDGET_ID_STRING, URI_WITH_USER_ID_10);
+
+        mOtherHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+        mBackupEditor.apply();
+
+        assertThat(mBackupSp.getString(WIDGET_ID_STRING, null)).isEqualTo(URI_STRING);
+        assertThat(mBackupSp.getInt(ADD_USER_ID_TO_URI + WIDGET_ID_STRING, INVALID_USER_ID))
+                .isEqualTo(USER_ID_10);
+    }
+
+    @Test
+    public void testBackupKey_contactUriKey_ignoresExistingWidgets() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_STRING, WIDGET_IDS);
+
+        mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+        mBackupEditor.apply();
+
+        assertThat(mBackupSp.getStringSet(URI_STRING, new HashSet<>()))
+                .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+    }
+
+    @Test
+    public void testBackupKey_contactUriKey_ignoresExistingWidgets_otherWidget() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_STRING, WIDGET_IDS);
+
+        mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+        mBackupEditor.apply();
+
+        assertThat(mBackupSp.getStringSet(URI_STRING, new HashSet<>()))
+                .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+    }
+
+    @Test
+    public void testBackupKey_contactUriKey_noUserId_otherUser_doesntBackup() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_STRING, WIDGET_IDS);
+
+        mOtherHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+        mBackupEditor.apply();
+
+        assertThat(mBackupSp.getStringSet(URI_STRING, new HashSet<>())).isEmpty();
+    }
+
+    @Test
+    public void testBackupKey_contactUriKey_sameUserId() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_WITH_USER_ID_10, WIDGET_IDS);
+
+        mOtherHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+        mBackupEditor.apply();
+
+        assertThat(mBackupSp.getStringSet(URI_STRING, new HashSet<>()))
+                .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+        assertThat(mBackupSp.getInt(ADD_USER_ID_TO_URI + URI_STRING, INVALID_USER_ID))
+                .isEqualTo(USER_ID_10);
+    }
+
+    @Test
+    public void testBackupKey_contactUriKey_differentUserId_runningAsUser0() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_WITH_USER_ID_10, WIDGET_IDS);
+
+        mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+        mBackupEditor.apply();
+
+        assertThat(mBackupSp.getStringSet(URI_STRING, new HashSet<>())).isEmpty();
+        assertThat(mBackupSp.getInt(ADD_USER_ID_TO_URI + URI_STRING, INVALID_USER_ID))
+                .isEqualTo(INVALID_USER_ID);
+    }
+
+    @Test
+    public void testBackupKey_contactUriKey_differentUserId_runningAsUser10() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_WITH_USER_ID_0, WIDGET_IDS);
+
+        mOtherHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+        mBackupEditor.apply();
+
+        assertThat(mBackupSp.getStringSet(URI_STRING, new HashSet<>())).isEmpty();
+        assertThat(mBackupSp.getInt(ADD_USER_ID_TO_URI + URI_STRING, INVALID_USER_ID))
+                .isEqualTo(INVALID_USER_ID);
+    }
+
+    @Test
+    public void testBackupKey_peopleTileKey_containsWidget() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+
+        mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+        mBackupEditor.apply();
+
+        assertThat(mBackupSp.getStringSet(
+                INVALID_USER_ID_PEOPLE_TILE_KEY.toString(), new HashSet<>()))
+                .containsExactly(WIDGET_ID_STRING);
+    }
+
+    @Test
+    public void testBackupKey_peopleTileKey_containsBothWidgets() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+
+        mHelper.backupKey(entry, mBackupEditor,
+                Arrays.asList(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING));
+        mBackupEditor.apply();
+
+        assertThat(
+                mBackupSp.getStringSet(INVALID_USER_ID_PEOPLE_TILE_KEY.toString(), new HashSet<>()))
+                .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+    }
+
+    @Test
+    public void testBackupKey_peopleTileKey_doesNotContainWidget() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+
+        mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(OTHER_WIDGET_ID_STRING));
+        mBackupEditor.apply();
+
+        assertThat(mBackupSp.getStringSet(
+                INVALID_USER_ID_PEOPLE_TILE_KEY.toString(), new HashSet<>())).isEmpty();
+    }
+
+    @Test
+    public void testBackupKey_peopleTileKey_differentUserId() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                OTHER_PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+
+        mHelper.backupKey(entry, mBackupEditor, Collections.singletonList(WIDGET_ID_STRING));
+        mBackupEditor.apply();
+
+        assertThat(mBackupSp.getStringSet(
+                INVALID_USER_ID_PEOPLE_TILE_KEY.toString(), new HashSet<>())).isEmpty();
+    }
+
+    @Test
+    public void testRestoreKey_widgetIdKey_noUserIdInUri() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(WIDGET_ID_STRING, URI_STRING);
+
+        boolean restored = mHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+        mEditor.apply();
+        mFollowUpEditor.apply();
+
+        assertThat(restored).isTrue();
+        assertThat(mSp.getString(WIDGET_ID_STRING, null)).isEqualTo(URI_STRING);
+        assertThat(mFollowUpSp.getAll()).isEmpty();
+    }
+
+    @Test
+    public void testRestoreKey_widgetIdKey_sameUserInUri() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(WIDGET_ID_STRING, URI_STRING);
+        mBackupEditor.putInt(ADD_USER_ID_TO_URI + WIDGET_ID_STRING, USER_ID_0);
+        mBackupEditor.apply();
+
+        boolean restored = mHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+        mEditor.apply();
+        mFollowUpEditor.apply();
+
+        assertThat(restored).isTrue();
+        assertThat(mSp.getString(WIDGET_ID_STRING, null)).isEqualTo(URI_WITH_USER_ID_0);
+        assertThat(mFollowUpSp.getAll()).isEmpty();
+    }
+
+    @Test
+    public void testRestoreKey_widgetIdKey_differentUserInUri() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(WIDGET_ID_STRING, URI_STRING);
+        mBackupEditor.putInt(ADD_USER_ID_TO_URI + WIDGET_ID_STRING, USER_ID_10);
+        mBackupEditor.apply();
+
+        boolean restored = mHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+        mEditor.apply();
+        mFollowUpEditor.apply();
+
+        assertThat(restored).isTrue();
+        assertThat(mSp.getString(WIDGET_ID_STRING, null)).isEqualTo(URI_WITH_USER_ID_10);
+        assertThat(mFollowUpSp.getAll()).isEmpty();
+    }
+
+    @Test
+    public void testRestoreKey_widgetIdKey_nonSystemUser_differentUser() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(WIDGET_ID_STRING, URI_STRING);
+        mBackupEditor.putInt(ADD_USER_ID_TO_URI + WIDGET_ID_STRING, USER_ID_0);
+        mBackupEditor.apply();
+
+        boolean restored = mOtherHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+        mEditor.apply();
+        mFollowUpEditor.apply();
+
+        assertThat(restored).isTrue();
+        assertThat(mSp.getString(WIDGET_ID_STRING, null)).isEqualTo(URI_WITH_USER_ID_0);
+        assertThat(mFollowUpSp.getAll()).isEmpty();
+    }
+
+    @Test
+    public void testRestoreKey_contactUriKey_noUserIdInUri() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_STRING, WIDGET_IDS);
+
+        boolean restored = mHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+        mEditor.apply();
+        mFollowUpEditor.apply();
+
+        assertThat(restored).isTrue();
+        assertThat(mSp.getStringSet(URI_STRING, new HashSet<>()))
+                .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+        assertThat(mFollowUpSp.getAll()).isEmpty();
+    }
+
+    @Test
+    public void testRestoreKey_contactUriKey_sameUserInUri() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_STRING, WIDGET_IDS);
+        mBackupEditor.putInt(ADD_USER_ID_TO_URI + URI_STRING, USER_ID_0);
+        mBackupEditor.apply();
+
+        boolean restored = mHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+        mEditor.apply();
+        mFollowUpEditor.apply();
+
+        assertThat(restored).isTrue();
+        assertThat(mSp.getStringSet(URI_WITH_USER_ID_0, new HashSet<>()))
+                .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+        assertThat(mSp.getStringSet(URI_STRING, new HashSet<>())).isEmpty();
+        assertThat(mFollowUpSp.getAll()).isEmpty();
+    }
+
+    @Test
+    public void testRestoreKey_contactUriKey_differentUserInUri() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_STRING, WIDGET_IDS);
+        mBackupEditor.putInt(ADD_USER_ID_TO_URI + URI_STRING, USER_ID_10);
+        mBackupEditor.apply();
+
+        boolean restored = mHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+        mEditor.apply();
+        mFollowUpEditor.apply();
+
+        assertThat(restored).isTrue();
+        assertThat(mSp.getStringSet(URI_WITH_USER_ID_10, new HashSet<>()))
+                .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+        assertThat(mSp.getStringSet(URI_STRING, new HashSet<>())).isEmpty();
+        assertThat(mFollowUpSp.getAll()).isEmpty();
+    }
+
+    @Test
+    public void testRestoreKey_contactUriKey_nonSystemUser_differentUser() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(URI_STRING, WIDGET_IDS);
+        mBackupEditor.putInt(ADD_USER_ID_TO_URI + URI_STRING, USER_ID_0);
+        mBackupEditor.apply();
+
+        boolean restored = mOtherHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+        mEditor.apply();
+        mFollowUpEditor.apply();
+
+        assertThat(restored).isTrue();
+        assertThat(mSp.getStringSet(URI_WITH_USER_ID_0, new HashSet<>()))
+                .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+        assertThat(mSp.getStringSet(URI_STRING, new HashSet<>())).isEmpty();
+        assertThat(mFollowUpSp.getAll()).isEmpty();
+    }
+
+    @Test
+    public void testRestoreKey_peopleTileKey_shouldNotFollowUp() {
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                INVALID_USER_ID_PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+
+        boolean restored = mHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+        mEditor.apply();
+        mFollowUpEditor.apply();
+
+        assertThat(restored).isTrue();
+        assertThat(mSp.getStringSet(PEOPLE_TILE_KEY.toString(), new HashSet<>()))
+                .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+        assertThat(SharedPreferencesHelper.getPeopleTileKey(mWidgetIdSp))
+                .isEqualTo(PEOPLE_TILE_KEY);
+        assertThat(SharedPreferencesHelper.getPeopleTileKey(mSecondWidgetIdSp))
+                .isEqualTo(PEOPLE_TILE_KEY);
+        assertThat(mFollowUpSp.getAll()).isEmpty();
+    }
+
+    @Test
+    public void testRestoreKey_peopleTileKey_shortcutNotYetRestored_shouldFollowUpBoth()
+            throws RemoteException {
+        when(mIPeopleManager.isConversation(any(), anyInt(), any())).thenReturn(false);
+
+        Map.Entry<String, ?> entry = new AbstractMap.SimpleEntry<>(
+                INVALID_USER_ID_PEOPLE_TILE_KEY.toString(), WIDGET_IDS);
+
+        boolean restored = mHelper.restoreKey(entry, mEditor, mFollowUpEditor, mBackupSp);
+        mEditor.apply();
+        mFollowUpEditor.apply();
+
+        assertThat(restored).isFalse();
+        assertThat(mSp.getStringSet(PEOPLE_TILE_KEY.toString(), new HashSet<>()))
+                .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+        assertThat(SharedPreferencesHelper.getPeopleTileKey(mWidgetIdSp))
+                .isEqualTo(PEOPLE_TILE_KEY);
+        assertThat(SharedPreferencesHelper.getPeopleTileKey(mSecondWidgetIdSp))
+                .isEqualTo(PEOPLE_TILE_KEY);
+
+        assertThat(mFollowUpSp.getStringSet(PEOPLE_TILE_KEY.toString(), new HashSet<>()))
+                .containsExactly(WIDGET_ID_STRING, SECOND_WIDGET_ID_STRING);
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
index c48f26b..ddad758 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
@@ -73,6 +73,7 @@
 import android.app.NotificationChannel;
 import android.app.NotificationManager;
 import android.app.Person;
+import android.app.backup.BackupManager;
 import android.app.people.ConversationChannel;
 import android.app.people.ConversationStatus;
 import android.app.people.IPeopleManager;
@@ -102,7 +103,9 @@
 
 import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.people.PeopleBackupFollowUpJob;
 import com.android.systemui.people.PeopleSpaceUtils;
+import com.android.systemui.people.SharedPreferencesHelper;
 import com.android.systemui.statusbar.NotificationListener;
 import com.android.systemui.statusbar.NotificationListener.NotificationHandler;
 import com.android.systemui.statusbar.SbnBuilder;
@@ -151,6 +154,11 @@
     private static final int WIDGET_ID_WITH_KEY_IN_OPTIONS = 4;
     private static final int WIDGET_ID_WITH_SAME_URI = 5;
     private static final int WIDGET_ID_WITH_DIFFERENT_URI = 6;
+    private static final int WIDGET_ID_8 = 8;
+    private static final int WIDGET_ID_9 = 9;
+    private static final int WIDGET_ID_11 = 11;
+    private static final int WIDGET_ID_14 = 14;
+    private static final int WIDGET_ID_15 = 15;
     private static final String SHORTCUT_ID = "101";
     private static final String OTHER_SHORTCUT_ID = "102";
     private static final String NOTIFICATION_KEY = "0|com.android.systemui.tests|0|null|0";
@@ -195,6 +203,14 @@
             | SUPPRESSED_EFFECT_NOTIFICATION_LIST;
     private static final long SBN_POST_TIME = 567L;
 
+    private static final Map<String, String> WIDGETS_MAPPING = Map.of(
+            String.valueOf(WIDGET_ID_8), String.valueOf(WIDGET_ID_WITH_SHORTCUT),
+            String.valueOf(WIDGET_ID_9), String.valueOf(WIDGET_ID_WITHOUT_SHORTCUT),
+            String.valueOf(WIDGET_ID_11), String.valueOf(WIDGET_ID_WITH_KEY_IN_OPTIONS),
+            String.valueOf(WIDGET_ID_14), String.valueOf(WIDGET_ID_WITH_SAME_URI),
+            String.valueOf(WIDGET_ID_15), String.valueOf(WIDGET_ID_WITH_DIFFERENT_URI)
+    );
+
     private ShortcutInfo mShortcutInfo;
     private NotificationEntry mNotificationEntry;
 
@@ -228,6 +244,8 @@
     private NotificationManager.Policy mNotificationPolicy;
     @Mock
     private Bubbles mBubbles;
+    @Mock
+    private BackupManager mBackupManager;
 
     @Captor
     private ArgumentCaptor<NotificationHandler> mListenerCaptor;
@@ -246,8 +264,8 @@
         mDependency.injectTestDependency(NotificationEntryManager.class, mNotificationEntryManager);
         mManager = new PeopleSpaceWidgetManager(mContext, mAppWidgetManager, mIPeopleManager,
                 mPeopleManager, mLauncherApps, mNotificationEntryManager, mPackageManager,
-                Optional.of(mBubbles), mUserManager, mINotificationManager, mNotificationManager,
-                mFakeExecutor);
+                Optional.of(mBubbles), mUserManager, mBackupManager, mINotificationManager,
+                mNotificationManager, mFakeExecutor);
         mManager.attach(mListenerService);
 
         verify(mListenerService).addNotificationHandler(mListenerCaptor.capture());
@@ -1410,6 +1428,89 @@
         assertThat(tile.getNotificationPolicyState()).isEqualTo(expected | SHOW_CONVERSATIONS);
     }
 
+    @Test
+    public void testRemapWidgetFiles() {
+        setStorageForTile(SHORTCUT_ID, TEST_PACKAGE_A, WIDGET_ID_8, URI);
+        setStorageForTile(OTHER_SHORTCUT_ID, TEST_PACKAGE_B, WIDGET_ID_11, URI);
+
+        mManager.remapWidgetFiles(WIDGETS_MAPPING);
+
+        SharedPreferences sp1 = mContext.getSharedPreferences(
+                String.valueOf(WIDGET_ID_WITH_SHORTCUT), Context.MODE_PRIVATE);
+        PeopleTileKey key1 = SharedPreferencesHelper.getPeopleTileKey(sp1);
+        assertThat(key1.getShortcutId()).isEqualTo(SHORTCUT_ID);
+        assertThat(key1.getPackageName()).isEqualTo(TEST_PACKAGE_A);
+
+        SharedPreferences sp4 = mContext.getSharedPreferences(
+                String.valueOf(WIDGET_ID_WITH_KEY_IN_OPTIONS), Context.MODE_PRIVATE);
+        PeopleTileKey key4 = SharedPreferencesHelper.getPeopleTileKey(sp4);
+        assertThat(key4.getShortcutId()).isEqualTo(OTHER_SHORTCUT_ID);
+        assertThat(key4.getPackageName()).isEqualTo(TEST_PACKAGE_B);
+
+        SharedPreferences sp8 = mContext.getSharedPreferences(
+                String.valueOf(WIDGET_ID_8), Context.MODE_PRIVATE);
+        PeopleTileKey key8 = SharedPreferencesHelper.getPeopleTileKey(sp8);
+        assertThat(key8.getShortcutId()).isNull();
+        assertThat(key8.getPackageName()).isNull();
+
+        SharedPreferences sp11 = mContext.getSharedPreferences(
+                String.valueOf(WIDGET_ID_11), Context.MODE_PRIVATE);
+        PeopleTileKey key11 = SharedPreferencesHelper.getPeopleTileKey(sp11);
+        assertThat(key11.getShortcutId()).isNull();
+        assertThat(key11.getPackageName()).isNull();
+    }
+
+    @Test
+    public void testRemapSharedFile() {
+        setStorageForTile(SHORTCUT_ID, TEST_PACKAGE_A, WIDGET_ID_8, URI);
+        setStorageForTile(OTHER_SHORTCUT_ID, TEST_PACKAGE_B, WIDGET_ID_11, URI);
+
+        mManager.remapSharedFile(WIDGETS_MAPPING);
+
+        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
+
+        assertThat(sp.getString(String.valueOf(WIDGET_ID_8), null)).isNull();
+        assertThat(sp.getString(String.valueOf(WIDGET_ID_11), null)).isNull();
+        assertThat(sp.getString(String.valueOf(WIDGET_ID_WITH_SHORTCUT), null))
+                .isEqualTo(URI.toString());
+        assertThat(sp.getString(String.valueOf(WIDGET_ID_WITH_KEY_IN_OPTIONS), null))
+                .isEqualTo(URI.toString());
+
+        assertThat(sp.getStringSet(URI.toString(), new HashSet<>())).containsExactly(
+                String.valueOf(WIDGET_ID_WITH_SHORTCUT),
+                String.valueOf(WIDGET_ID_WITH_KEY_IN_OPTIONS));
+
+        PeopleTileKey key8 = new PeopleTileKey(SHORTCUT_ID, 0, TEST_PACKAGE_A);
+        assertThat(sp.getStringSet(key8.toString(), new HashSet<>())).containsExactly(
+                String.valueOf(WIDGET_ID_WITH_SHORTCUT));
+
+        PeopleTileKey key11 = new PeopleTileKey(OTHER_SHORTCUT_ID, 0, TEST_PACKAGE_B);
+        assertThat(sp.getStringSet(key11.toString(), new HashSet<>())).containsExactly(
+                String.valueOf(WIDGET_ID_WITH_KEY_IN_OPTIONS));
+    }
+
+    @Test
+    public void testRemapFollowupFile() {
+        PeopleTileKey key8 = new PeopleTileKey(SHORTCUT_ID, 0, TEST_PACKAGE_A);
+        PeopleTileKey key11 = new PeopleTileKey(OTHER_SHORTCUT_ID, 0, TEST_PACKAGE_B);
+        Set<String> set8 = new HashSet<>(Collections.singleton(String.valueOf(WIDGET_ID_8)));
+        Set<String> set11 = new HashSet<>(Collections.singleton(String.valueOf(WIDGET_ID_11)));
+
+        SharedPreferences followUp = mContext.getSharedPreferences(
+                PeopleBackupFollowUpJob.SHARED_FOLLOW_UP, Context.MODE_PRIVATE);
+        SharedPreferences.Editor followUpEditor = followUp.edit();
+        followUpEditor.putStringSet(key8.toString(), set8);
+        followUpEditor.putStringSet(key11.toString(), set11);
+        followUpEditor.apply();
+
+        mManager.remapFollowupFile(WIDGETS_MAPPING);
+
+        assertThat(followUp.getStringSet(key8.toString(), new HashSet<>())).containsExactly(
+                String.valueOf(WIDGET_ID_WITH_SHORTCUT));
+        assertThat(followUp.getStringSet(key11.toString(), new HashSet<>())).containsExactly(
+                String.valueOf(WIDGET_ID_WITH_KEY_IN_OPTIONS));
+    }
+
     private void setFinalField(String fieldName, int value) {
         try {
             Field field = NotificationManager.Policy.class.getDeclaredField(fieldName);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
index 1f066d8..65e5f97 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
@@ -127,7 +127,7 @@
         when(mQSPanel.getDumpableTag()).thenReturn("QSPanel");
         when(mQSPanel.openPanelEvent()).thenReturn(QSEvent.QS_PANEL_EXPANDED);
         when(mQSPanel.closePanelEvent()).thenReturn(QSEvent.QS_PANEL_COLLAPSED);
-        when(mQSPanel.createRegularTileLayout()).thenReturn(mPagedTileLayout);
+        when(mQSPanel.getOrCreateTileLayout()).thenReturn(mPagedTileLayout);
         when(mQSPanel.getTileLayout()).thenReturn(mPagedTileLayout);
         when(mQSTile.getTileSpec()).thenReturn("dnd");
         when(mQSTileHost.getTiles()).thenReturn(Collections.singleton(mQSTile));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java
index 53eae8c..bf6c981 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java
@@ -107,7 +107,7 @@
 
         when(mQSPanel.isAttachedToWindow()).thenReturn(true);
         when(mQSPanel.getDumpableTag()).thenReturn("QSPanel");
-        when(mQSPanel.createRegularTileLayout()).thenReturn(mPagedTileLayout);
+        when(mQSPanel.getOrCreateTileLayout()).thenReturn(mPagedTileLayout);
         when(mQSPanel.getTileLayout()).thenReturn(mPagedTileLayout);
         when(mQSTileHost.getTiles()).thenReturn(Collections.singleton(mQSTile));
         when(mQSTileHost.createTileView(any(), eq(mQSTile), anyBoolean())).thenReturn(mQSTileView);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
index 7caf0dd..770cf2c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
@@ -204,6 +204,8 @@
     public void testTappableView_profileOwnerOfOrgOwnedDevice_networkLoggingEnabled() {
         when(mSecurityController.isProfileOwnerOfOrganizationOwnedDevice()).thenReturn(true);
         when(mSecurityController.isNetworkLoggingEnabled()).thenReturn(true);
+        when(mSecurityController.isWorkProfileOn()).thenReturn(true);
+        when(mSecurityController.hasWorkProfile()).thenReturn(true);
 
         mFooter.refreshState();
 
@@ -213,6 +215,19 @@
     }
 
     @Test
+    public void testUntappableView_profileOwnerOfOrgOwnedDevice_workProfileOff() {
+        when(mSecurityController.isProfileOwnerOfOrganizationOwnedDevice()).thenReturn(true);
+        when(mSecurityController.isNetworkLoggingEnabled()).thenReturn(true);
+        when(mSecurityController.isWorkProfileOn()).thenReturn(false);
+
+        mFooter.refreshState();
+
+        TestableLooper.get(this).processAllMessages();
+        assertFalse(mRootView.isClickable());
+        assertEquals(View.GONE, mRootView.findViewById(R.id.footer_icon).getVisibility());
+    }
+
+    @Test
     public void testNetworkLoggingEnabled_deviceOwner() {
         when(mSecurityController.isDeviceManaged()).thenReturn(true);
         when(mSecurityController.isNetworkLoggingEnabled()).thenReturn(true);
@@ -237,9 +252,10 @@
     }
 
     @Test
-    public void testNetworkLoggingEnabled_managedProfileOwner() {
+    public void testNetworkLoggingEnabled_managedProfileOwner_workProfileOn() {
         when(mSecurityController.hasWorkProfile()).thenReturn(true);
         when(mSecurityController.isNetworkLoggingEnabled()).thenReturn(true);
+        when(mSecurityController.isWorkProfileOn()).thenReturn(true);
         mFooter.refreshState();
 
         TestableLooper.get(this).processAllMessages();
@@ -249,6 +265,17 @@
     }
 
     @Test
+    public void testNetworkLoggingEnabled_managedProfileOwner_workProfileOff() {
+        when(mSecurityController.hasWorkProfile()).thenReturn(true);
+        when(mSecurityController.isNetworkLoggingEnabled()).thenReturn(true);
+        when(mSecurityController.isWorkProfileOn()).thenReturn(false);
+        mFooter.refreshState();
+
+        TestableLooper.get(this).processAllMessages();
+        assertEquals("", mFooterText.getText());
+    }
+
+    @Test
     public void testManagedCACertsInstalled() {
         when(mSecurityController.isDeviceManaged()).thenReturn(true);
         when(mSecurityController.hasCACertInCurrentUser()).thenReturn(true);
@@ -326,9 +353,10 @@
     }
 
     @Test
-    public void testWorkProfileCACertsInstalled() {
+    public void testWorkProfileCACertsInstalled_workProfileOn() {
         when(mSecurityController.isDeviceManaged()).thenReturn(false);
         when(mSecurityController.hasCACertInWorkProfile()).thenReturn(true);
+        when(mSecurityController.isWorkProfileOn()).thenReturn(true);
         mFooter.refreshState();
 
         TestableLooper.get(this).processAllMessages();
@@ -350,6 +378,17 @@
     }
 
     @Test
+    public void testWorkProfileCACertsInstalled_workProfileOff() {
+        when(mSecurityController.isDeviceManaged()).thenReturn(false);
+        when(mSecurityController.hasCACertInWorkProfile()).thenReturn(true);
+        when(mSecurityController.isWorkProfileOn()).thenReturn(false);
+        mFooter.refreshState();
+
+        TestableLooper.get(this).processAllMessages();
+        assertEquals("", mFooterText.getText());
+    }
+
+    @Test
     public void testCACertsInstalled() {
         when(mSecurityController.isDeviceManaged()).thenReturn(false);
         when(mSecurityController.hasCACertInCurrentUser()).thenReturn(true);
@@ -375,9 +414,10 @@
     }
 
     @Test
-    public void testWorkProfileVpnEnabled() {
+    public void testWorkProfileVpnEnabled_workProfileOn() {
         when(mSecurityController.isVpnEnabled()).thenReturn(true);
         when(mSecurityController.getWorkProfileVpnName()).thenReturn(VPN_PACKAGE_2);
+        when(mSecurityController.isWorkProfileOn()).thenReturn(true);
         mFooter.refreshState();
 
         TestableLooper.get(this).processAllMessages();
@@ -389,6 +429,17 @@
     }
 
     @Test
+    public void testWorkProfileVpnEnabled_workProfileOff() {
+        when(mSecurityController.isVpnEnabled()).thenReturn(true);
+        when(mSecurityController.getWorkProfileVpnName()).thenReturn(VPN_PACKAGE_2);
+        when(mSecurityController.isWorkProfileOn()).thenReturn(false);
+        mFooter.refreshState();
+
+        TestableLooper.get(this).processAllMessages();
+        assertEquals("", mFooterText.getText());
+    }
+
+    @Test
     public void testProfileOwnerOfOrganizationOwnedDeviceNoName() {
         when(mSecurityController.isProfileOwnerOfOrganizationOwnedDevice()).thenReturn(true);
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
index a50cbe5..b1e67f5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
@@ -175,6 +175,15 @@
     }
 
     @Test
+    public void testWalletFeatureUnavailable_recreateWalletClient() {
+        when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(false);
+
+        mTile.handleSetListening(true);
+
+        verify(mController, times(1)).reCreateWalletClient();
+    }
+
+    @Test
     public void testIsAvailable_qawFeatureAvailable() {
         when(mPackageManager.hasSystemFeature(FEATURE_NFC_HOST_CARD_EMULATION)).thenReturn(true);
         when(mPackageManager.hasSystemFeature("org.chromium.arc")).thenReturn(false);
@@ -267,6 +276,41 @@
     }
 
     @Test
+    public void testHandleUpdateState_walletIsUpdating() {
+        when(mKeyguardStateController.isUnlocked()).thenReturn(true);
+        QSTile.State state = new QSTile.State();
+        GetWalletCardsResponse response =
+                new GetWalletCardsResponse(
+                        Collections.singletonList(createWalletCard(mContext)), 0);
+
+        mTile.handleSetListening(true);
+
+        verify(mController).queryWalletCards(mCallbackCaptor.capture());
+
+        // Wallet cards fetching on its way; wallet updating.
+        mTile.handleUpdateState(state, null);
+
+        assertEquals(Tile.STATE_INACTIVE, state.state);
+        assertEquals(
+                mContext.getString(R.string.wallet_secondary_label_updating), state.secondaryLabel);
+        assertNotNull(state.stateDescription);
+        assertNull(state.sideViewCustomDrawable);
+
+        // Wallet cards fetching completed.
+        mCallbackCaptor.getValue().onWalletCardsRetrieved(response);
+        mTestableLooper.processAllMessages();
+
+        mTile.handleUpdateState(state, null);
+
+        assertEquals(Tile.STATE_ACTIVE, state.state);
+        assertEquals(
+                "•••• 1234",
+                state.secondaryLabel);
+        assertNotNull(state.stateDescription);
+        assertNotNull(state.sideViewCustomDrawable);
+    }
+
+    @Test
     public void testHandleUpdateState_hasCard_deviceLocked_tileInactive() {
         when(mKeyguardStateController.isUnlocked()).thenReturn(false);
         QSTile.State state = new QSTile.State();
@@ -315,7 +359,7 @@
     }
 
     @Test
-    public void testHandleUpdateState_qawFeatureUnavailable_tileUnavailable() {
+    public void testHandleUpdateState_qawServiceUnavailable_tileUnavailable() {
         when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false);
         QSTile.State state = new QSTile.State();
 
@@ -327,6 +371,18 @@
     }
 
     @Test
+    public void testHandleUpdateState_qawFeatureUnavailable_tileUnavailable() {
+        when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(false);
+        QSTile.State state = new QSTile.State();
+
+        mTile.handleUpdateState(state, null);
+
+        assertEquals(Tile.STATE_UNAVAILABLE, state.state);
+        assertNull(state.stateDescription);
+        assertNull(state.sideViewCustomDrawable);
+    }
+
+    @Test
     public void testHandleSetListening_queryCards() {
         mTile.handleSetListening(true);
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
index 35c92b6..8e949e7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
@@ -161,7 +161,7 @@
         String mimeType  = "image/jpeg";
         String text = "image inserted";
         StatusBarNotification newSbn =
-                mRemoteInputManager.rebuildNotificationWithRemoteInput(
+                mRemoteInputManager.rebuildNotificationWithRemoteInputInserted(
                         mEntry, text, false, mimeType, uri);
         RemoteInputHistoryItem[] messages = (RemoteInputHistoryItem[]) newSbn.getNotification()
                 .extras.getParcelableArray(Notification.EXTRA_REMOTE_INPUT_HISTORY_ITEMS);
@@ -174,7 +174,7 @@
     @Test
     public void testRebuildWithRemoteInput_noExistingInputNoSpinner() {
         StatusBarNotification newSbn =
-                mRemoteInputManager.rebuildNotificationWithRemoteInput(
+                mRemoteInputManager.rebuildNotificationWithRemoteInputInserted(
                         mEntry, "A Reply", false, null, null);
         RemoteInputHistoryItem[] messages = (RemoteInputHistoryItem[]) newSbn.getNotification()
                 .extras.getParcelableArray(Notification.EXTRA_REMOTE_INPUT_HISTORY_ITEMS);
@@ -189,7 +189,7 @@
     @Test
     public void testRebuildWithRemoteInput_noExistingInputWithSpinner() {
         StatusBarNotification newSbn =
-                mRemoteInputManager.rebuildNotificationWithRemoteInput(
+                mRemoteInputManager.rebuildNotificationWithRemoteInputInserted(
                         mEntry, "A Reply", true, null, null);
         RemoteInputHistoryItem[] messages = (RemoteInputHistoryItem[]) newSbn.getNotification()
                 .extras.getParcelableArray(Notification.EXTRA_REMOTE_INPUT_HISTORY_ITEMS);
@@ -205,14 +205,14 @@
     public void testRebuildWithRemoteInput_withExistingInput() {
         // Setup a notification entry with 1 remote input.
         StatusBarNotification newSbn =
-                mRemoteInputManager.rebuildNotificationWithRemoteInput(
+                mRemoteInputManager.rebuildNotificationWithRemoteInputInserted(
                         mEntry, "A Reply", false, null, null);
         NotificationEntry entry = new NotificationEntryBuilder()
                 .setSbn(newSbn)
                 .build();
 
         // Try rebuilding to add another reply.
-        newSbn = mRemoteInputManager.rebuildNotificationWithRemoteInput(
+        newSbn = mRemoteInputManager.rebuildNotificationWithRemoteInputInserted(
                 entry, "Reply 2", true, null, null);
         RemoteInputHistoryItem[] messages = (RemoteInputHistoryItem[]) newSbn.getNotification()
                 .extras.getParcelableArray(Notification.EXTRA_REMOTE_INPUT_HISTORY_ITEMS);
@@ -228,14 +228,14 @@
         String mimeType  = "image/jpeg";
         String text = "image inserted";
         StatusBarNotification newSbn =
-                mRemoteInputManager.rebuildNotificationWithRemoteInput(
+                mRemoteInputManager.rebuildNotificationWithRemoteInputInserted(
                         mEntry, text, false, mimeType, uri);
         NotificationEntry entry = new NotificationEntryBuilder()
                 .setSbn(newSbn)
                 .build();
 
         // Try rebuilding to add another reply.
-        newSbn = mRemoteInputManager.rebuildNotificationWithRemoteInput(
+        newSbn = mRemoteInputManager.rebuildNotificationWithRemoteInputInserted(
                 entry, "Reply 2", true, null, null);
         RemoteInputHistoryItem[] messages = (RemoteInputHistoryItem[]) newSbn.getNotification()
                 .extras.getParcelableArray(Notification.EXTRA_REMOTE_INPUT_HISTORY_ITEMS);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt
index 94c9de0..c81d468 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt
@@ -43,6 +43,7 @@
 import com.android.systemui.util.mockito.any
 import com.android.systemui.util.time.FakeSystemClock
 import com.google.common.truth.Truth.assertThat
+import org.junit.After
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -117,6 +118,11 @@
                 .thenReturn(PROC_STATE_INVISIBLE)
     }
 
+    @After
+    fun tearDown() {
+        controller.tearDownChipView()
+    }
+
     @Test
     fun onEntryUpdated_isOngoingCallNotif_listenerNotified() {
         notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry())
diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeSecurityController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeSecurityController.java
index 3640bcd..d5348dc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeSecurityController.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeSecurityController.java
@@ -44,6 +44,11 @@
     }
 
     @Override
+    public boolean isWorkProfileOn() {
+        return false;
+    }
+
+    @Override
     public boolean isProfileOwnerOfOrganizationOwnedDevice() {
         return false;
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java
index 23abce0..ce0098e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java
@@ -21,7 +21,9 @@
 import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -61,12 +63,10 @@
     private ArgumentCaptor<GetWalletCardsRequest> mRequestCaptor;
 
     private QuickAccessWalletController mController;
-    private TestableLooper mTestableLooper;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mTestableLooper = TestableLooper.get(this);
         when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true);
         when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(true);
         when(mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked()).thenReturn(true);
@@ -143,4 +143,13 @@
                 mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_height),
                 request.getCardHeightPx());
     }
+
+    @Test
+    public void queryWalletCards_walletFeatureNotAvailable_noQuery() {
+        when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(false);
+
+        mController.queryWalletCards(mCardsRetriever);
+
+        verify(mQuickAccessWalletClient, never()).getWalletCards(any(), any(), any());
+    }
 }
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index 906edb3..9ff1b10 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -455,7 +455,7 @@
 
             }, FgThread.getExecutor()).whenComplete(uncheckExceptions((association, err) -> {
                 if (err == null) {
-                    addAssociation(association);
+                    addAssociation(association, userId);
                 } else {
                     Slog.e(LOG_TAG, "Failed to discover device(s)", err);
                     callback.onFailure("No devices found: " + err.getMessage());
@@ -646,7 +646,7 @@
                 } else {
                     return association;
                 }
-            }));
+            }), userId);
 
             restartBleScan();
         }
@@ -664,7 +664,8 @@
                     android.Manifest.permission.ASSOCIATE_COMPANION_DEVICES, "createAssociation");
 
             addAssociation(new Association(
-                    userId, macAddress, packageName, null, false, System.currentTimeMillis()));
+                    userId, macAddress, packageName, null, false,
+                    System.currentTimeMillis()), userId);
         }
 
         private void checkCanCallNotificationApi(String callingPackage) throws RemoteException {
@@ -738,9 +739,9 @@
         return Binder.getCallingUid() == Process.SYSTEM_UID;
     }
 
-    void addAssociation(Association association) {
+    void addAssociation(Association association, int userId) {
         updateSpecialAccessPermissionForAssociatedPackage(association);
-        recordAssociation(association);
+        recordAssociation(association, userId);
     }
 
     void removeAssociation(int userId, String pkg, String deviceMacAddress) {
@@ -752,7 +753,7 @@
                 onAssociationPreRemove(association);
             }
             return notMatch;
-        }));
+        }), userId);
         restartBleScan();
     }
 
@@ -944,13 +945,9 @@
         }, getContext(), packageName, userId).recycleOnUse());
     }
 
-    private void recordAssociation(Association association) {
+    private void recordAssociation(Association association, int userId) {
         Slog.i(LOG_TAG, "recordAssociation(" + association + ")");
-        updateAssociations(associations -> CollectionUtils.add(associations, association));
-    }
-
-    private void updateAssociations(Function<Set<Association>, Set<Association>> update) {
-        updateAssociations(update, getCallingUserId());
+        updateAssociations(associations -> CollectionUtils.add(associations, association), userId);
     }
 
     private void updateAssociations(Function<Set<Association>, Set<Association>> update,
@@ -1515,7 +1512,7 @@
                         String pkg = getNextArgRequired();
                         String address = getNextArgRequired();
                         addAssociation(new Association(userId, address, pkg, null, false,
-                                System.currentTimeMillis()));
+                                System.currentTimeMillis()), userId);
                     }
                     break;
 
diff --git a/services/core/java/com/android/server/SensorPrivacyService.java b/services/core/java/com/android/server/SensorPrivacyService.java
index e753226..c07d669 100644
--- a/services/core/java/com/android/server/SensorPrivacyService.java
+++ b/services/core/java/com/android/server/SensorPrivacyService.java
@@ -28,7 +28,6 @@
 import static android.app.AppOpsManager.OP_PHONE_CALL_CAMERA;
 import static android.app.AppOpsManager.OP_PHONE_CALL_MICROPHONE;
 import static android.app.AppOpsManager.OP_RECORD_AUDIO;
-import static android.app.AppOpsManager.OP_RECORD_AUDIO_HOTWORD;
 import static android.content.Intent.EXTRA_PACKAGE_NAME;
 import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
@@ -47,6 +46,7 @@
 import android.app.ActivityOptions;
 import android.app.ActivityTaskManager;
 import android.app.AppOpsManager;
+import android.app.AppOpsManagerInternal;
 import android.app.KeyguardManager;
 import android.app.Notification;
 import android.app.NotificationChannel;
@@ -163,6 +163,7 @@
     private final ActivityManagerInternal mActivityManagerInternal;
     private final ActivityTaskManager mActivityTaskManager;
     private final AppOpsManager mAppOpsManager;
+    private final AppOpsManagerInternal mAppOpsManagerInternal;
     private final TelephonyManager mTelephonyManager;
 
     private final IBinder mAppOpsRestrictionToken = new Binder();
@@ -172,16 +173,18 @@
     private EmergencyCallHelper mEmergencyCallHelper;
     private KeyguardManager mKeyguardManager;
 
+    private int mCurrentUser = -1;
+
     public SensorPrivacyService(Context context) {
         super(context);
         mContext = context;
         mAppOpsManager = context.getSystemService(AppOpsManager.class);
+        mAppOpsManagerInternal = getLocalService(AppOpsManagerInternal.class);
         mUserManagerInternal = getLocalService(UserManagerInternal.class);
         mActivityManager = context.getSystemService(ActivityManager.class);
         mActivityManagerInternal = getLocalService(ActivityManagerInternal.class);
         mActivityTaskManager = context.getSystemService(ActivityTaskManager.class);
         mTelephonyManager = context.getSystemService(TelephonyManager.class);
-
         mSensorPrivacyServiceImpl = new SensorPrivacyServiceImpl();
     }
 
@@ -201,6 +204,20 @@
         }
     }
 
+    @Override
+    public void onUserStarting(TargetUser user) {
+        if (mCurrentUser == -1) {
+            mCurrentUser = user.getUserIdentifier();
+            setGlobalRestriction();
+        }
+    }
+
+    @Override
+    public void onUserSwitching(TargetUser from, TargetUser to) {
+        mCurrentUser = to.getUserIdentifier();
+        setGlobalRestriction();
+    }
+
     class SensorPrivacyServiceImpl extends ISensorPrivacyManager.Stub implements
             AppOpsManager.OnOpNotedListener, AppOpsManager.OnOpStartedListener,
             IBinder.DeathRecipient, UserManagerInternal.UserRestrictionsListener {
@@ -262,17 +279,6 @@
                 if (readPersistedSensorPrivacyStateLocked()) {
                     persistSensorPrivacyStateLocked();
                 }
-
-                for (int i = 0; i < mIndividualEnabled.size(); i++) {
-                    int userId = mIndividualEnabled.keyAt(i);
-                    SparseBooleanArray userIndividualEnabled =
-                            mIndividualEnabled.valueAt(i);
-                    for (int j = 0; j < userIndividualEnabled.size(); j++) {
-                        int sensor = userIndividualEnabled.keyAt(j);
-                        boolean enabled = userIndividualEnabled.valueAt(j);
-                        setUserRestriction(userId, sensor, enabled);
-                    }
-                }
             }
 
             int[] micAndCameraOps = new int[]{OP_RECORD_AUDIO, OP_PHONE_CALL_MICROPHONE,
@@ -1379,7 +1385,10 @@
             SparseArray<RemoteCallbackList<ISensorPrivacyListener>> listenersForUser =
                     mIndividualSensorListeners.get(userId);
 
-            setUserRestriction(userId, sensor, enabled);
+            setGlobalRestriction();
+            if (userId == mCurrentUser) {
+                setGlobalRestriction();
+            }
 
             if (listenersForUser == null) {
                 return;
@@ -1408,16 +1417,18 @@
         }
     }
 
-    private void setUserRestriction(int userId, int sensor, boolean enabled) {
-        if (sensor == CAMERA) {
-            mAppOpsManager.setUserRestrictionForUser(OP_CAMERA, enabled,
-                    mAppOpsRestrictionToken, null, userId);
-        } else if (sensor == MICROPHONE) {
-            mAppOpsManager.setUserRestrictionForUser(OP_RECORD_AUDIO, enabled,
-                    mAppOpsRestrictionToken, null, userId);
-            mAppOpsManager.setUserRestrictionForUser(OP_RECORD_AUDIO_HOTWORD, enabled,
-                    mAppOpsRestrictionToken, null, userId);
-        }
+    private void setGlobalRestriction() {
+        boolean camState =
+                mSensorPrivacyServiceImpl
+                        .isIndividualSensorPrivacyEnabled(mCurrentUser, CAMERA);
+        boolean micState =
+                mSensorPrivacyServiceImpl
+                        .isIndividualSensorPrivacyEnabled(mCurrentUser, MICROPHONE);
+
+        mAppOpsManagerInternal
+                .setGlobalRestriction(OP_CAMERA, camState, mAppOpsRestrictionToken);
+        mAppOpsManagerInternal
+                .setGlobalRestriction(OP_RECORD_AUDIO, micState, mAppOpsRestrictionToken);
     }
 
     private final class DeathRecipient implements IBinder.DeathRecipient {
@@ -1535,7 +1546,7 @@
     }
 
     private class EmergencyCallHelper {
-        private OutogingEmergencyStateCallback mEmergencyStateCallback;
+        private OutgoingEmergencyStateCallback mEmergencyStateCallback;
         private CallStateCallback mCallStateCallback;
 
         private boolean mIsInEmergencyCall;
@@ -1544,7 +1555,7 @@
         private Object mEmergencyStateLock = new Object();
 
         EmergencyCallHelper() {
-            mEmergencyStateCallback = new OutogingEmergencyStateCallback();
+            mEmergencyStateCallback = new OutgoingEmergencyStateCallback();
             mCallStateCallback = new CallStateCallback();
 
             mTelephonyManager.registerTelephonyCallback(FgThread.getExecutor(),
@@ -1559,7 +1570,7 @@
             }
         }
 
-        private class OutogingEmergencyStateCallback extends TelephonyCallback implements
+        private class OutgoingEmergencyStateCallback extends TelephonyCallback implements
                 TelephonyCallback.OutgoingEmergencyCallListener {
             @Override
             public void onOutgoingEmergencyCall(EmergencyNumber placedEmergencyNumber,
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 89781d3..875ef37 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -36,6 +36,7 @@
 import static android.os.PowerExemptionManager.REASON_DEVICE_DEMO_MODE;
 import static android.os.PowerExemptionManager.REASON_DEVICE_OWNER;
 import static android.os.PowerExemptionManager.REASON_FGS_BINDING;
+import static android.os.PowerExemptionManager.REASON_CURRENT_INPUT_METHOD;
 import static android.os.PowerExemptionManager.REASON_INSTR_BACKGROUND_ACTIVITY_PERMISSION;
 import static android.os.PowerExemptionManager.REASON_INSTR_BACKGROUND_FGS_PERMISSION;
 import static android.os.PowerExemptionManager.REASON_OPT_OUT_REQUESTED;
@@ -328,23 +329,11 @@
      * Watch for apps being put into forced app standby, so we can step their fg
      * services down.
      */
-    class ForcedStandbyListener implements AppStateTracker.ForcedAppStandbyListener {
+    class ForcedStandbyListener implements AppStateTracker.ServiceStateListener {
         @Override
-        public void updateForceAppStandbyForUidPackage(int uid, String packageName,
-                boolean standby) {
+        public void stopForegroundServicesForUidPackage(final int uid, final String packageName) {
             synchronized (mAm) {
-                if (standby) {
-                    stopAllForegroundServicesLocked(uid, packageName);
-                }
-                mAm.mProcessList.updateForceAppStandbyForUidPackageLocked(
-                        uid, packageName, standby);
-            }
-        }
-
-        @Override
-        public void updateForcedAppStandbyForAllApps() {
-            synchronized (mAm) {
-                mAm.mProcessList.updateForcedAppStandbyForAllAppsLocked();
+                stopAllForegroundServicesLocked(uid, packageName);
             }
         }
     }
@@ -530,7 +519,7 @@
 
     void systemServicesReady() {
         AppStateTracker ast = LocalServices.getService(AppStateTracker.class);
-        ast.addForcedAppStandbyListener(new ForcedStandbyListener());
+        ast.addServiceStateListener(new ForcedStandbyListener());
         mAppWidgetManagerInternal = LocalServices.getService(AppWidgetManagerInternal.class);
         setAllowListWhileInUsePermissionInFgs();
     }
@@ -6174,6 +6163,20 @@
                 ret = REASON_OP_ACTIVATE_PLATFORM_VPN;
             }
         }
+
+        if (ret == REASON_DENIED) {
+            final String inputMethod =
+                    Settings.Secure.getStringForUser(mAm.mContext.getContentResolver(),
+                            Settings.Secure.DEFAULT_INPUT_METHOD,
+                            UserHandle.getUserId(callingUid));
+            if (inputMethod != null) {
+                final ComponentName cn = ComponentName.unflattenFromString(inputMethod);
+                if (cn != null && cn.getPackageName().equals(callingPackage)) {
+                    ret = REASON_CURRENT_INPUT_METHOD;
+                }
+            }
+        }
+
         if (ret == REASON_DENIED) {
             if (mAm.mConstants.mFgsAllowOptOut
                     && targetService != null
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index 445d0ba..530f918 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -52,8 +52,7 @@
     private static final String TAG = "ActivityManagerConstants";
 
     // Key names stored in the settings value.
-    static final String KEY_BACKGROUND_SETTLE_TIME = "background_settle_time";
-
+    private static final String KEY_BACKGROUND_SETTLE_TIME = "background_settle_time";
     private static final String KEY_FGSERVICE_MIN_SHOWN_TIME
             = "fgservice_min_shown_time";
     private static final String KEY_FGSERVICE_MIN_REPORT_TIME
@@ -109,10 +108,10 @@
     static final String KEY_FG_TO_BG_FGS_GRACE_DURATION = "fg_to_bg_fgs_grace_duration";
     static final String KEY_FGS_START_FOREGROUND_TIMEOUT = "fgs_start_foreground_timeout";
     static final String KEY_FGS_ATOM_SAMPLE_RATE = "fgs_atom_sample_rate";
-    static final String KEY_KILL_FAS_CACHED_IDLE = "kill_fas_cached_idle";
     static final String KEY_FGS_ALLOW_OPT_OUT = "fgs_allow_opt_out";
 
     private static final int DEFAULT_MAX_CACHED_PROCESSES = 32;
+    private static final long DEFAULT_BACKGROUND_SETTLE_TIME = 60*1000;
     private static final long DEFAULT_FGSERVICE_MIN_SHOWN_TIME = 2*1000;
     private static final long DEFAULT_FGSERVICE_MIN_REPORT_TIME = 3*1000;
     private static final long DEFAULT_FGSERVICE_SCREEN_ON_BEFORE_TIME = 1*1000;
@@ -153,10 +152,6 @@
     private static final long DEFAULT_FG_TO_BG_FGS_GRACE_DURATION = 5 * 1000;
     private static final int DEFAULT_FGS_START_FOREGROUND_TIMEOUT_MS = 10 * 1000;
     private static final float DEFAULT_FGS_ATOM_SAMPLE_RATE = 1; // 100 %
-
-    static final long DEFAULT_BACKGROUND_SETTLE_TIME = 60 * 1000;
-    static final boolean DEFAULT_KILL_FAS_CACHED_IDLE = true;
-
     /**
      * Same as {@link TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_NOT_ALLOWED}
      */
@@ -501,12 +496,6 @@
     volatile float mFgsAtomSampleRate = DEFAULT_FGS_ATOM_SAMPLE_RATE;
 
     /**
-     * Whether or not to kill apps in force-app-standby state and it's cached, its UID state is
-     * idle.
-     */
-    volatile boolean mKillForceAppStandByAndCachedIdle = DEFAULT_KILL_FAS_CACHED_IDLE;
-
-    /**
      * Whether to allow "opt-out" from the foreground service restrictions.
      * (https://developer.android.com/about/versions/12/foreground-services)
      */
@@ -720,9 +709,6 @@
                             case KEY_FGS_ATOM_SAMPLE_RATE:
                                 updateFgsAtomSamplePercent();
                                 break;
-                            case KEY_KILL_FAS_CACHED_IDLE:
-                                updateKillFasCachedIdle();
-                                break;
                             case KEY_FGS_ALLOW_OPT_OUT:
                                 updateFgsAllowOptOut();
                                 break;
@@ -1065,13 +1051,6 @@
                 DEFAULT_FGS_ATOM_SAMPLE_RATE);
     }
 
-    private void updateKillFasCachedIdle() {
-        mKillForceAppStandByAndCachedIdle = DeviceConfig.getBoolean(
-                DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
-                KEY_KILL_FAS_CACHED_IDLE,
-                DEFAULT_KILL_FAS_CACHED_IDLE);
-    }
-
     private void updateFgsAllowOptOut() {
         mFgsAllowOptOut = DeviceConfig.getBoolean(
                 DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index a04edc7..3b0a68c 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -14382,10 +14382,6 @@
         final int capability = uidRec != null ? uidRec.getSetCapability() : 0;
         final boolean ephemeral = uidRec != null ? uidRec.isEphemeral() : isEphemeralLocked(uid);
 
-        if (uidRec != null && uidRec.isIdle() && (change & UidRecord.CHANGE_IDLE) != 0) {
-            mProcessList.killAppIfForceStandbyAndCachedIdleLocked(uidRec);
-        }
-
         if (uidRec != null && !uidRec.isIdle() && (change & UidRecord.CHANGE_GONE) != 0) {
             // If this uid is going away, and we haven't yet reported it is gone,
             // then do so now.
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index aef402a..6cebf47 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -2835,8 +2835,6 @@
                             + " target=" + state.getAdjTarget() + " capability=" + item.capability);
         }
 
-        mProcessList.killAppIfForceStandbyAndCachedIdleLocked(app);
-
         return success;
     }
 
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 1b67679..7c5d09c 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -125,7 +125,6 @@
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.MemInfoReader;
-import com.android.server.AppStateTracker;
 import com.android.server.LocalServices;
 import com.android.server.ServiceThread;
 import com.android.server.SystemConfig;
@@ -2370,12 +2369,6 @@
                 allowlistedAppDataInfoMap = null;
             }
 
-            AppStateTracker ast = LocalServices.getService(AppStateTracker.class);
-            if (ast != null) {
-                app.mState.setForcedAppStandby(ast.isAppInForcedAppStandby(
-                        app.info.uid, app.info.packageName));
-            }
-
             final Process.ProcessStartResult startResult;
             boolean regularZygote = false;
             if (hostingRecord.usesWebviewZygote()) {
@@ -4698,10 +4691,10 @@
                         final ApplicationInfo ai = AppGlobals.getPackageManager()
                                 .getApplicationInfo(packageName, STOCK_PM_FLAGS, app.userId);
                         if (ai != null) {
+                            app.getThread().scheduleApplicationInfoChanged(ai);
                             if (ai.packageName.equals(app.info.packageName)) {
                                 app.info = ai;
                             }
-                            app.getThread().scheduleApplicationInfoChanged(ai);
                             targetProcesses.add(app.getWindowProcessController());
                         }
                     } catch (RemoteException e) {
@@ -4712,7 +4705,8 @@
             });
         }
 
-        mService.mActivityTaskManager.updateAssetConfiguration(targetProcesses, updateFrameworkRes);
+        mService.mActivityTaskManager.updateAssetConfiguration(
+                updateFrameworkRes ? null : targetProcesses);
     }
 
     @GuardedBy("mService")
@@ -5007,55 +5001,6 @@
         return true;
     }
 
-    @GuardedBy("mService")
-    void updateForceAppStandbyForUidPackageLocked(int uid, String packageName, boolean standby) {
-        final UidRecord uidRec = getUidRecordLOSP(uid);
-        if (uidRec != null) {
-            uidRec.forEachProcess(app -> {
-                if (TextUtils.equals(app.info.packageName, packageName)) {
-                    app.mState.setForcedAppStandby(standby);
-                    killAppIfForceStandbyAndCachedIdleLocked(app);
-                }
-            });
-        }
-    }
-
-    @GuardedBy("mService")
-    void updateForcedAppStandbyForAllAppsLocked() {
-        if (!mService.mConstants.mKillForceAppStandByAndCachedIdle) {
-            return;
-        }
-        final AppStateTracker ast = LocalServices.getService(AppStateTracker.class);
-        for (int i = mLruProcesses.size() - 1; i >= 0; i--) {
-            final ProcessRecord app = mLruProcesses.get(i);
-            final boolean standby = ast.isAppInForcedAppStandby(
-                    app.info.uid, app.info.packageName);
-            app.mState.setForcedAppStandby(standby);
-            if (standby) {
-                killAppIfForceStandbyAndCachedIdleLocked(app);
-            }
-        }
-    }
-
-    @GuardedBy("mService")
-    void killAppIfForceStandbyAndCachedIdleLocked(ProcessRecord app) {
-        final UidRecord uidRec = app.getUidRecord();
-        if (mService.mConstants.mKillForceAppStandByAndCachedIdle
-                && uidRec != null && uidRec.isIdle()
-                && !app.mState.shouldNotKillOnForcedAppStandbyAndIdle()
-                && app.isCached() && app.mState.isForcedAppStandby()) {
-            app.killLocked("cached idle & forced-app-standby",
-                    ApplicationExitInfo.REASON_OTHER,
-                    ApplicationExitInfo.SUBREASON_CACHED_IDLE_FORCED_APP_STANDBY,
-                    true);
-        }
-    }
-
-    @GuardedBy("mService")
-    void killAppIfForceStandbyAndCachedIdleLocked(UidRecord uidRec) {
-        uidRec.forEachProcess(app -> killAppIfForceStandbyAndCachedIdleLocked(app));
-    }
-
     /**
      * Called by ActivityManagerService when a process died.
      */
diff --git a/services/core/java/com/android/server/am/ProcessStateRecord.java b/services/core/java/com/android/server/am/ProcessStateRecord.java
index 5dbd71a..c113bc2 100644
--- a/services/core/java/com/android/server/am/ProcessStateRecord.java
+++ b/services/core/java/com/android/server/am/ProcessStateRecord.java
@@ -302,12 +302,6 @@
     private int mAllowStartFgsState = PROCESS_STATE_NONEXISTENT;
 
     /**
-     * Whether or not this process has been in forced-app-standby state.
-     */
-    @GuardedBy("mService")
-    private boolean mForcedAppStandby;
-
-    /**
      * Debugging: primary thing impacting oom_adj.
      */
     @GuardedBy("mService")
@@ -1126,16 +1120,6 @@
     }
 
     @GuardedBy("mService")
-    void setForcedAppStandby(boolean standby) {
-        mForcedAppStandby = standby;
-    }
-
-    @GuardedBy("mService")
-    boolean isForcedAppStandby() {
-        return mForcedAppStandby;
-    }
-
-    @GuardedBy("mService")
     void updateLastInvisibleTime(boolean hasVisibleActivities) {
         if (hasVisibleActivities) {
             mLastInvisibleTime = Long.MAX_VALUE;
@@ -1203,8 +1187,7 @@
             pw.print(" pendingUiClean="); pw.println(mApp.mProfile.hasPendingUiClean());
         }
         pw.print(prefix); pw.print("cached="); pw.print(mCached);
-        pw.print(" empty="); pw.print(mEmpty);
-        pw.print(" forcedAppStandby="); pw.println(mForcedAppStandby);
+        pw.print(" empty="); pw.println(mEmpty);
         if (mServiceB) {
             pw.print(prefix); pw.print("serviceb="); pw.print(mServiceB);
             pw.print(" serviceHighRam="); pw.println(mServiceHighRam);
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index 0a5e2b6..e001b05 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -338,7 +338,14 @@
     /*
      * These are app op restrictions imposed per user from various parties.
      */
-    private final ArrayMap<IBinder, ClientRestrictionState> mOpUserRestrictions = new ArrayMap<>();
+    private final ArrayMap<IBinder, ClientUserRestrictionState> mOpUserRestrictions =
+            new ArrayMap<>();
+
+    /*
+     * These are app op restrictions imposed globally from various parties within the system.
+     */
+    private final ArrayMap<IBinder, ClientGlobalRestrictionState> mOpGlobalRestrictions =
+            new ArrayMap<>();
 
     SparseIntArray mProfileOwners;
 
@@ -2341,8 +2348,9 @@
             boolean isCallerSystem = Binder.getCallingPid() == Process.myPid();
             boolean isCallerPermissionController;
             try {
-                isCallerPermissionController = pm.getPackageUid(
-                        mContext.getPackageManager().getPermissionControllerPackageName(), 0)
+                isCallerPermissionController = pm.getPackageUidAsUser(
+                        mContext.getPackageManager().getPermissionControllerPackageName(), 0,
+                        UserHandle.getUserId(Binder.getCallingUid()))
                         == Binder.getCallingUid();
             } catch (PackageManager.NameNotFoundException doesNotHappen) {
                 return;
@@ -4515,10 +4523,15 @@
         int callingUid = Binder.getCallingUid();
 
         // Allow any attribution tag for resolvable uids
-        int pkgUid = resolveUid(packageName);
-        if (pkgUid != Process.INVALID_UID) {
+        int pkgUid;
+        if (Objects.equals(packageName, "com.android.shell")) {
             // Special case for the shell which is a package but should be able
             // to bypass app attribution tag restrictions.
+            pkgUid = Process.SHELL_UID;
+        } else {
+            pkgUid = resolveUid(packageName);
+        }
+        if (pkgUid != Process.INVALID_UID) {
             if (pkgUid != UserHandle.getAppId(uid)) {
                 String otherUidMessage = DEBUG ? " but it is really " + pkgUid : " but it is not";
                 throw new SecurityException("Specified package " + packageName + " under uid "
@@ -4721,13 +4734,22 @@
 
     private boolean isOpRestrictedLocked(int uid, int code, String packageName,
             String attributionTag, @Nullable RestrictionBypass appBypass) {
+        int restrictionSetCount = mOpGlobalRestrictions.size();
+
+        for (int i = 0; i < restrictionSetCount; i++) {
+            ClientGlobalRestrictionState restrictionState = mOpGlobalRestrictions.valueAt(i);
+            if (restrictionState.hasRestriction(code)) {
+                return true;
+            }
+        }
+
         int userHandle = UserHandle.getUserId(uid);
-        final int restrictionSetCount = mOpUserRestrictions.size();
+        restrictionSetCount = mOpUserRestrictions.size();
 
         for (int i = 0; i < restrictionSetCount; i++) {
             // For each client, check that the given op is not restricted, or that the given
             // package is exempt from the restriction.
-            ClientRestrictionState restrictionState = mOpUserRestrictions.valueAt(i);
+            ClientUserRestrictionState restrictionState = mOpUserRestrictions.valueAt(i);
             if (restrictionState.hasRestriction(code, packageName, attributionTag, userHandle)) {
                 RestrictionBypass opBypass = opAllowSystemBypassRestriction(code);
                 if (opBypass != null) {
@@ -6294,10 +6316,31 @@
                 pw.println();
             }
 
+            final int globalRestrictionCount = mOpGlobalRestrictions.size();
+            for (int i = 0; i < globalRestrictionCount; i++) {
+                IBinder token = mOpGlobalRestrictions.keyAt(i);
+                ClientGlobalRestrictionState restrictionState = mOpGlobalRestrictions.valueAt(i);
+                ArraySet<Integer> restrictedOps = restrictionState.mRestrictedOps;
+
+                pw.println("  Global restrictions for token " + token + ":");
+                StringBuilder restrictedOpsValue = new StringBuilder();
+                restrictedOpsValue.append("[");
+                final int restrictedOpCount = restrictedOps.size();
+                for (int j = 0; j < restrictedOpCount; j++) {
+                    if (restrictedOpsValue.length() > 1) {
+                        restrictedOpsValue.append(", ");
+                    }
+                    restrictedOpsValue.append(AppOpsManager.opToName(restrictedOps.valueAt(j)));
+                }
+                restrictedOpsValue.append("]");
+                pw.println("      Restricted ops: " + restrictedOpsValue);
+
+            }
+
             final int userRestrictionCount = mOpUserRestrictions.size();
             for (int i = 0; i < userRestrictionCount; i++) {
                 IBinder token = mOpUserRestrictions.keyAt(i);
-                ClientRestrictionState restrictionState = mOpUserRestrictions.valueAt(i);
+                ClientUserRestrictionState restrictionState = mOpUserRestrictions.valueAt(i);
                 boolean printedTokenHeader = false;
 
                 if (dumpMode >= 0 || dumpWatchers || dumpHistory) {
@@ -6443,11 +6486,11 @@
     private void setUserRestrictionNoCheck(int code, boolean restricted, IBinder token,
             int userHandle, PackageTagsList excludedPackageTags) {
         synchronized (AppOpsService.this) {
-            ClientRestrictionState restrictionState = mOpUserRestrictions.get(token);
+            ClientUserRestrictionState restrictionState = mOpUserRestrictions.get(token);
 
             if (restrictionState == null) {
                 try {
-                    restrictionState = new ClientRestrictionState(token);
+                    restrictionState = new ClientUserRestrictionState(token);
                 } catch (RemoteException e) {
                     return;
                 }
@@ -6527,7 +6570,7 @@
         synchronized (AppOpsService.this) {
             final int tokenCount = mOpUserRestrictions.size();
             for (int i = tokenCount - 1; i >= 0; i--) {
-                ClientRestrictionState opRestrictions = mOpUserRestrictions.valueAt(i);
+                ClientUserRestrictionState opRestrictions = mOpUserRestrictions.valueAt(i);
                 opRestrictions.removeUser(userHandle);
             }
             removeUidsForUserLocked(userHandle);
@@ -6955,7 +6998,6 @@
                 return Process.ROOT_UID;
             case "shell":
             case "dumpstate":
-            case "com.android.shell":
                 return Process.SHELL_UID;
             case "media":
                 return Process.MEDIA_UID;
@@ -6985,12 +7027,12 @@
         return packageNames;
     }
 
-    private final class ClientRestrictionState implements DeathRecipient {
+    private final class ClientUserRestrictionState implements DeathRecipient {
         private final IBinder token;
         SparseArray<boolean[]> perUserRestrictions;
         SparseArray<PackageTagsList> perUserExcludedPackageTags;
 
-        public ClientRestrictionState(IBinder token)
+        ClientUserRestrictionState(IBinder token)
                 throws RemoteException {
             token.linkToDeath(this, 0);
             this.token = token;
@@ -7081,6 +7123,7 @@
             if (perUserExclusions == null) {
                 return true;
             }
+
             return !perUserExclusions.contains(packageName, attributionTag);
         }
 
@@ -7142,6 +7185,42 @@
         }
     }
 
+    private final class ClientGlobalRestrictionState implements DeathRecipient {
+        final IBinder mToken;
+        final ArraySet<Integer> mRestrictedOps = new ArraySet<>();
+
+        ClientGlobalRestrictionState(IBinder token)
+                throws RemoteException {
+            token.linkToDeath(this, 0);
+            this.mToken = token;
+        }
+
+        boolean setRestriction(int code, boolean restricted) {
+            if (restricted) {
+                return mRestrictedOps.add(code);
+            } else {
+                return mRestrictedOps.remove(code);
+            }
+        }
+
+        boolean hasRestriction(int code) {
+            return mRestrictedOps.contains(code);
+        }
+
+        boolean isDefault() {
+            return mRestrictedOps.isEmpty();
+        }
+
+        @Override
+        public void binderDied() {
+            destroy();
+        }
+
+        void destroy() {
+            mToken.unlinkToDeath(this, 0);
+        }
+    }
+
     private final class AppOpsManagerInternalImpl extends AppOpsManagerInternal {
         @Override public void setDeviceAndProfileOwners(SparseIntArray owners) {
             synchronized (AppOpsService.this) {
@@ -7166,6 +7245,42 @@
                 int mode, @Nullable IAppOpsCallback callback) {
             setMode(code, uid, packageName, mode, callback);
         }
+
+
+        @Override
+        public void setGlobalRestriction(int code, boolean restricted, IBinder token) {
+            if (Binder.getCallingPid() != Process.myPid()) {
+                // TODO instead of this enforcement put in AppOpsManagerInternal
+                throw new SecurityException("Only the system can set global restrictions");
+            }
+
+            synchronized (AppOpsService.this) {
+                ClientGlobalRestrictionState restrictionState = mOpGlobalRestrictions.get(token);
+
+                if (restrictionState == null) {
+                    try {
+                        restrictionState = new ClientGlobalRestrictionState(token);
+                    } catch (RemoteException  e) {
+                        return;
+                    }
+                    mOpGlobalRestrictions.put(token, restrictionState);
+                }
+
+                if (restrictionState.setRestriction(code, restricted)) {
+                    mHandler.sendMessage(PooledLambda.obtainMessage(
+                            AppOpsService::notifyWatchersOfChange, AppOpsService.this, code,
+                            UID_ANY));
+                    mHandler.sendMessage(PooledLambda.obtainMessage(
+                            AppOpsService::updateStartedOpModeForUser, AppOpsService.this,
+                            code, restricted, UserHandle.USER_ALL));
+                }
+
+                if (restrictionState.isDefault()) {
+                    mOpGlobalRestrictions.remove(token);
+                    restrictionState.destroy();
+                }
+            }
+        }
     }
 
     /**
diff --git a/services/core/java/com/android/server/biometrics/AuthSession.java b/services/core/java/com/android/server/biometrics/AuthSession.java
index 8f36489..bfb42f8 100644
--- a/services/core/java/com/android/server/biometrics/AuthSession.java
+++ b/services/core/java/com/android/server/biometrics/AuthSession.java
@@ -366,10 +366,9 @@
         // sending the final error callback to the application.
         for (BiometricSensor sensor : mPreAuthInfo.eligibleSensors) {
             try {
-                if (filter.apply(sensor)) {
-                    if (DEBUG) {
-                        Slog.v(TAG, "Canceling sensor: " + sensor.id);
-                    }
+                final boolean shouldCancel = filter.apply(sensor);
+                Slog.d(TAG, "sensorId: " + sensor.id + ", shouldCancel: " + shouldCancel);
+                if (shouldCancel) {
                     sensor.goToStateCancelling(mToken, mOpPackageName);
                 }
             } catch (RemoteException e) {
@@ -542,9 +541,9 @@
 
         if (mState != STATE_AUTH_STARTED
                 && mState != STATE_AUTH_STARTED_UI_SHOWING
-                && mState != STATE_AUTH_PAUSED) {
-            Slog.e(TAG, "onStartFingerprint, unexpected state: " + mState);
-            return;
+                && mState != STATE_AUTH_PAUSED
+                && mState != STATE_ERROR_PENDING_SYSUI) {
+            Slog.w(TAG, "onStartFingerprint, started from unexpected state: " + mState);
         }
 
         mMultiSensorState = MULTI_SENSOR_STATE_FP_SCANNING;
diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java
index e8e25f1..fed320d 100644
--- a/services/core/java/com/android/server/biometrics/BiometricService.java
+++ b/services/core/java/com/android/server/biometrics/BiometricService.java
@@ -1369,11 +1369,11 @@
     /**
      * handleAuthenticate() (above) which is called from BiometricPrompt determines which
      * modality/modalities to start authenticating with. authenticateInternal() should only be
-     * used for:
-     * 1) Preparing <Biometric>Services for authentication when BiometricPrompt#authenticate is,
-     * invoked, shortly after which BiometricPrompt is shown and authentication starts
-     * 2) Preparing <Biometric>Services for authentication when BiometricPrompt is already shown
-     * and the user has pressed "try again"
+     * used for preparing <Biometric>Services for authentication when BiometricPrompt#authenticate
+     * is invoked, shortly after which BiometricPrompt is shown and authentication starts.
+     *
+     * Note that this path is NOT invoked when the BiometricPrompt "Try again" button is pressed.
+     * In that case, see {@link #handleOnTryAgainPressed()}.
      */
     private void authenticateInternal(IBinder token, long operationId, int userId,
             IBiometricServiceReceiver receiver, String opPackageName, PromptInfo promptInfo,
diff --git a/services/core/java/com/android/server/biometrics/PreAuthInfo.java b/services/core/java/com/android/server/biometrics/PreAuthInfo.java
index c4bd18b..cd0ff10 100644
--- a/services/core/java/com/android/server/biometrics/PreAuthInfo.java
+++ b/services/core/java/com/android/server/biometrics/PreAuthInfo.java
@@ -408,22 +408,22 @@
     public String toString() {
         StringBuilder string = new StringBuilder(
                 "BiometricRequested: " + mBiometricRequested
-                        + "\nStrengthRequested: " + mBiometricStrengthRequested
-                        + "\nCredentialRequested: " + credentialRequested);
-        string.append("\nEligible:{");
+                        + ", StrengthRequested: " + mBiometricStrengthRequested
+                        + ", CredentialRequested: " + credentialRequested);
+        string.append(", Eligible:{");
         for (BiometricSensor sensor: eligibleSensors) {
             string.append(sensor.id).append(" ");
         }
         string.append("}");
 
-        string.append("\nIneligible:{");
+        string.append(", Ineligible:{");
         for (Pair<BiometricSensor, Integer> ineligible : ineligibleSensors) {
             string.append(ineligible.first).append(":").append(ineligible.second).append(" ");
         }
         string.append("}");
 
-        string.append("\nCredentialAvailable: ").append(credentialAvailable);
-        string.append("\n");
+        string.append(", CredentialAvailable: ").append(credentialAvailable);
+        string.append(", ");
         return string.toString();
     }
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java b/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java
index 28e23e3..c8fb80a 100644
--- a/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java
@@ -17,7 +17,6 @@
 package com.android.server.biometrics.sensors;
 
 import android.annotation.NonNull;
-import android.annotation.Nullable;
 import android.content.Context;
 import android.hardware.biometrics.BiometricConstants;
 import android.media.AudioAttributes;
@@ -27,7 +26,6 @@
 import android.os.SystemClock;
 import android.os.VibrationEffect;
 import android.os.Vibrator;
-import android.text.TextUtils;
 import android.util.Slog;
 
 /**
@@ -39,24 +37,18 @@
 
     private static final String TAG = "Biometrics/AcquisitionClient";
 
-    private static final AudioAttributes VIBRATION_SONFICATION_ATTRIBUTES =
+    private static final AudioAttributes VIBRATION_SONIFICATION_ATTRIBUTES =
             new AudioAttributes.Builder()
                     .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                     .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
                     .build();
 
-    private final VibrationEffect mEffectTick = VibrationEffect.get(VibrationEffect.EFFECT_TICK);
-    private final VibrationEffect mEffectTextureTick =
-            VibrationEffect.get(VibrationEffect.EFFECT_TEXTURE_TICK);
-    private final VibrationEffect mEffectClick = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
-    private final VibrationEffect mEffectHeavy =
-            VibrationEffect.get(VibrationEffect.EFFECT_HEAVY_CLICK);
-    private final VibrationEffect mDoubleClick =
+    private static final VibrationEffect SUCCESS_VIBRATION_EFFECT =
+            VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
+    private static final VibrationEffect ERROR_VIBRATION_EFFECT =
             VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK);
 
     private final PowerManager mPowerManager;
-    private final VibrationEffect mSuccessVibrationEffect;
-    private final VibrationEffect mErrorVibrationEffect;
     private boolean mShouldSendErrorToClient = true;
     private boolean mAlreadyCancelled;
 
@@ -72,8 +64,6 @@
         super(context, lazyDaemon, token, listener, userId, owner, cookie, sensorId, statsModality,
                 statsAction, statsClient);
         mPowerManager = context.getSystemService(PowerManager.class);
-        mSuccessVibrationEffect = mEffectClick;
-        mErrorVibrationEffect = mDoubleClick;
     }
 
     @Override
@@ -192,49 +182,31 @@
         mPowerManager.userActivity(now, PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
     }
 
-    protected @Nullable VibrationEffect getSuccessVibrationEffect() {
-        return mSuccessVibrationEffect;
+    protected boolean successHapticsEnabled() {
+        return true;
     }
 
-    protected @Nullable VibrationEffect getErrorVibrationEffect() {
-        return mErrorVibrationEffect;
+    protected boolean errorHapticsEnabled() {
+        return true;
     }
 
     protected final void vibrateSuccess() {
+        if (!successHapticsEnabled()) {
+            return;
+        }
         Vibrator vibrator = getContext().getSystemService(Vibrator.class);
-        VibrationEffect effect = getSuccessVibrationEffect();
-        if (vibrator != null && effect != null) {
-            vibrator.vibrate(effect, VIBRATION_SONFICATION_ATTRIBUTES);
+        if (vibrator != null) {
+            vibrator.vibrate(SUCCESS_VIBRATION_EFFECT, VIBRATION_SONIFICATION_ATTRIBUTES);
         }
     }
 
     protected final void vibrateError() {
+        if (!errorHapticsEnabled()) {
+            return;
+        }
         Vibrator vibrator = getContext().getSystemService(Vibrator.class);
-        VibrationEffect effect = getErrorVibrationEffect();
-        if (vibrator != null && effect != null) {
-            vibrator.vibrate(effect, VIBRATION_SONFICATION_ATTRIBUTES);
-        }
-    }
-
-    protected final @NonNull VibrationEffect getVibration(@Nullable String effect,
-            @NonNull VibrationEffect defaultEffect) {
-        if (TextUtils.isEmpty(effect)) {
-            return defaultEffect;
-        }
-
-        switch (effect.toLowerCase()) {
-            case "click":
-                return mEffectClick;
-            case "heavy":
-                return mEffectHeavy;
-            case "texture_tick":
-                return mEffectTextureTick;
-            case "tick":
-                return mEffectTick;
-            case "double_click":
-                return mDoubleClick;
-            default:
-                return defaultEffect;
+        if (vibrator != null) {
+            vibrator.vibrate(ERROR_VIBRATION_EFFECT, VIBRATION_SONIFICATION_ATTRIBUTES);
         }
     }
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java
index 6b9ff6f..cf545f3 100644
--- a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java
@@ -22,7 +22,6 @@
 import android.app.ActivityTaskManager;
 import android.app.TaskStackListener;
 import android.content.ComponentName;
-import android.content.ContentResolver;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.hardware.biometrics.BiometricAuthenticator;
@@ -31,8 +30,6 @@
 import android.hardware.biometrics.BiometricsProtoEnums;
 import android.os.IBinder;
 import android.os.RemoteException;
-import android.os.VibrationEffect;
-import android.provider.Settings;
 import android.security.KeyStore;
 import android.util.EventLog;
 import android.util.Slog;
@@ -59,14 +56,12 @@
     private final LockoutTracker mLockoutTracker;
     private final boolean mIsRestricted;
     private final boolean mAllowBackgroundAuthentication;
-    @NonNull private final ContentResolver mContentResolver;
 
     protected final long mOperationId;
 
     private long mStartTimeMs;
 
     protected boolean mAuthAttempted;
-    private final boolean mCustomHaptics;
 
     public AuthenticationClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon,
             @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener,
@@ -85,10 +80,6 @@
         mLockoutTracker = lockoutTracker;
         mIsRestricted = restricted;
         mAllowBackgroundAuthentication = allowBackgroundAuthentication;
-
-        mContentResolver = context.getContentResolver();
-        mCustomHaptics = Settings.Global.getInt(mContentResolver,
-                "fp_custom_success_error", 0) == 1;
     }
 
     public @LockoutTracker.LockoutMode int handleFailedAttempt(int userId) {
@@ -342,33 +333,4 @@
     public boolean interruptsPrecedingClients() {
         return true;
     }
-
-    @Override
-    protected @Nullable VibrationEffect getSuccessVibrationEffect() {
-        if (!mCustomHaptics) {
-            return super.getSuccessVibrationEffect();
-        }
-
-        if (Settings.Global.getInt(mContentResolver, "fp_success_enabled", 1) == 0) {
-            return null;
-        }
-
-        return getVibration(Settings.Global.getString(mContentResolver,
-                "fp_success_type"), super.getSuccessVibrationEffect());
-    }
-
-    @Override
-    protected @Nullable VibrationEffect getErrorVibrationEffect() {
-        if (!mCustomHaptics) {
-            return super.getErrorVibrationEffect();
-        }
-
-        if (Settings.Global.getInt(mContentResolver, "fp_error_enabled", 1) == 0) {
-            return null;
-        }
-
-        return getVibration(Settings.Global.getString(mContentResolver,
-                "fp_error_type"), super.getErrorVibrationEffect());
-
-    }
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java b/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java
index f51b1c2..e5e1385 100644
--- a/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java
+++ b/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java
@@ -268,9 +268,9 @@
     public String toString() {
         return "{[" + mSequentialId + "] "
                 + this.getClass().getSimpleName()
-                + ", " + getProtoEnum()
-                + ", " + getOwnerString()
-                + ", " + getCookie()
-                + ", " + getTargetUserId() + "}";
+                + ", proto=" + getProtoEnum()
+                + ", owner=" + getOwnerString()
+                + ", cookie=" + getCookie()
+                + ", userId=" + getTargetUserId() + "}";
     }
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
index b52cb70..adda10e 100644
--- a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
+++ b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
@@ -579,6 +579,9 @@
         final boolean isCorrectClient = isAuthenticationOrDetectionOperation(mCurrentOperation);
         final boolean tokenMatches = mCurrentOperation.mClientMonitor.getToken() == token;
 
+        Slog.d(getTag(), "cancelAuthenticationOrDetection, isCorrectClient: " + isCorrectClient
+                + ", tokenMatches: " + tokenMatches);
+
         if (isCorrectClient && tokenMatches) {
             Slog.d(getTag(), "Cancelling: " + mCurrentOperation);
             cancelInternal(mCurrentOperation);
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java
index 98f9fe1..db927b2 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java
@@ -33,7 +33,6 @@
 import android.hardware.face.FaceManager;
 import android.os.IBinder;
 import android.os.RemoteException;
-import android.os.VibrationEffect;
 import android.provider.Settings;
 import android.util.Slog;
 
@@ -264,22 +263,16 @@
     }
 
     @Override
-    protected @Nullable VibrationEffect getSuccessVibrationEffect() {
-        if (!mCustomHaptics) {
-            return super.getSuccessVibrationEffect();
-        }
-
-        return getVibration(Settings.Global.getString(mContentResolver,
-                "face_success_type"), super.getSuccessVibrationEffect());
+    protected boolean successHapticsEnabled() {
+        return mCustomHaptics
+            ? Settings.Global.getInt(mContentResolver, "face_success_enabled", 1) == 0
+            : super.successHapticsEnabled();
     }
 
     @Override
-    protected @Nullable VibrationEffect getErrorVibrationEffect() {
-        if (!mCustomHaptics) {
-            return super.getErrorVibrationEffect();
-        }
-
-        return getVibration(Settings.Global.getString(mContentResolver,
-                "face_error_type"), super.getErrorVibrationEffect());
+    protected boolean errorHapticsEnabled() {
+        return mCustomHaptics
+            ? Settings.Global.getInt(mContentResolver, "face_error_enabled", 1) == 0
+            : super.errorHapticsEnabled();
     }
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java
index 38e6f08..6c0adaf 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java
@@ -28,7 +28,6 @@
 import android.hardware.face.FaceManager;
 import android.os.IBinder;
 import android.os.RemoteException;
-import android.os.VibrationEffect;
 import android.provider.Settings;
 import android.util.Slog;
 
@@ -203,22 +202,16 @@
     }
 
     @Override
-    protected @NonNull VibrationEffect getSuccessVibrationEffect() {
-        if (!mCustomHaptics) {
-            return super.getSuccessVibrationEffect();
-        }
-
-        return getVibration(Settings.Global.getString(mContentResolver,
-                "face_success_type"), super.getSuccessVibrationEffect());
+    protected boolean successHapticsEnabled() {
+        return mCustomHaptics
+            ? Settings.Global.getInt(mContentResolver, "face_success_enabled", 1) == 0
+            : super.successHapticsEnabled();
     }
 
     @Override
-    protected @NonNull VibrationEffect getErrorVibrationEffect() {
-        if (!mCustomHaptics) {
-            return super.getErrorVibrationEffect();
-        }
-
-        return getVibration(Settings.Global.getString(mContentResolver,
-                "face_error_type"), super.getErrorVibrationEffect());
+    protected boolean errorHapticsEnabled() {
+        return mCustomHaptics
+            ? Settings.Global.getInt(mContentResolver, "face_error_enabled", 1) == 0
+            : super.errorHapticsEnabled();
     }
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
index 54abc63..012e47e 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
@@ -498,6 +498,8 @@
 
             Utils.checkPermission(getContext(), MANAGE_BIOMETRIC);
 
+            Slog.d(TAG, "cancelAuthenticationFromService, sensorId: " + sensorId);
+
             final ServiceProvider provider = getProviderForSensor(sensorId);
             if (provider == null) {
                 Slog.w(TAG, "Null provider for cancelAuthenticationFromService");
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
index ba6ef29..1825eda 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
@@ -19,6 +19,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.TaskStackListener;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.hardware.biometrics.BiometricAuthenticator;
 import android.hardware.biometrics.BiometricFingerprintConstants;
@@ -29,6 +30,7 @@
 import android.hardware.fingerprint.IUdfpsOverlayController;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.provider.Settings;
 import android.util.Slog;
 
 import com.android.server.biometrics.Utils;
@@ -55,6 +57,9 @@
     @Nullable private final IUdfpsOverlayController mUdfpsOverlayController;
     @Nullable private ICancellationSignal mCancellationSignal;
 
+    @NonNull private final ContentResolver mContentResolver;
+    private final boolean mCustomHaptics;
+
     FingerprintAuthenticationClient(@NonNull Context context,
             @NonNull LazyDaemon<ISession> lazyDaemon, @NonNull IBinder token,
             @NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId,
@@ -69,6 +74,10 @@
                 lockoutCache, allowBackgroundAuthentication);
         mLockoutCache = lockoutCache;
         mUdfpsOverlayController = udfpsOverlayController;
+
+        mContentResolver = context.getContentResolver();
+        mCustomHaptics = Settings.Global.getInt(mContentResolver,
+            "fp_custom_success_error", 0) == 1;
     }
 
     @NonNull
@@ -204,4 +213,18 @@
         UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController);
         mCallback.onClientFinished(this, false /* success */);
     }
+
+    @Override
+    protected boolean successHapticsEnabled() {
+        return mCustomHaptics
+            ? Settings.Global.getInt(mContentResolver, "fp_success_enabled", 1) == 0
+            : super.successHapticsEnabled();
+    }
+
+    @Override
+    protected boolean errorHapticsEnabled() {
+        return mCustomHaptics
+            ? Settings.Global.getInt(mContentResolver, "fp_error_enabled", 1) == 0
+            : super.errorHapticsEnabled();
+    }
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
index 102aecc..7daea88 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
@@ -632,6 +632,7 @@
 
     @Override
     public void cancelAuthentication(int sensorId, @NonNull IBinder token) {
+        Slog.d(TAG, "cancelAuthentication, sensorId: " + sensorId);
         mHandler.post(() -> mScheduler.cancelAuthenticationOrDetection(token));
     }
 
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 182a038..0decd33 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -1528,8 +1528,14 @@
             if (requestedModeId == 0 && requestedRefreshRate != 0) {
                 // Scan supported modes returned by display.getInfo() to find a mode with the same
                 // size as the default display mode but with the specified refresh rate instead.
-                requestedModeId = display.getDisplayInfoLocked().findDefaultModeByRefreshRate(
-                        requestedRefreshRate).getModeId();
+                Display.Mode mode = display.getDisplayInfoLocked().findDefaultModeByRefreshRate(
+                        requestedRefreshRate);
+                if (mode != null) {
+                    requestedModeId = mode.getModeId();
+                } else {
+                    Slog.e(TAG, "Couldn't find a mode for the requestedRefreshRate: "
+                            + requestedRefreshRate + " on Display: " + displayId);
+                }
             }
             mDisplayModeDirector.getAppRequestObserver().setAppRequest(
                     displayId, requestedModeId, requestedMaxRefreshRate);
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index 505e743..a2cb78d 100755
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -23,6 +23,7 @@
 import android.hardware.hdmi.IHdmiControlCallback;
 import android.hardware.input.InputManager;
 import android.hardware.tv.cec.V1_0.SendMessageResult;
+import android.media.AudioManager;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
@@ -685,6 +686,9 @@
                     Message.obtain(mHandler, MSG_USER_CONTROL_RELEASE_TIMEOUT),
                     FOLLOWER_SAFETY_TIMEOUT);
             return Constants.HANDLED;
+        } else if (params.length > 0) {
+            // Handle CEC UI commands that are not mapped to an Android keycode
+            return handleUnmappedCecKeycode(params[0]);
         }
 
         return Constants.ABORT_INVALID_OPERAND;
@@ -692,6 +696,21 @@
 
     @ServiceThreadOnly
     @Constants.HandleMessageResult
+    protected int handleUnmappedCecKeycode(int cecKeycode) {
+        if (cecKeycode == HdmiCecKeycode.CEC_KEYCODE_MUTE_FUNCTION) {
+            mService.getAudioManager().adjustStreamVolume(AudioManager.STREAM_MUSIC,
+                    AudioManager.ADJUST_MUTE, AudioManager.FLAG_SHOW_UI);
+            return Constants.HANDLED;
+        } else if (cecKeycode == HdmiCecKeycode.CEC_KEYCODE_RESTORE_VOLUME_FUNCTION) {
+            mService.getAudioManager().adjustStreamVolume(AudioManager.STREAM_MUSIC,
+                    AudioManager.ADJUST_UNMUTE, AudioManager.FLAG_SHOW_UI);
+            return Constants.HANDLED;
+        }
+        return Constants.ABORT_INVALID_OPERAND;
+    }
+
+    @ServiceThreadOnly
+    @Constants.HandleMessageResult
     protected int handleUserControlReleased() {
         assertRunOnServiceThread();
         mHandler.removeMessages(MSG_USER_CONTROL_RELEASE_TIMEOUT);
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index f44241d..889785d 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -21486,7 +21486,7 @@
         // user handle installed state
         int[] allUsers;
         final int freezeUser;
-        final SparseArray<Pair<Integer, String>> enabledStateAndCallerPerUser;
+        final SparseArray<TempUserState> priorUserStates;
         /** enabled state of the uninstalled application */
         synchronized (mLock) {
             uninstalledPs = mSettings.getPackageLPr(packageName);
@@ -21537,16 +21537,16 @@
                 // We're downgrading a system app, which will apply to all users, so
                 // freeze them all during the downgrade
                 freezeUser = UserHandle.USER_ALL;
-                enabledStateAndCallerPerUser = new SparseArray<>();
+                priorUserStates = new SparseArray<>();
                 for (int i = 0; i < allUsers.length; i++) {
                     PackageUserState userState = uninstalledPs.readUserState(allUsers[i]);
-                    Pair<Integer, String> enabledStateAndCaller =
-                            new Pair<>(userState.enabled, userState.lastDisableAppCaller);
-                    enabledStateAndCallerPerUser.put(allUsers[i], enabledStateAndCaller);
+                    priorUserStates.put(allUsers[i],
+                            new TempUserState(userState.enabled, userState.lastDisableAppCaller,
+                                    userState.installed));
                 }
             } else {
                 freezeUser = removeUser;
-                enabledStateAndCallerPerUser = null;
+                priorUserStates = null;
             }
         }
 
@@ -21583,6 +21583,30 @@
             if (info.args != null) {
                 info.args.doPostDeleteLI(true);
             }
+
+            boolean reEnableStub = false;
+
+            if (priorUserStates != null) {
+                synchronized (mLock) {
+                    for (int i = 0; i < allUsers.length; i++) {
+                        TempUserState priorUserState = priorUserStates.get(allUsers[i]);
+                        int enabledState = priorUserState.enabledState;
+                        PackageSetting pkgSetting = getPackageSetting(packageName);
+                        pkgSetting.setEnabled(enabledState, allUsers[i],
+                                priorUserState.lastDisableAppCaller);
+
+                        AndroidPackage aPkg = pkgSetting.getPkg();
+                        boolean pkgEnabled = aPkg != null && aPkg.isEnabled();
+                        if (!reEnableStub && priorUserState.installed
+                                && ((enabledState == COMPONENT_ENABLED_STATE_DEFAULT && pkgEnabled)
+                                        || enabledState == COMPONENT_ENABLED_STATE_ENABLED)) {
+                            reEnableStub = true;
+                        }
+                    }
+                    mSettings.writeAllUsersPackageRestrictionsLPr();
+                }
+            }
+
             final AndroidPackage stubPkg =
                     (disabledSystemPs == null) ? null : disabledSystemPs.pkg;
             if (stubPkg != null && stubPkg.isStub()) {
@@ -21592,19 +21616,7 @@
                 }
 
                 if (stubPs != null) {
-                    boolean enable = false;
-                    for (int aUserId : allUsers) {
-                        if (stubPs.getInstalled(aUserId)) {
-                            int enabled = stubPs.getEnabled(aUserId);
-                            if (enabled == COMPONENT_ENABLED_STATE_DEFAULT
-                                    || enabled == COMPONENT_ENABLED_STATE_ENABLED) {
-                                enable = true;
-                                break;
-                            }
-                        }
-                    }
-
-                    if (enable) {
+                    if (reEnableStub) {
                         if (DEBUG_COMPRESSION) {
                             Slog.i(TAG, "Enabling system stub after removal; pkg: "
                                     + stubPkg.getPackageName());
@@ -21616,19 +21628,6 @@
                     }
                 }
             }
-            if (enabledStateAndCallerPerUser != null) {
-                synchronized (mLock) {
-                    for (int i = 0; i < allUsers.length; i++) {
-                        Pair<Integer, String> enabledStateAndCaller =
-                                enabledStateAndCallerPerUser.get(allUsers[i]);
-                        getPackageSetting(packageName)
-                                .setEnabled(enabledStateAndCaller.first,
-                                        allUsers[i],
-                                        enabledStateAndCaller.second);
-                    }
-                    mSettings.writeAllUsersPackageRestrictionsLPr();
-                }
-            }
         }
 
         return res ? PackageManager.DELETE_SUCCEEDED : PackageManager.DELETE_FAILED_INTERNAL_ERROR;
@@ -28933,6 +28932,20 @@
             }
         }
     }
+
+    private static class TempUserState {
+        public final int enabledState;
+        @Nullable
+        public final String lastDisableAppCaller;
+        public final boolean installed;
+
+        private TempUserState(int enabledState, @Nullable String lastDisableAppCaller,
+                boolean installed) {
+            this.enabledState = enabledState;
+            this.lastDisableAppCaller = lastDisableAppCaller;
+            this.installed = installed;
+        }
+    }
 }
 
 interface PackageSender {
diff --git a/services/core/java/com/android/server/pm/TEST_MAPPING b/services/core/java/com/android/server/pm/TEST_MAPPING
index 878eb92..9182d81 100644
--- a/services/core/java/com/android/server/pm/TEST_MAPPING
+++ b/services/core/java/com/android/server/pm/TEST_MAPPING
@@ -162,9 +162,6 @@
           "include-filter": "com.android.server.pm.parsing.SystemPartitionParseTest"
         }
       ]
-    },
-    {
-      "name": "CtsPackageManagerBootTestCases"
     }
   ],
   "imports": [
diff --git a/services/core/java/com/android/server/policy/AppOpsPolicy.java b/services/core/java/com/android/server/policy/AppOpsPolicy.java
index a389f40..7689f5f 100644
--- a/services/core/java/com/android/server/policy/AppOpsPolicy.java
+++ b/services/core/java/com/android/server/policy/AppOpsPolicy.java
@@ -81,6 +81,12 @@
     private final VoiceInteractionManagerInternal mVoiceInteractionManagerInternal;
 
     /**
+     * Whether this device allows only the HotwordDetectionService to use OP_RECORD_AUDIO_HOTWORD
+     * which doesn't incur the privacy indicator.
+     */
+    private final boolean mIsHotwordDetectionServiceRequired;
+
+    /**
      * The locking policy around the location tags is a bit special. Since we want to
      * avoid grabbing the lock on every op note we are taking the approach where the
      * read and write are being done via a thread-safe data structure such that the
@@ -114,6 +120,8 @@
         mRoleManager = mContext.getSystemService(RoleManager.class);
         mVoiceInteractionManagerInternal = LocalServices.getService(
                 VoiceInteractionManagerInternal.class);
+        mIsHotwordDetectionServiceRequired = isHotwordDetectionServiceRequired(
+                mContext.getPackageManager());
 
         final LocationManagerInternal locationManagerInternal = LocalServices.getService(
                 LocationManagerInternal.class);
@@ -174,6 +182,12 @@
         initializeActivityRecognizersTags();
     }
 
+    private static boolean isHotwordDetectionServiceRequired(PackageManager pm) {
+        // The HotwordDetectionService APIs aren't ready yet for Auto or TV.
+        return !(pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
+                || pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK));
+    }
+
     @Override
     public int checkOperation(int code, int uid, String packageName,
             @Nullable String attributionTag, boolean raw,
@@ -257,6 +271,7 @@
 
     private int resolveDatasourceOp(int code, int uid, @NonNull String packageName,
             @Nullable String attributionTag) {
+        code = resolveRecordAudioOp(code, uid);
         if (attributionTag == null) {
             return code;
         }
@@ -359,6 +374,24 @@
         return code;
     }
 
+    private int resolveRecordAudioOp(int code, int uid) {
+        if (code == AppOpsManager.OP_RECORD_AUDIO_HOTWORD) {
+            if (!mIsHotwordDetectionServiceRequired) {
+                return code;
+            }
+            // Only the HotwordDetectionService can use the HOTWORD op which doesn't incur the
+            // privacy indicator. Downgrade to standard RECORD_AUDIO for other processes.
+            final HotwordDetectionServiceIdentity hotwordDetectionServiceIdentity =
+                    mVoiceInteractionManagerInternal.getHotwordDetectionServiceIdentity();
+            if (hotwordDetectionServiceIdentity != null
+                    && uid == hotwordDetectionServiceIdentity.getIsolatedUid()) {
+                return code;
+            }
+            return AppOpsManager.OP_RECORD_AUDIO;
+        }
+        return code;
+    }
+
     private int resolveUid(int code, int uid) {
         // The HotwordDetectionService is an isolated service, which ordinarily cannot hold
         // permissions. So we allow it to assume the owning package identity for certain
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index cd0ce2b..dda8961 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -117,6 +117,7 @@
 import android.os.Process;
 import android.os.RemoteException;
 import android.os.ServiceManager;
+import android.os.ServiceSpecificException;
 import android.os.StatFs;
 import android.os.SynchronousResultReceiver;
 import android.os.SystemClock;
@@ -132,6 +133,18 @@
 import android.os.storage.VolumeInfo;
 import android.provider.DeviceConfig;
 import android.provider.Settings;
+import android.security.metrics.IKeystoreMetrics;
+import android.security.metrics.KeyCreationWithAuthInfo;
+import android.security.metrics.KeyCreationWithGeneralInfo;
+import android.security.metrics.KeyCreationWithPurposeAndModesInfo;
+import android.security.metrics.KeyOperationWithGeneralInfo;
+import android.security.metrics.KeyOperationWithPurposeAndModesInfo;
+import android.security.metrics.Keystore2AtomWithOverflow;
+import android.security.metrics.KeystoreAtom;
+import android.security.metrics.KeystoreAtomPayload;
+import android.security.metrics.RkpErrorStats;
+import android.security.metrics.RkpPoolStats;
+import android.security.metrics.StorageStats;
 import android.stats.storage.StorageEnums;
 import android.telephony.ModemActivityInfo;
 import android.telephony.SubscriptionInfo;
@@ -373,6 +386,10 @@
 
     private SelectedProcessCpuThreadReader mSurfaceFlingerProcessCpuThreadReader;
 
+    // Only access via getIKeystoreMetricsService
+    @GuardedBy("mKeystoreLock")
+    private IKeystoreMetrics mIKeystoreMetrics;
+
     // Puller locks
     private final Object mDataBytesTransferLock = new Object();
     private final Object mBluetoothBytesTransferLock = new Object();
@@ -428,6 +445,7 @@
     private final Object mAttributedAppOpsLock = new Object();
     private final Object mSettingsStatsLock = new Object();
     private final Object mInstalledIncrementalPackagesLock = new Object();
+    private final Object mKeystoreLock = new Object();
 
     public StatsPullAtomService(Context context) {
         super(context);
@@ -435,6 +453,7 @@
     }
 
     private native void initializeNativePullers();
+
     /**
      * Use of this StatsPullAtomCallbackImpl means we avoid one class per tagId, which we would
      * get if we used lambdas.
@@ -703,6 +722,16 @@
                         synchronized (mInstalledIncrementalPackagesLock) {
                             return pullInstalledIncrementalPackagesLocked(atomTag, data);
                         }
+                    case FrameworkStatsLog.KEYSTORE2_STORAGE_STATS:
+                    case FrameworkStatsLog.RKP_POOL_STATS:
+                    case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO:
+                    case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO:
+                    case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO:
+                    case FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW:
+                    case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO:
+                    case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO:
+                    case FrameworkStatsLog.RKP_ERROR_STATS:
+                        return pullKeystoreAtoms(atomTag, data);
                     default:
                         throw new UnsupportedOperationException("Unknown tagId=" + atomTag);
                 }
@@ -795,6 +824,8 @@
 
         mSurfaceFlingerProcessCpuThreadReader =
                 new SelectedProcessCpuThreadReader("/system/bin/surfaceflinger");
+
+        getIKeystoreMetricsService();
     }
 
     void registerEventListeners() {
@@ -887,6 +918,15 @@
         registerBatteryCycleCount();
         registerSettingsStats();
         registerInstalledIncrementalPackages();
+        registerKeystoreStorageStats();
+        registerRkpPoolStats();
+        registerKeystoreKeyCreationWithGeneralInfo();
+        registerKeystoreKeyCreationWithAuthInfo();
+        registerKeystoreKeyCreationWithPurposeModesInfo();
+        registerKeystoreAtomWithOverflow();
+        registerKeystoreKeyOperationWithPurposeAndModesInfo();
+        registerKeystoreKeyOperationWithGeneralInfo();
+        registerRkpErrorStats();
     }
 
     private void initAndRegisterNetworkStatsPullers() {
@@ -971,6 +1011,28 @@
         }
     }
 
+    private IKeystoreMetrics getIKeystoreMetricsService() {
+        synchronized (mKeystoreLock) {
+            if (mIKeystoreMetrics == null) {
+                mIKeystoreMetrics = IKeystoreMetrics.Stub.asInterface(
+                        ServiceManager.getService("android.security.metrics"));
+                if (mIKeystoreMetrics != null) {
+                    try {
+                        mIKeystoreMetrics.asBinder().linkToDeath(() -> {
+                            synchronized (mKeystoreLock) {
+                                mIKeystoreMetrics = null;
+                            }
+                        }, /* flags */ 0);
+                    } catch (RemoteException e) {
+                        Slog.e(TAG, "linkToDeath with IKeystoreMetrics failed", e);
+                        mIKeystoreMetrics = null;
+                    }
+                }
+            }
+            return mIKeystoreMetrics;
+        }
+    }
+
     private IStoraged getIStoragedService() {
         synchronized (mStoragedLock) {
             if (mStorageService == null) {
@@ -4005,6 +4067,253 @@
         return StatsManager.PULL_SUCCESS;
     }
 
+    private void registerKeystoreStorageStats() {
+        mStatsManager.setPullAtomCallback(
+                FrameworkStatsLog.KEYSTORE2_STORAGE_STATS,
+                null, // use default PullAtomMetadata values,
+                DIRECT_EXECUTOR,
+                mStatsCallbackImpl);
+    }
+
+    private void registerRkpPoolStats() {
+        mStatsManager.setPullAtomCallback(
+                FrameworkStatsLog.RKP_POOL_STATS,
+                null, // use default PullAtomMetadata values,
+                DIRECT_EXECUTOR,
+                mStatsCallbackImpl);
+    }
+
+    private void registerKeystoreKeyCreationWithGeneralInfo() {
+        mStatsManager.setPullAtomCallback(
+                FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO,
+                null, // use default PullAtomMetadata values,
+                DIRECT_EXECUTOR,
+                mStatsCallbackImpl);
+    }
+
+    private void registerKeystoreKeyCreationWithAuthInfo() {
+        mStatsManager.setPullAtomCallback(
+                FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO,
+                null, // use default PullAtomMetadata values,
+                DIRECT_EXECUTOR,
+                mStatsCallbackImpl);
+    }
+
+    private void registerKeystoreKeyCreationWithPurposeModesInfo() {
+        mStatsManager.setPullAtomCallback(
+                FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO,
+                null, // use default PullAtomMetadata values,
+                DIRECT_EXECUTOR,
+                mStatsCallbackImpl);
+    }
+
+    private void registerKeystoreAtomWithOverflow() {
+        mStatsManager.setPullAtomCallback(
+                FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW,
+                null, // use default PullAtomMetadata values,
+                DIRECT_EXECUTOR,
+                mStatsCallbackImpl);
+    }
+
+    private void registerKeystoreKeyOperationWithPurposeAndModesInfo() {
+        mStatsManager.setPullAtomCallback(
+                FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO,
+                null, // use default PullAtomMetadata values,
+                DIRECT_EXECUTOR,
+                mStatsCallbackImpl);
+    }
+
+    private void registerKeystoreKeyOperationWithGeneralInfo() {
+        mStatsManager.setPullAtomCallback(
+                FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO,
+                null, // use default PullAtomMetadata values,
+                DIRECT_EXECUTOR,
+                mStatsCallbackImpl);
+    }
+
+    private void registerRkpErrorStats() {
+        mStatsManager.setPullAtomCallback(
+                FrameworkStatsLog.RKP_ERROR_STATS,
+                null, // use default PullAtomMetadata values,
+                DIRECT_EXECUTOR,
+                mStatsCallbackImpl);
+    }
+
+    int parseKeystoreStorageStats(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
+        for (KeystoreAtom atomWrapper : atoms) {
+            if (atomWrapper.payload.getTag() != KeystoreAtomPayload.storageStats) {
+                return StatsManager.PULL_SKIP;
+            }
+            StorageStats atom = atomWrapper.payload.getStorageStats();
+            pulledData.add(FrameworkStatsLog.buildStatsEvent(
+                    FrameworkStatsLog.KEYSTORE2_STORAGE_STATS, atom.storage_type,
+                    atom.size, atom.unused_size));
+        }
+        return StatsManager.PULL_SUCCESS;
+    }
+
+    int parseRkpPoolStats(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
+        for (KeystoreAtom atomWrapper : atoms) {
+            if (atomWrapper.payload.getTag() != KeystoreAtomPayload.rkpPoolStats) {
+                return StatsManager.PULL_SKIP;
+            }
+            RkpPoolStats atom = atomWrapper.payload.getRkpPoolStats();
+            pulledData.add(FrameworkStatsLog.buildStatsEvent(
+                    FrameworkStatsLog.RKP_POOL_STATS, atom.pool_status, atom.count_of_keys));
+        }
+        return StatsManager.PULL_SUCCESS;
+    }
+
+    int parseKeystoreKeyCreationWithGeneralInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
+        for (KeystoreAtom atomWrapper : atoms) {
+            if (atomWrapper.payload.getTag()
+                    != KeystoreAtomPayload.keyCreationWithGeneralInfo) {
+                return StatsManager.PULL_SKIP;
+            }
+            KeyCreationWithGeneralInfo atom = atomWrapper.payload.getKeyCreationWithGeneralInfo();
+            pulledData.add(FrameworkStatsLog.buildStatsEvent(
+                    FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO, atom.algorithm,
+                    atom.key_size, atom.ec_curve, atom.key_origin, atom.error_code,
+                    atom.attestation_requested, atomWrapper.count));
+        }
+        return StatsManager.PULL_SUCCESS;
+    }
+
+    int parseKeystoreKeyCreationWithAuthInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
+        for (KeystoreAtom atomWrapper : atoms) {
+            if (atomWrapper.payload.getTag() != KeystoreAtomPayload.keyCreationWithAuthInfo) {
+                return StatsManager.PULL_SKIP;
+            }
+            KeyCreationWithAuthInfo atom = atomWrapper.payload.getKeyCreationWithAuthInfo();
+            pulledData.add(FrameworkStatsLog.buildStatsEvent(
+                    FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO, atom.user_auth_type,
+                    atom.log10_auth_key_timeout_seconds, atom.security_level, atomWrapper.count));
+        }
+        return StatsManager.PULL_SUCCESS;
+    }
+
+
+    int parseKeystoreKeyCreationWithPurposeModesInfo(KeystoreAtom[] atoms,
+            List<StatsEvent> pulledData) {
+        for (KeystoreAtom atomWrapper : atoms) {
+            if (atomWrapper.payload.getTag()
+                    != KeystoreAtomPayload.keyCreationWithPurposeAndModesInfo) {
+                return StatsManager.PULL_SKIP;
+            }
+            KeyCreationWithPurposeAndModesInfo atom =
+                    atomWrapper.payload.getKeyCreationWithPurposeAndModesInfo();
+            pulledData.add(FrameworkStatsLog.buildStatsEvent(
+                    FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO,
+                    atom.algorithm, atom.purpose_bitmap,
+                    atom.padding_mode_bitmap, atom.digest_bitmap, atom.block_mode_bitmap,
+                    atomWrapper.count));
+        }
+        return StatsManager.PULL_SUCCESS;
+    }
+
+    int parseKeystoreAtomWithOverflow(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
+        for (KeystoreAtom atomWrapper : atoms) {
+            if (atomWrapper.payload.getTag()
+                    != KeystoreAtomPayload.keystore2AtomWithOverflow) {
+                return StatsManager.PULL_SKIP;
+            }
+            Keystore2AtomWithOverflow atom = atomWrapper.payload.getKeystore2AtomWithOverflow();
+            pulledData.add(FrameworkStatsLog.buildStatsEvent(
+                    FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW, atom.atom_id,
+                    atomWrapper.count));
+        }
+        return StatsManager.PULL_SUCCESS;
+    }
+
+    int parseKeystoreKeyOperationWithPurposeModesInfo(KeystoreAtom[] atoms,
+            List<StatsEvent> pulledData) {
+        for (KeystoreAtom atomWrapper : atoms) {
+            if (atomWrapper.payload.getTag()
+                    != KeystoreAtomPayload.keyOperationWithPurposeAndModesInfo) {
+                return StatsManager.PULL_SKIP;
+            }
+            KeyOperationWithPurposeAndModesInfo atom =
+                    atomWrapper.payload.getKeyOperationWithPurposeAndModesInfo();
+            pulledData.add(FrameworkStatsLog.buildStatsEvent(
+                    FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO,
+                    atom.purpose, atom.padding_mode_bitmap, atom.digest_bitmap,
+                    atom.block_mode_bitmap, atomWrapper.count));
+        }
+        return StatsManager.PULL_SUCCESS;
+    }
+
+    int parseKeystoreKeyOperationWithGeneralInfo(KeystoreAtom[] atoms,
+            List<StatsEvent> pulledData) {
+        for (KeystoreAtom atomWrapper : atoms) {
+            if (atomWrapper.payload.getTag()
+                    != KeystoreAtomPayload.keyOperationWithGeneralInfo) {
+                return StatsManager.PULL_SKIP;
+            }
+            KeyOperationWithGeneralInfo atom = atomWrapper.payload.getKeyOperationWithGeneralInfo();
+            pulledData.add(FrameworkStatsLog.buildStatsEvent(
+                    FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO, atom.outcome,
+                    atom.error_code, atom.key_upgraded, atom.security_level, atomWrapper.count));
+        }
+        return StatsManager.PULL_SUCCESS;
+    }
+
+    int parseRkpErrorStats(KeystoreAtom[] atoms,
+            List<StatsEvent> pulledData) {
+        for (KeystoreAtom atomWrapper : atoms) {
+            if (atomWrapper.payload.getTag() != KeystoreAtomPayload.rkpErrorStats) {
+                return StatsManager.PULL_SKIP;
+            }
+            RkpErrorStats atom = atomWrapper.payload.getRkpErrorStats();
+            pulledData.add(FrameworkStatsLog.buildStatsEvent(
+                    FrameworkStatsLog.RKP_ERROR_STATS, atom.rkpError, atomWrapper.count));
+        }
+        return StatsManager.PULL_SUCCESS;
+    }
+
+    int pullKeystoreAtoms(int atomTag, List<StatsEvent> pulledData) {
+        IKeystoreMetrics keystoreMetricsService = getIKeystoreMetricsService();
+        if (keystoreMetricsService == null) {
+            Slog.w(TAG, "Keystore service is null");
+            return StatsManager.PULL_SKIP;
+        }
+        final long callingToken = Binder.clearCallingIdentity();
+        try {
+            KeystoreAtom[] atoms = keystoreMetricsService.pullMetrics(atomTag);
+            switch (atomTag) {
+                case FrameworkStatsLog.KEYSTORE2_STORAGE_STATS:
+                    return parseKeystoreStorageStats(atoms, pulledData);
+                case FrameworkStatsLog.RKP_POOL_STATS:
+                    return parseRkpPoolStats(atoms, pulledData);
+                case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO:
+                    return parseKeystoreKeyCreationWithGeneralInfo(atoms, pulledData);
+                case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO:
+                    return parseKeystoreKeyCreationWithAuthInfo(atoms, pulledData);
+                case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO:
+                    return parseKeystoreKeyCreationWithPurposeModesInfo(atoms, pulledData);
+                case FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW:
+                    return parseKeystoreAtomWithOverflow(atoms, pulledData);
+                case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO:
+                    return parseKeystoreKeyOperationWithPurposeModesInfo(atoms, pulledData);
+                case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO:
+                    return parseKeystoreKeyOperationWithGeneralInfo(atoms, pulledData);
+                case FrameworkStatsLog.RKP_ERROR_STATS:
+                    return parseRkpErrorStats(atoms, pulledData);
+                default:
+                    Slog.w(TAG, "Unsupported keystore atom: " + atomTag);
+                    return StatsManager.PULL_SKIP;
+            }
+        } catch (RemoteException e) {
+            // Should not happen.
+            Slog.e(TAG, "Disconnected from keystore service. Cannot pull.", e);
+            return StatsManager.PULL_SKIP;
+        } catch (ServiceSpecificException e) {
+            Slog.e(TAG, "pulling keystore metrics failed", e);
+            return StatsManager.PULL_SKIP;
+        } finally {
+            Binder.restoreCallingIdentity(callingToken);
+        }
+    }
+
     // Thermal event received from vendor thermal management subsystem
     private static final class ThermalEventListener extends IThermalEventListener.Stub {
         @Override
diff --git a/services/core/java/com/android/server/timedetector/ServerFlags.java b/services/core/java/com/android/server/timedetector/ServerFlags.java
index 7145f5e..fe977f8 100644
--- a/services/core/java/com/android/server/timedetector/ServerFlags.java
+++ b/services/core/java/com/android/server/timedetector/ServerFlags.java
@@ -50,10 +50,6 @@
     /**
      * An annotation used to indicate when a {@link DeviceConfig#NAMESPACE_SYSTEM_TIME} key is
      * required.
-     *
-     * <p>Note that the com.android.geotz module deployment of the Offline LocationTimeZoneProvider
-     * also shares the {@link DeviceConfig#NAMESPACE_SYSTEM_TIME}, and uses the
-     * prefix "geotz_" on all of its key strings.
      */
     @StringDef(prefix = "KEY_", value = {
             KEY_LOCATION_TIME_ZONE_DETECTION_FEATURE_SUPPORTED,
diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java
index 7257478..b6f2f24 100644
--- a/services/core/java/com/android/server/wm/ActivityStartController.java
+++ b/services/core/java/com/android/server/wm/ActivityStartController.java
@@ -16,6 +16,7 @@
 
 package com.android.server.wm;
 
+import static android.app.ActivityManager.START_CANCELED;
 import static android.app.ActivityManager.START_SUCCESS;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
@@ -390,15 +391,18 @@
                         0 /* startFlags */, null /* profilerInfo */, userId, filterCallingUid);
                 aInfo = mService.mAmInternal.getActivityInfoForUser(aInfo, userId);
 
-                // Carefully collect grants without holding lock
                 if (aInfo != null) {
-                    intentGrants = mSupervisor.mService.mUgmInternal
-                            .checkGrantUriPermissionFromIntent(intent, filterCallingUid,
-                                    aInfo.applicationInfo.packageName,
-                                    UserHandle.getUserId(aInfo.applicationInfo.uid));
-                }
+                    try {
+                        // Carefully collect grants without holding lock
+                        intentGrants = mSupervisor.mService.mUgmInternal
+                                .checkGrantUriPermissionFromIntent(intent, filterCallingUid,
+                                        aInfo.applicationInfo.packageName,
+                                        UserHandle.getUserId(aInfo.applicationInfo.uid));
+                    } catch (SecurityException e) {
+                        Slog.d(TAG, "Not allowed to start activity since no uri permission.");
+                        return START_CANCELED;
+                    }
 
-                if (aInfo != null) {
                     if ((aInfo.applicationInfo.privateFlags
                             & ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0) {
                         throw new IllegalArgumentException(
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 569c11b..899266d 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -2633,10 +2633,11 @@
                 }
                 final ActivityInfo ainfo = AppGlobals.getPackageManager().getActivityInfo(comp,
                         STOCK_PM_FLAGS, UserHandle.getUserId(callingUid));
-                if (ainfo.applicationInfo.uid != callingUid) {
-                    throw new SecurityException(
-                            "Can't add task for another application: target uid="
-                                    + ainfo.applicationInfo.uid + ", calling uid=" + callingUid);
+                if (ainfo == null || ainfo.applicationInfo.uid != callingUid) {
+                    Slog.e(TAG, "Can't add task for another application: target uid="
+                            + (ainfo == null ? Process.INVALID_UID : ainfo.applicationInfo.uid)
+                            + ", calling uid=" + callingUid);
+                    return INVALID_TASK_ID;
                 }
 
                 final Task rootTask = r.getRootTask();
@@ -4158,21 +4159,21 @@
 
     /**
      * Update the asset configuration and increase the assets sequence number.
-     * @param processes the processes that needs to update the asset configuration
+     * @param processes the processes that needs to update the asset configuration, if none
+     *                  updates the global configuration for all processes.
      */
-    public void updateAssetConfiguration(List<WindowProcessController> processes,
-            boolean updateFrameworkRes) {
+    public void updateAssetConfiguration(List<WindowProcessController> processes) {
         synchronized (mGlobalLock) {
             final int assetSeq = increaseAssetConfigurationSeq();
 
-            if (updateFrameworkRes) {
+            // Update the global configuration if the no target processes
+            if (processes == null) {
                 Configuration newConfig = new Configuration();
                 newConfig.assetsSeq = assetSeq;
                 updateConfiguration(newConfig);
+                return;
             }
 
-            // Always update the override of every process so the asset sequence of the process is
-            // always greater than or equal to the global configuration.
             for (int i = processes.size() - 1; i >= 0; i--) {
                 final WindowProcessController wpc = processes.get(i);
                 wpc.updateAssetConfiguration(assetSeq);
diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java
index 4acadb2..3dea686 100644
--- a/services/core/java/com/android/server/wm/AppTransitionController.java
+++ b/services/core/java/com/android/server/wm/AppTransitionController.java
@@ -412,7 +412,13 @@
                 return TRANSIT_OLD_TASK_CLOSE;
             }
             if (isActivityClosing) {
-                return TRANSIT_OLD_ACTIVITY_CLOSE;
+                for (int i = closingApps.size() - 1; i >= 0; i--) {
+                    if (closingApps.valueAt(i).visibleIgnoringKeyguard) {
+                        return TRANSIT_OLD_ACTIVITY_CLOSE;
+                    }
+                }
+                // Skip close activity transition since no closing app can be visible
+                return WindowManager.TRANSIT_OLD_UNSET;
             }
         }
         if (appTransition.containsTransitRequest(TRANSIT_RELAUNCH)
diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java
index b24ab93..baa27e3 100644
--- a/services/core/java/com/android/server/wm/DisplayArea.java
+++ b/services/core/java/com/android/server/wm/DisplayArea.java
@@ -551,7 +551,13 @@
             }
             final WindowManagerPolicy policy = mWmService.mPolicy;
             if (policy.isKeyguardHostWindow(w.mAttrs)) {
-                if (mWmService.mKeyguardGoingAway) {
+                // Ignore the orientation of keyguard if it is going away or is not showing while
+                // the device is fully awake. In other words, use the orientation of keyguard if
+                // its window is visible while the device is going to sleep or is sleeping.
+                if (!mWmService.mAtmService.isKeyguardLocked()
+                        && mDisplayContent.getDisplayPolicy().isAwake()
+                        // Device is not going to sleep.
+                        && policy.okToAnimate(true /* ignoreScreenOn */)) {
                     return false;
                 }
                 // Consider unoccluding only when all unknown visibilities have been
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 3dbc517..62d8ace 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -1564,12 +1564,6 @@
                 // window was transferred ({@link #mSkipAppTransitionAnimation}).
                 return false;
             }
-            if ((mAppTransition.getTransitFlags()
-                    & WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION) != 0) {
-                // The transition may be finished before keyguard hidden. In order to avoid the
-                // intermediate orientation change, it is more stable to freeze the display.
-                return false;
-            }
             if (r.isState(RESUMED) && !r.getRootTask().mInResumeTopActivity) {
                 // If the activity is executing or has done the lifecycle callback, use normal
                 // rotation animation so the display info can be updated immediately (see
diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java
index f8238c1..3208ae3 100644
--- a/services/core/java/com/android/server/wm/KeyguardController.java
+++ b/services/core/java/com/android/server/wm/KeyguardController.java
@@ -72,7 +72,6 @@
     private boolean mAodShowing;
     private boolean mKeyguardGoingAway;
     private boolean mDismissalRequested;
-    private int mBeforeUnoccludeTransit;
     private final SparseArray<KeyguardDisplayState> mDisplayStates = new SparseArray<>();
     private final ActivityTaskManagerService mService;
     private RootWindowContainer mRootWindowContainer;
@@ -191,14 +190,11 @@
             // Irrelevant to AOD.
             dismissMultiWindowModeForTaskIfNeeded(null /* currentTaskControllsingOcclusion */,
                     false /* turningScreenOn */);
-            setKeyguardGoingAway(false);
+            mKeyguardGoingAway = false;
             if (keyguardShowing) {
                 mDismissalRequested = false;
             }
         }
-        // TODO(b/113840485): Check usage for non-default display
-        mWindowManager.setKeyguardOrAodShowingOnDefaultDisplay(
-                isKeyguardOrAodShowing(DEFAULT_DISPLAY));
 
         // Update the sleep token first such that ensureActivitiesVisible has correct sleep token
         // state when evaluating visibilities.
@@ -219,8 +215,8 @@
         }
         Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "keyguardGoingAway");
         mService.deferWindowLayout();
+        mKeyguardGoingAway = true;
         try {
-            setKeyguardGoingAway(true);
             EventLogTags.writeWmSetKeyguardShown(
                     1 /* keyguardShowing */,
                     mAodShowing ? 1 : 0,
@@ -258,11 +254,6 @@
         mWindowManager.dismissKeyguard(callback, message);
     }
 
-    private void setKeyguardGoingAway(boolean keyguardGoingAway) {
-        mKeyguardGoingAway = keyguardGoingAway;
-        mWindowManager.setKeyguardGoingAway(keyguardGoingAway);
-    }
-
     private void failCallback(IKeyguardDismissCallback callback) {
         try {
             callback.onDismissError();
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index 0000f95..e743710 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -644,7 +644,7 @@
 
     /** Called when the device is going to sleep (e.g. screen off, AOD without screen off). */
     void snapshotForSleeping(int displayId) {
-        if (shouldDisableSnapshots()) {
+        if (shouldDisableSnapshots() || !mService.mDisplayEnabled) {
             return;
         }
         final DisplayContent displayContent = mService.mRoot.getDisplayContent(displayId);
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 147260b..1075806 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -483,10 +483,7 @@
     private final DisplayAreaPolicy.Provider mDisplayAreaPolicyProvider;
 
     final private KeyguardDisableHandler mKeyguardDisableHandler;
-    // TODO: eventually unify all keyguard state in a common place instead of having it spread over
-    // AM's KeyguardController and the policy's KeyguardServiceDelegate.
-    boolean mKeyguardGoingAway;
-    boolean mKeyguardOrAodShowingOnDefaultDisplay;
+
     // VR Vr2d Display Id.
     int mVr2dDisplayId = INVALID_DISPLAY;
     boolean mVrModeEnabled = false;
@@ -3072,17 +3069,6 @@
         mAtmInternal.notifyKeyguardFlagsChanged(callback, displayId);
     }
 
-    public void setKeyguardGoingAway(boolean keyguardGoingAway) {
-        synchronized (mGlobalLock) {
-            mKeyguardGoingAway = keyguardGoingAway;
-        }
-    }
-
-    public void setKeyguardOrAodShowingOnDefaultDisplay(boolean showing) {
-        synchronized (mGlobalLock) {
-            mKeyguardOrAodShowingOnDefaultDisplay = showing;
-        }
-    }
 
     // -------------------------------------------------------------
     // Misc IWindowSession methods
diff --git a/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp b/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
index f439777..7513512 100644
--- a/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
+++ b/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
@@ -133,8 +133,12 @@
 
 static int waitForDataOrSignal(int fd, int event_fd) {
     struct pollfd pfds[2] = {{fd, POLLIN, 0}, {event_fd, POLLIN, 0}};
-    // Wait indefinitely until either data is ready or stop signal is received
+    // Wait until either data is ready or stop signal is received
     int res = poll(pfds, 2, PollTimeoutMs);
+    if (res == -1 && errno == EINTR) {
+        // Treat it the same as timeout and allow the caller to retry.
+        return 0;
+    }
     if (res <= 0) {
         return res;
     }
diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp
index 757c9de..0e96567 100644
--- a/services/incremental/IncrementalService.cpp
+++ b/services/incremental/IncrementalService.cpp
@@ -91,7 +91,7 @@
     static constexpr auto readLogsMaxInterval = 2h;
 
     // How long should we wait till dataLoader reports destroyed.
-    static constexpr auto destroyTimeout = 60s;
+    static constexpr auto destroyTimeout = 10s;
 
     static constexpr auto anyStatus = INT_MIN;
 };
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/BootTest.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/BootTest.kt
new file mode 100644
index 0000000..7fb4907
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/BootTest.kt
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2021 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.pm.test
+
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner
+import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test
+import com.google.common.truth.Truth
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.TemporaryFolder
+import org.junit.runner.RunWith
+
+@RunWith(DeviceJUnit4ClassRunner::class)
+class BootTest : BaseHostJUnit4Test() {
+    companion object {
+        private const val TEST_PKG_NAME = "com.android.server.pm.test.test_app"
+        private const val TEST_APK_NAME = "PackageManagerTestAppStub.apk"
+    }
+
+    @Rule
+    @JvmField
+    val tempFolder = TemporaryFolder()
+
+    @Before
+    fun installApk() {
+        val testApkFile = HostUtils.copyResourceToHostFile(TEST_APK_NAME, tempFolder.newFile())
+        device.installPackage(testApkFile, true)
+    }
+
+    @After
+    fun removeApk() {
+        device.uninstallPackage(TEST_PKG_NAME)
+    }
+
+    @Test
+    fun testUninstallPackageWithKeepDataAndReboot() {
+        Truth.assertThat(isPackageInstalled(TEST_PKG_NAME)).isTrue()
+        uninstallPackageWithKeepData(TEST_PKG_NAME)
+        Truth.assertThat(isPackageInstalled(TEST_PKG_NAME)).isFalse()
+        device.rebootUntilOnline()
+        waitForBootCompleted()
+    }
+
+    private fun uninstallPackageWithKeepData(packageName: String) {
+        device.executeShellCommand("pm uninstall -k $packageName")
+    }
+
+    private fun waitForBootCompleted() {
+        for (i in 0 until 45) {
+            if (isBootCompleted()) {
+                return
+            }
+            Thread.sleep(1000)
+        }
+        throw AssertionError("System failed to become ready!")
+    }
+
+    private fun isBootCompleted(): Boolean {
+        return "1" == device.executeShellCommand("getprop sys.boot_completed").trim()
+    }
+}
\ No newline at end of file
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt
index 46120af..45e0d09 100644
--- a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt
@@ -281,7 +281,7 @@
         assertState(
                 primaryInstalled = false, primaryEnabled = true,
                 secondaryInstalled = true, secondaryEnabled = true,
-                codePaths = listOf(CodePath.DIFFERENT, CodePath.SYSTEM)
+                codePaths = listOf(CodePath.SAME, CodePath.SYSTEM)
         )
 
         uninstall(User.SECONDARY)
@@ -289,7 +289,7 @@
         assertState(
                 primaryInstalled = false, primaryEnabled = true,
                 secondaryInstalled = false, secondaryEnabled = true,
-                codePaths = listOf(CodePath.DIFFERENT, CodePath.SYSTEM)
+                codePaths = listOf(CodePath.SAME, CodePath.SYSTEM)
         )
 
         installExisting(User.PRIMARY)
@@ -311,20 +311,20 @@
 
     @Test
     fun uninstallSecondaryFirstByUserAndInstallExistingSecondaryFirst() {
+        uninstall(User.SECONDARY)
+
+        assertState(
+                primaryInstalled = true, primaryEnabled = true,
+                secondaryInstalled = false, secondaryEnabled = true,
+                codePaths = listOf(CodePath.SAME, CodePath.SYSTEM)
+        )
+
         uninstall(User.PRIMARY)
 
         assertState(
                 primaryInstalled = false, primaryEnabled = true,
-                secondaryInstalled = true, secondaryEnabled = true,
-                codePaths = listOf(CodePath.DIFFERENT, CodePath.SYSTEM)
-        )
-
-        uninstall(User.SECONDARY)
-
-        assertState(
-                primaryInstalled = false, primaryEnabled = true,
                 secondaryInstalled = false, secondaryEnabled = true,
-                codePaths = listOf(CodePath.DIFFERENT, CodePath.SYSTEM)
+                codePaths = listOf(CodePath.SAME, CodePath.SYSTEM)
         )
 
         installExisting(User.SECONDARY)
@@ -348,15 +348,14 @@
     fun uninstallUpdatesAndEnablePrimaryFirst() {
         device.executeShellCommand("pm uninstall-system-updates $TEST_PKG_NAME")
 
-        // Uninstall-system-updates always disables system user 0
-        // TODO: Is this intentional? There is no user argument for this command.
         assertState(
-                primaryInstalled = true, primaryEnabled = false,
+                primaryInstalled = true, primaryEnabled = true,
                 secondaryInstalled = true, secondaryEnabled = true,
                 // If any user is enabled when uninstalling updates, /data is re-uncompressed
                 codePaths = listOf(CodePath.DIFFERENT, CodePath.SYSTEM)
         )
 
+        toggleEnabled(false, User.PRIMARY)
         toggleEnabled(true, User.PRIMARY)
 
         assertState(
@@ -379,14 +378,15 @@
     fun uninstallUpdatesAndEnableSecondaryFirst() {
         device.executeShellCommand("pm uninstall-system-updates $TEST_PKG_NAME")
 
-        // Uninstall-system-updates always disables system user 0
         assertState(
-                primaryInstalled = true, primaryEnabled = false,
+                primaryInstalled = true, primaryEnabled = true,
                 secondaryInstalled = true, secondaryEnabled = true,
                 // If any user is enabled when uninstalling updates, /data is re-uncompressed
                 codePaths = listOf(CodePath.DIFFERENT, CodePath.SYSTEM)
         )
 
+        toggleEnabled(false, User.PRIMARY)
+
         toggleEnabled(true, User.SECONDARY)
 
         assertState(
@@ -417,6 +417,7 @@
                 codePaths = listOf(CodePath.SYSTEM)
         )
 
+        toggleEnabled(false, User.PRIMARY)
         toggleEnabled(true, User.PRIMARY)
 
         assertState(
@@ -447,6 +448,7 @@
                 codePaths = listOf(CodePath.SYSTEM)
         )
 
+        toggleEnabled(false, User.PRIMARY)
         toggleEnabled(true, User.SECONDARY)
 
         assertState(
@@ -471,13 +473,13 @@
 
         device.executeShellCommand("pm uninstall-system-updates $TEST_PKG_NAME")
 
-        // Uninstall-system-updates always disables system user 0
         assertState(
-                primaryInstalled = false, primaryEnabled = false,
+                primaryInstalled = false, primaryEnabled = true,
                 secondaryInstalled = false, secondaryEnabled = true,
                 codePaths = listOf(CodePath.SYSTEM)
         )
 
+        toggleEnabled(false, User.PRIMARY)
         toggleEnabled(true, User.PRIMARY)
 
         assertState(
@@ -502,9 +504,8 @@
 
         device.executeShellCommand("pm uninstall-system-updates $TEST_PKG_NAME")
 
-        // Uninstall-system-updates always disables system user 0
         assertState(
-                primaryInstalled = false, primaryEnabled = false,
+                primaryInstalled = false, primaryEnabled = true,
                 secondaryInstalled = false, secondaryEnabled = true,
                 codePaths = listOf(CodePath.SYSTEM)
         )
@@ -512,7 +513,7 @@
         toggleEnabled(true, User.SECONDARY)
 
         assertState(
-                primaryInstalled = false, primaryEnabled = false,
+                primaryInstalled = false, primaryEnabled = true,
                 secondaryInstalled = false, secondaryEnabled = true,
                 codePaths = listOf(CodePath.DIFFERENT, CodePath.SYSTEM)
         )
@@ -582,22 +583,24 @@
         codePaths: List<CodePath>
     ) {
         HostUtils.getUserIdToPkgInstalledState(device, TEST_PKG_NAME)
-                .forEach { (userId, installed) ->
-                    if (userId == 0) {
-                        assertThat(installed).isEqualTo(primaryInstalled)
-                    } else {
-                        assertThat(installed).isEqualTo(secondaryInstalled)
-                    }
+            .also { assertThat(it.size).isAtLeast(USER_COUNT) }
+            .forEach { (userId, installed) ->
+                if (userId == 0) {
+                    assertThat(installed).isEqualTo(primaryInstalled)
+                } else {
+                    assertThat(installed).isEqualTo(secondaryInstalled)
                 }
+            }
 
         HostUtils.getUserIdToPkgEnabledState(device, TEST_PKG_NAME)
-                .forEach { (userId, enabled) ->
-                    if (userId == 0) {
-                        assertThat(enabled).isEqualTo(primaryEnabled)
-                    } else {
-                        assertThat(enabled).isEqualTo(secondaryEnabled)
-                    }
+            .also { assertThat(it.size).isAtLeast(USER_COUNT) }
+            .forEach { (userId, enabled) ->
+                if (userId == 0) {
+                    assertThat(enabled).isEqualTo(primaryEnabled)
+                } else {
+                    assertThat(enabled).isEqualTo(secondaryEnabled)
                 }
+            }
 
         assertCodePaths(codePaths.first(), codePaths.getOrNull(1))
     }
diff --git a/services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java b/services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java
index 624e7dd..607fb47 100644
--- a/services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java
@@ -1003,8 +1003,6 @@
         verify(l, times(0)).updateAllJobs();
         verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
         verify(l, times(1)).updateJobsForUidPackage(eq(UID_10_2), eq(PACKAGE_2), anyBoolean());
-        verify(l, times(1)).updateForceAppStandbyForUidPackage(eq(UID_10_2), eq(PACKAGE_2),
-                eq(true));
 
         verify(l, times(0)).updateAllAlarms();
         verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1019,8 +1017,6 @@
         verify(l, times(0)).updateAllJobs();
         verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
         verify(l, times(1)).updateJobsForUidPackage(eq(UID_10_2), eq(PACKAGE_2), anyBoolean());
-        verify(l, times(1)).updateForceAppStandbyForUidPackage(eq(UID_10_2), eq(PACKAGE_2),
-                eq(false));
 
         verify(l, times(0)).updateAllAlarms();
         verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1034,7 +1030,6 @@
         verify(l, times(0)).updateAllJobs();
         verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(0)).updateAllAlarms();
         verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1052,8 +1047,6 @@
         verify(l, times(1)).updateAllJobs();
         verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
         verify(l, times(1)).updateJobsForUidPackage(eq(UID_10_2), eq(PACKAGE_2), anyBoolean());
-        verify(l, times(1)).updateForceAppStandbyForUidPackage(eq(UID_10_2), eq(PACKAGE_2),
-                eq(true));
 
         verify(l, times(1)).updateAllAlarms();
         verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1070,7 +1063,6 @@
         verify(l, times(1)).updateAllJobs();
         verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(1)).updateAllAlarms();
         verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1089,7 +1081,6 @@
         verify(l, times(1)).updateAllJobs();
         verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(1)).updateAllAlarms();
         verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1104,7 +1095,6 @@
         verify(l, times(1)).updateAllJobs();
         verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(1)).updateAllAlarms();
         verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1121,7 +1111,6 @@
         verify(l, times(1)).updateAllJobs();
         verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(0)).updateAllAlarms();
         verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1137,7 +1126,6 @@
         verify(l, times(1)).updateAllJobs();
         verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(0)).updateAllAlarms();
         verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1154,7 +1142,6 @@
         verify(l, times(1)).updateAllJobs();
         verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(1)).updateAllAlarms();
         verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1171,7 +1158,6 @@
         verify(l, times(2)).updateAllJobs();
         verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(1)).updateAllAlarms();
         verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1186,7 +1172,6 @@
         verify(l, times(1)).updateAllJobs();
         verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(1)).updateAllAlarms();
         verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1203,7 +1188,6 @@
         verify(l, times(1)).updateAllJobs();
         verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(0)).updateAllAlarms();
         verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1219,7 +1203,6 @@
         verify(l, times(1)).updateAllJobs();
         verify(l, times(0)).updateJobsForUid(anyInt(), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(0)).updateAllAlarms();
         verify(l, times(0)).updateAlarmsForUid(anyInt());
@@ -1242,7 +1225,6 @@
         verify(l, times(0)).updateAllJobs();
         verify(l, times(1)).updateJobsForUid(eq(UID_10_1), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(0)).updateAllAlarms();
         verify(l, times(1)).updateAlarmsForUid(eq(UID_10_1));
@@ -1258,7 +1240,6 @@
         verify(l, times(0)).updateAllJobs();
         verify(l, times(1)).updateJobsForUid(eq(UID_10_1), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(0)).updateAllAlarms();
         verify(l, times(1)).updateAlarmsForUid(eq(UID_10_1));
@@ -1274,7 +1255,6 @@
         verify(l, times(0)).updateAllJobs();
         verify(l, times(1)).updateJobsForUid(eq(UID_10_1), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(0)).updateAllAlarms();
         verify(l, times(1)).updateAlarmsForUid(eq(UID_10_1));
@@ -1290,7 +1270,6 @@
         verify(l, times(0)).updateAllJobs();
         verify(l, times(1)).updateJobsForUid(eq(UID_10_1), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(0)).updateAllAlarms();
         verify(l, times(1)).updateAlarmsForUid(eq(UID_10_1));
@@ -1307,7 +1286,6 @@
         verify(l, times(1)).updateAllJobs();
         verify(l, times(0)).updateJobsForUid(eq(UID_10_1), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(1)).updateAllAlarms();
         verify(l, times(0)).updateAlarmsForUid(eq(UID_10_1));
@@ -1323,7 +1301,6 @@
         verify(l, times(0)).updateAllJobs();
         verify(l, times(1)).updateJobsForUid(eq(UID_10_1), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(0)).updateAllAlarms();
         verify(l, times(1)).updateAlarmsForUid(eq(UID_10_1));
@@ -1339,7 +1316,6 @@
         verify(l, times(0)).updateAllJobs();
         verify(l, times(1)).updateJobsForUid(eq(UID_10_1), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(0)).updateAllAlarms();
         verify(l, times(1)).updateAlarmsForUid(eq(UID_10_1));
@@ -1355,7 +1331,6 @@
         verify(l, times(0)).updateAllJobs();
         verify(l, times(1)).updateJobsForUid(eq(UID_10_1), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(0)).updateAllAlarms();
         verify(l, times(1)).updateAlarmsForUid(eq(UID_10_1));
@@ -1371,7 +1346,6 @@
         verify(l, times(0)).updateAllJobs();
         verify(l, times(1)).updateJobsForUid(eq(UID_10_1), anyBoolean());
         verify(l, times(0)).updateJobsForUidPackage(anyInt(), anyString(), anyBoolean());
-        verify(l, times(0)).updateForceAppStandbyForUidPackage(anyInt(), anyString(), anyBoolean());
 
         verify(l, times(0)).updateAllAlarms();
         verify(l, times(1)).updateAlarmsForUid(eq(UID_10_1));
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
index eab1afb..583797e 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
@@ -1910,17 +1910,6 @@
         assertTrue(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
     }
 
-    @Test
-    public void hasScheduleExactAlarmBinderCallChangeDisabled() throws RemoteException {
-        mockChangeEnabled(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION, false);
-
-        mockExactAlarmPermissionGrant(false, true, MODE_DEFAULT);
-        assertTrue(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
-
-        mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
-        assertTrue(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
-    }
-
     private void mockChangeEnabled(long changeId, boolean enabled) {
         doReturn(enabled).when(() -> CompatChanges.isChangeEnabled(eq(changeId), anyString(),
                 any(UserHandle.class)));
@@ -1941,6 +1930,53 @@
     }
 
     @Test
+    public void canScheduleExactAlarmsBinderCallChangeDisabled() throws RemoteException {
+        mockChangeEnabled(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION, false);
+
+        mockExactAlarmPermissionGrant(false, true, MODE_DEFAULT);
+        assertTrue(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+
+        mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
+        assertTrue(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+    }
+
+    @Test
+    public void canScheduleExactAlarmsBinderCall() throws RemoteException {
+        mockChangeEnabled(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION, true);
+
+        // No permission, no exemption.
+        mockExactAlarmPermissionGrant(true, true, MODE_DEFAULT);
+        assertFalse(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+
+        // No permission, no exemption.
+        mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
+        assertFalse(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+
+        // Permission, no exemption.
+        mockExactAlarmPermissionGrant(true, false, MODE_DEFAULT);
+        assertTrue(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+
+        // Permission, no exemption.
+        mockExactAlarmPermissionGrant(true, true, MODE_ALLOWED);
+        assertTrue(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+
+        // No permission, exemption.
+        mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
+        when(mDeviceIdleInternal.isAppOnWhitelist(TEST_CALLING_UID)).thenReturn(true);
+        assertTrue(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+
+        // No permission, exemption.
+        mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
+        when(mDeviceIdleInternal.isAppOnWhitelist(TEST_CALLING_UID)).thenReturn(false);
+        doReturn(true).when(() -> UserHandle.isCore(TEST_CALLING_UID));
+        assertTrue(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+
+        // Both permission and exemption.
+        mockExactAlarmPermissionGrant(true, false, MODE_ALLOWED);
+        assertTrue(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+    }
+
+    @Test
     public void noPermissionCheckWhenChangeDisabled() throws RemoteException {
         mockChangeEnabled(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION, false);
 
@@ -2086,14 +2122,17 @@
 
         final PendingIntent alarmPi = getNewMockPendingIntent();
         final AlarmManager.AlarmClockInfo alarmClock = mock(AlarmManager.AlarmClockInfo.class);
-        try {
-            mBinder.set(TEST_CALLING_PACKAGE, RTC_WAKEUP, 1234, WINDOW_EXACT, 0, 0,
+        mBinder.set(TEST_CALLING_PACKAGE, RTC_WAKEUP, 1234, WINDOW_EXACT, 0, 0,
                     alarmPi, null, null, null, alarmClock);
-            fail("alarm clock binder call succeeded without permission");
-        } catch (SecurityException se) {
-            // Expected.
-        }
-        verify(mDeviceIdleInternal, never()).isAppOnWhitelist(anyInt());
+
+        // Correct permission checks are invoked.
+        verify(mService).hasScheduleExactAlarmInternal(TEST_CALLING_PACKAGE, TEST_CALLING_UID);
+        verify(mDeviceIdleInternal).isAppOnWhitelist(UserHandle.getAppId(TEST_CALLING_UID));
+
+        verify(mService).setImpl(eq(RTC_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
+                eq(alarmPi), isNull(), isNull(), eq(FLAG_STANDALONE | FLAG_WAKE_FROM_IDLE),
+                isNull(), eq(alarmClock), eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE),
+                isNull(), eq(EXACT_ALLOW_REASON_ALLOW_LIST));
     }
 
     @Test
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerTest.java
index e19aa72..4b030d1 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerTest.java
@@ -52,7 +52,6 @@
 import android.support.test.uiautomator.UiDevice;
 import android.test.suitebuilder.annotation.LargeTest;
 import android.text.TextUtils;
-import android.util.KeyValueListParser;
 import android.util.Log;
 
 import androidx.test.InstrumentationRegistry;
@@ -421,142 +420,6 @@
         return false;
     }
 
-    @LargeTest
-    @Test
-    public void testKillAppIfFasCachedIdle() throws Exception {
-        final long shortTimeoutMs = 5_000;
-        final long backgroundSettleMs = 10_000;
-        final PackageManager pm = mContext.getPackageManager();
-        final int uid = pm.getPackageUid(TEST_APP1, 0);
-        final MyUidImportanceListener uidListener1 = new MyUidImportanceListener(uid);
-        final MyUidImportanceListener uidListener2 = new MyUidImportanceListener(uid);
-        SettingsSession<String> amConstantsSettings = null;
-        DeviceConfigSession<Boolean> killForceAppStandByAndCachedIdle = null;
-        final ActivityManager am = mContext.getSystemService(ActivityManager.class);
-        final CountDownLatch[] latchHolder = new CountDownLatch[1];
-        final H handler = new H(Looper.getMainLooper(), latchHolder);
-        final Messenger messenger = new Messenger(handler);
-        try {
-            am.addOnUidImportanceListener(uidListener1,
-                    RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE);
-            am.addOnUidImportanceListener(uidListener2, RunningAppProcessInfo.IMPORTANCE_GONE);
-            toggleScreenOn(true);
-
-            killForceAppStandByAndCachedIdle = new DeviceConfigSession<>(
-                    DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
-                    ActivityManagerConstants.KEY_KILL_FAS_CACHED_IDLE,
-                    DeviceConfig::getBoolean,
-                    ActivityManagerConstants.DEFAULT_KILL_FAS_CACHED_IDLE);
-            killForceAppStandByAndCachedIdle.set(true);
-            amConstantsSettings = new SettingsSession<>(
-                Settings.Global.getUriFor(Settings.Global.ACTIVITY_MANAGER_CONSTANTS),
-                Settings.Global::getString, Settings.Global::putString);
-            final KeyValueListParser parser = new KeyValueListParser(',');
-            long currentBackgroundSettleMs =
-                    ActivityManagerConstants.DEFAULT_BACKGROUND_SETTLE_TIME;
-            try {
-                parser.setString(amConstantsSettings.get());
-                currentBackgroundSettleMs = parser.getLong(
-                        ActivityManagerConstants.KEY_BACKGROUND_SETTLE_TIME,
-                        ActivityManagerConstants.DEFAULT_BACKGROUND_SETTLE_TIME);
-            } catch (IllegalArgumentException e) {
-            }
-            // Drain queue to make sure the existing UID_IDLE_MSG has been processed.
-            Thread.sleep(currentBackgroundSettleMs);
-            amConstantsSettings.set(
-                    ActivityManagerConstants.KEY_BACKGROUND_SETTLE_TIME + "=" + backgroundSettleMs);
-            runShellCommand("cmd appops set " + TEST_APP1 + " RUN_ANY_IN_BACKGROUND allow");
-
-            final Intent intent = new Intent(ACTION_FGS_STATS_TEST);
-            final ComponentName cn = ComponentName.unflattenFromString(
-                    TEST_APP1 + "/" + TEST_FGS_CLASS);
-            final Bundle bundle = new Bundle();
-            intent.setComponent(cn);
-            bundle.putBinder(EXTRA_MESSENGER, messenger.getBinder());
-            intent.putExtras(bundle);
-
-            // Start the FGS.
-            latchHolder[0] = new CountDownLatch(1);
-            mContext.startForegroundService(intent);
-            assertTrue("Timed out to start fg service", uidListener1.waitFor(
-                    RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE, shortTimeoutMs));
-            assertTrue("Timed out to get the remote messenger", latchHolder[0].await(
-                    shortTimeoutMs, TimeUnit.MILLISECONDS));
-            assertFalse("FGS shouldn't be killed", uidListener2.waitFor(
-                    RunningAppProcessInfo.IMPORTANCE_GONE, backgroundSettleMs + shortTimeoutMs));
-
-            // Stop the FGS, it shouldn't be killed because it's not in FAS state.
-            latchHolder[0] = new CountDownLatch(1);
-            handler.sendRemoteMessage(H.MSG_STOP_FOREGROUND, 0, 0, null);
-            assertTrue("Timed out to wait for stop fg", latchHolder[0].await(
-                    shortTimeoutMs, TimeUnit.MILLISECONDS));
-            assertFalse("FGS shouldn't be killed", uidListener2.waitFor(
-                    RunningAppProcessInfo.IMPORTANCE_GONE, backgroundSettleMs + shortTimeoutMs));
-
-            // Set the FAS state.
-            runShellCommand("cmd appops set " + TEST_APP1 + " RUN_ANY_IN_BACKGROUND deny");
-            // Now it should've been killed.
-            assertTrue("Should have been killed", uidListener2.waitFor(
-                    RunningAppProcessInfo.IMPORTANCE_GONE, backgroundSettleMs + shortTimeoutMs));
-
-            // Start the FGS.
-            // Temporarily allow RUN_ANY_IN_BACKGROUND to start FGS.
-            runShellCommand("cmd appops set " + TEST_APP1 + " RUN_ANY_IN_BACKGROUND allow");
-            latchHolder[0] = new CountDownLatch(1);
-            mContext.startForegroundService(intent);
-            assertTrue("Timed out to start fg service", uidListener1.waitFor(
-                    RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE, shortTimeoutMs));
-            assertTrue("Timed out to get the remote messenger", latchHolder[0].await(
-                    shortTimeoutMs, TimeUnit.MILLISECONDS));
-            runShellCommand("cmd appops set " + TEST_APP1 + " RUN_ANY_IN_BACKGROUND deny");
-            // It shouldn't be killed since it's not cached.
-            assertFalse("FGS shouldn't be killed", uidListener2.waitFor(
-                    RunningAppProcessInfo.IMPORTANCE_GONE, backgroundSettleMs + shortTimeoutMs));
-
-            // Stop the FGS, it should get killed because it's cached & uid idle & in FAS state.
-            latchHolder[0] = new CountDownLatch(1);
-            handler.sendRemoteMessage(H.MSG_STOP_FOREGROUND, 0, 0, null);
-            assertTrue("Timed out to wait for stop fg", latchHolder[0].await(
-                    shortTimeoutMs, TimeUnit.MILLISECONDS));
-            assertTrue("Should have been killed", uidListener2.waitFor(
-                    RunningAppProcessInfo.IMPORTANCE_GONE, backgroundSettleMs + shortTimeoutMs));
-
-            // Disable this FAS cached idle kill feature.
-            killForceAppStandByAndCachedIdle.set(false);
-
-            // Start the FGS.
-            // Temporarily allow RUN_ANY_IN_BACKGROUND to start FGS.
-            runShellCommand("cmd appops set " + TEST_APP1 + " RUN_ANY_IN_BACKGROUND allow");
-            latchHolder[0] = new CountDownLatch(1);
-            mContext.startForegroundService(intent);
-            assertTrue("Timed out to start fg service", uidListener1.waitFor(
-                    RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE, shortTimeoutMs));
-            assertTrue("Timed out to get the remote messenger", latchHolder[0].await(
-                    shortTimeoutMs, TimeUnit.MILLISECONDS));
-            runShellCommand("cmd appops set " + TEST_APP1 + " RUN_ANY_IN_BACKGROUND deny");
-            assertFalse("FGS shouldn't be killed", uidListener2.waitFor(
-                    RunningAppProcessInfo.IMPORTANCE_GONE, backgroundSettleMs + shortTimeoutMs));
-
-            // Stop the FGS, it shouldn't be killed because the feature has been turned off.
-            latchHolder[0] = new CountDownLatch(1);
-            handler.sendRemoteMessage(H.MSG_STOP_FOREGROUND, 0, 0, null);
-            assertTrue("Timed out to wait for stop fg", latchHolder[0].await(
-                    shortTimeoutMs, TimeUnit.MILLISECONDS));
-            assertFalse("FGS shouldn't be killed", uidListener2.waitFor(
-                    RunningAppProcessInfo.IMPORTANCE_GONE, backgroundSettleMs + shortTimeoutMs));
-        } finally {
-            runShellCommand("cmd appops set " + TEST_APP1 + " RUN_ANY_IN_BACKGROUND default");
-            if (amConstantsSettings != null) {
-                amConstantsSettings.close();
-            }
-            if (killForceAppStandByAndCachedIdle != null) {
-                killForceAppStandByAndCachedIdle.close();
-            }
-            am.removeOnUidImportanceListener(uidListener1);
-            am.removeOnUidImportanceListener(uidListener2);
-        }
-    }
-
     @Ignore("Need to disable calling uid check in ActivityManagerService.killPids before this test")
     @Test
     public void testKillPids() throws Exception {
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
index 6880302..6502e48 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
@@ -32,9 +32,15 @@
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertTrue;
 
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
 import android.content.Context;
 import android.hardware.hdmi.HdmiControlManager;
 import android.hardware.hdmi.HdmiPortInfo;
+import android.media.AudioManager;
 import android.os.test.TestLooper;
 import android.platform.test.annotations.Presubmit;
 
@@ -45,6 +51,8 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -123,8 +131,12 @@
     private boolean isControlEnabled;
     private int mPowerStatus;
 
+    @Mock
+    private AudioManager mAudioManager;
+
     @Before
     public void SetUp() {
+        MockitoAnnotations.initMocks(this);
 
         Context context = InstrumentationRegistry.getTargetContext();
 
@@ -161,6 +173,11 @@
                     void wakeUp() {
                         mWakeupMessageReceived = true;
                     }
+
+                    @Override
+                    AudioManager getAudioManager() {
+                        return mAudioManager;
+                    }
                 };
         mHdmiControlService.setIoLooper(mTestLooper.getLooper());
         mHdmiControlService.setHdmiCecConfig(new FakeHdmiCecConfig(context));
@@ -419,6 +436,28 @@
     }
 
     @Test
+    public void handleUserControlPressed_muteFunction() {
+        @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
+                HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
+                        HdmiCecKeycode.CEC_KEYCODE_MUTE_FUNCTION));
+
+        assertEquals(result, Constants.HANDLED);
+        verify(mAudioManager, times(1))
+                .adjustStreamVolume(anyInt(), eq(AudioManager.ADJUST_MUTE), anyInt());
+    }
+
+    @Test
+    public void handleUserControlPressed_restoreVolumeFunction() {
+        @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
+                HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
+                        HdmiCecKeycode.CEC_KEYCODE_RESTORE_VOLUME_FUNCTION));
+
+        assertEquals(result, Constants.HANDLED);
+        verify(mAudioManager, times(1))
+                .adjustStreamVolume(anyInt(), eq(AudioManager.ADJUST_UNMUTE), anyInt());
+    }
+
+    @Test
     public void handleVendorCommand_notHandled() {
         HdmiCecMessage vendorCommand = HdmiCecMessageBuilder.buildVendorCommand(ADDR_TV,
                 ADDR_PLAYBACK_1, new byte[]{0});
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java
index 57cf865..c555612 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java
@@ -78,6 +78,24 @@
     }
 
     @Test
+    public void testSkipOccludedActivityCloseTransition() {
+        final ActivityRecord behind = createActivityRecord(mDisplayContent,
+                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+        final ActivityRecord topOpening = createActivityRecord(behind.getTask());
+        topOpening.setOccludesParent(true);
+        topOpening.setVisible(true);
+
+        mDisplayContent.prepareAppTransition(TRANSIT_OPEN);
+        mDisplayContent.prepareAppTransition(TRANSIT_CLOSE);
+        mDisplayContent.mClosingApps.add(behind);
+
+        assertEquals(WindowManager.TRANSIT_OLD_UNSET,
+                AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
+                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
+                        null, null, false));
+    }
+
+    @Test
     @FlakyTest(bugId = 131005232)
     public void testTranslucentOpen() {
         final ActivityRecord behind = createActivityRecord(mDisplayContent,
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index 5bc4c82..d498d46 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -100,7 +100,6 @@
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doCallRealMethod;
 
-import android.annotation.SuppressLint;
 import android.app.ActivityTaskManager;
 import android.app.WindowConfiguration;
 import android.app.servertransaction.FixedRotationAdjustmentsItem;
@@ -792,15 +791,9 @@
     }
 
     @Test
-    @SuppressLint("InlinedApi")
     public void testOrientationDefinedByKeyguard() {
-        final DisplayContent dc = createNewDisplay();
-
-        // When display content is created its configuration is not yet initialized, which could
-        // cause unnecessary configuration propagation, so initialize it here.
-        final Configuration config = new Configuration();
-        dc.computeScreenConfiguration(config);
-        dc.onRequestedOverrideConfigurationChanged(config);
+        final DisplayContent dc = mDisplayContent;
+        dc.getDisplayPolicy().setAwake(true);
 
         // Create a window that requests landscape orientation. It will define device orientation
         // by default.
@@ -815,10 +808,12 @@
                 SCREEN_ORIENTATION_LANDSCAPE, dc.getOrientation());
 
         keyguard.mAttrs.screenOrientation = SCREEN_ORIENTATION_PORTRAIT;
+        mAtm.mKeyguardController.setKeyguardShown(true /* keyguardShowing */,
+                false /* aodShowing */);
         assertEquals("Visible keyguard must influence device orientation",
                 SCREEN_ORIENTATION_PORTRAIT, dc.getOrientation());
 
-        mWm.setKeyguardGoingAway(true);
+        mAtm.mKeyguardController.keyguardGoingAway(0 /* flags */);
         assertEquals("Keyguard that is going away must not influence device orientation",
                 SCREEN_ORIENTATION_LANDSCAPE, dc.getOrientation());
     }
diff --git a/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java
index 20b987d..e169692 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java
@@ -24,9 +24,11 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import android.os.Parcel;
 import android.platform.test.annotations.Presubmit;
 import android.view.Display.Mode;
 import android.view.DisplayInfo;
+import android.view.WindowManager.LayoutParams;
 
 import androidx.test.filters.FlakyTest;
 import androidx.test.filters.SmallTest;
@@ -50,6 +52,16 @@
     private RefreshRatePolicy mPolicy;
     private HighRefreshRateDenylist mDenylist = mock(HighRefreshRateDenylist.class);
 
+    // Parcel and Unparcel the LayoutParams in the window state to test the path the object
+    // travels from the app's process to system server
+    void parcelLayoutParams(WindowState window) {
+        Parcel parcel = Parcel.obtain();
+        window.mAttrs.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        window.mAttrs.copyFrom(new LayoutParams(parcel));
+        parcel.recycle();
+    }
+
     @Before
     public void setUp() {
         DisplayInfo di = new DisplayInfo(mDisplayInfo);
@@ -69,6 +81,7 @@
         final WindowState cameraUsingWindow = createWindow(null, TYPE_BASE_APPLICATION,
                 "cameraUsingWindow");
         cameraUsingWindow.mAttrs.packageName = "com.android.test";
+        parcelLayoutParams(cameraUsingWindow);
         assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
         assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
         assertEquals(0, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE);
@@ -86,6 +99,7 @@
         final WindowState denylistedWindow = createWindow(null, TYPE_BASE_APPLICATION,
                 "denylistedWindow");
         denylistedWindow.mAttrs.packageName = "com.android.test";
+        parcelLayoutParams(denylistedWindow);
         when(mDenylist.isDenylisted("com.android.test")).thenReturn(true);
         assertEquals(0, mPolicy.getPreferredModeId(denylistedWindow));
         assertEquals(60, mPolicy.getPreferredRefreshRate(denylistedWindow), FLOAT_TOLERANCE);
@@ -97,6 +111,7 @@
                 "overrideWindow");
         overrideWindow.mAttrs.packageName = "com.android.test";
         overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID;
+        parcelLayoutParams(overrideWindow);
         when(mDenylist.isDenylisted("com.android.test")).thenReturn(true);
         assertEquals(LOW_MODE_ID, mPolicy.getPreferredModeId(overrideWindow));
         assertEquals(60, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
@@ -108,6 +123,7 @@
                 "overrideWindow");
         overrideWindow.mAttrs.packageName = "com.android.test";
         overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID;
+        parcelLayoutParams(overrideWindow);
         mPolicy.addNonHighRefreshRatePackage("com.android.test");
         assertEquals(LOW_MODE_ID, mPolicy.getPreferredModeId(overrideWindow));
         assertEquals(0, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
@@ -120,6 +136,7 @@
                 "overrideWindow");
         overrideWindow.mAttrs.packageName = "com.android.test";
         overrideWindow.mAttrs.preferredDisplayModeId = LOW_MODE_ID;
+        parcelLayoutParams(overrideWindow);
         overrideWindow.mActivityRecord.mSurfaceAnimator.startAnimation(
                 overrideWindow.getPendingTransaction(), mock(AnimationAdapter.class),
                 false /* hidden */, ANIMATION_TYPE_APP_TRANSITION);
@@ -134,6 +151,7 @@
         final WindowState cameraUsingWindow = createWindow(null, TYPE_BASE_APPLICATION,
                 "cameraUsingWindow");
         cameraUsingWindow.mAttrs.packageName = "com.android.test";
+        parcelLayoutParams(cameraUsingWindow);
 
         mPolicy.addNonHighRefreshRatePackage("com.android.test");
         assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow));
@@ -152,6 +170,7 @@
     public void testAppMaxRefreshRate() {
         final WindowState window = createWindow(null, TYPE_BASE_APPLICATION, "window");
         window.mAttrs.preferredMaxDisplayRefreshRate = 60f;
+        parcelLayoutParams(window);
         assertEquals(0, mPolicy.getPreferredModeId(window));
         assertEquals(0, mPolicy.getPreferredRefreshRate(window), FLOAT_TOLERANCE);
         assertEquals(60, mPolicy.getPreferredMaxRefreshRate(window), FLOAT_TOLERANCE);
diff --git a/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java b/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java
index 16a2d8d..6606fb0 100644
--- a/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java
+++ b/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java
@@ -182,15 +182,28 @@
                     + "translation state for token=" + token + " taskId=" + taskId);
             return;
         }
+        int translationActivityUid = -1;
         try {
+            IBinder activityToken = taskTopActivityTokens.getActivityToken();
             taskTopActivityTokens.getApplicationThread().updateUiTranslationState(
-                    taskTopActivityTokens.getActivityToken(), state, sourceSpec, targetSpec,
+                    activityToken, state, sourceSpec, targetSpec,
                     viewIds, uiTranslationSpec);
             mLastActivityTokens = new WeakReference<>(taskTopActivityTokens);
+            ComponentName componentName =
+                    mActivityTaskManagerInternal.getActivityName(activityToken);
+            try {
+                if (componentName != null) {
+                    translationActivityUid =
+                            getContext().getPackageManager().getApplicationInfoAsUser(
+                                    componentName.getPackageName(), 0, getUserId()).uid;
+                }
+            } catch (PackageManager.NameNotFoundException e) {
+                Slog.d(TAG, "Cannot find package for" +  componentName);
+            }
         } catch (RemoteException e) {
             Slog.w(TAG, "Update UiTranslationState fail: " + e);
         }
-        invokeCallbacks(state, sourceSpec, targetSpec);
+        invokeCallbacks(state, sourceSpec, targetSpec, translationActivityUid);
     }
 
     @GuardedBy("mLock")
@@ -216,7 +229,8 @@
     }
 
     private void invokeCallbacks(
-            int state, TranslationSpec sourceSpec, TranslationSpec targetSpec) {
+            int state, TranslationSpec sourceSpec, TranslationSpec targetSpec,
+            int translationActivityUid) {
         Bundle res = new Bundle();
         res.putInt(EXTRA_STATE, state);
         // TODO(177500482): Store the locale pair so it can be sent for RESUME events.
@@ -229,6 +243,14 @@
                 LocalServices.getService(InputMethodManagerInternal.class)
                         .getEnabledInputMethodListAsUser(mUserId);
         mCallbacks.broadcast((callback, uid) -> {
+            // callback to the application that is translated if registered.
+            if ((int) uid == translationActivityUid) {
+                try {
+                    callback.sendResult(res);
+                } catch (RemoteException e) {
+                    Slog.w(TAG, "Failed to invoke UiTranslationStateCallback: " + e);
+                }
+            }
             // Code here is non-optimal since it's temporary..
             boolean isIme = false;
             for (InputMethodInfo inputMethod : enabledInputMethods) {
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
index beaca68..fc10fb1 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
@@ -79,7 +79,7 @@
 final class HotwordDetectionConnection {
     private static final String TAG = "HotwordDetectionConnection";
     // TODO (b/177502877): Set the Debug flag to false before shipping.
-    private static final boolean DEBUG = true;
+    static final boolean DEBUG = true;
 
     // TODO: These constants need to be refined.
     private static final long VALIDATION_TIMEOUT_MILLIS = 3000;
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionBinderProxy.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionBinderProxy.java
new file mode 100644
index 0000000..dd9fee3
--- /dev/null
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionBinderProxy.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2021 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.voiceinteraction;
+
+import android.hardware.soundtrigger.SoundTrigger;
+import android.os.RemoteException;
+
+import com.android.internal.app.IHotwordRecognitionStatusCallback;
+import com.android.internal.app.IVoiceInteractionSoundTriggerSession;
+
+/**
+ * A remote object that simply proxies calls to a real {@link IVoiceInteractionSoundTriggerSession}
+ * implementation. This design pattern allows us to add decorators to the core implementation
+ * (simply wrapping a binder object does not work).
+ */
+final class SoundTriggerSessionBinderProxy extends IVoiceInteractionSoundTriggerSession.Stub {
+
+    private final IVoiceInteractionSoundTriggerSession mDelegate;
+
+    SoundTriggerSessionBinderProxy(IVoiceInteractionSoundTriggerSession delegate) {
+        mDelegate = delegate;
+    }
+
+    @Override
+    public SoundTrigger.ModuleProperties getDspModuleProperties() throws RemoteException {
+        return mDelegate.getDspModuleProperties();
+    }
+
+    @Override
+    public int startRecognition(int i, String s,
+            IHotwordRecognitionStatusCallback iHotwordRecognitionStatusCallback,
+            SoundTrigger.RecognitionConfig recognitionConfig, boolean b) throws RemoteException {
+        return mDelegate.startRecognition(i, s, iHotwordRecognitionStatusCallback,
+                recognitionConfig, b);
+    }
+
+    @Override
+    public int stopRecognition(int i,
+            IHotwordRecognitionStatusCallback iHotwordRecognitionStatusCallback)
+            throws RemoteException {
+        return mDelegate.stopRecognition(i, iHotwordRecognitionStatusCallback);
+    }
+
+    @Override
+    public int setParameter(int i, int i1, int i2) throws RemoteException {
+        return mDelegate.setParameter(i, i1, i2);
+    }
+
+    @Override
+    public int getParameter(int i, int i1) throws RemoteException {
+        return mDelegate.getParameter(i, i1);
+    }
+
+    @Override
+    public SoundTrigger.ModelParamRange queryParameter(int i, int i1) throws RemoteException {
+        return mDelegate.queryParameter(i, i1);
+    }
+}
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java
new file mode 100644
index 0000000..bb7ca16
--- /dev/null
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2021 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.voiceinteraction;
+
+import static android.Manifest.permission.CAPTURE_AUDIO_HOTWORD;
+import static android.Manifest.permission.RECORD_AUDIO;
+
+import static com.android.server.voiceinteraction.HotwordDetectionConnection.DEBUG;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.content.PermissionChecker;
+import android.hardware.soundtrigger.SoundTrigger;
+import android.media.permission.Identity;
+import android.media.permission.PermissionUtil;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.ServiceSpecificException;
+import android.text.TextUtils;
+import android.util.Slog;
+
+import com.android.internal.app.IHotwordRecognitionStatusCallback;
+import com.android.internal.app.IVoiceInteractionSoundTriggerSession;
+
+/**
+ * Decorates {@link IVoiceInteractionSoundTriggerSession} with permission checks for {@link
+ * android.Manifest.permission#RECORD_AUDIO} and
+ * {@link android.Manifest.permission#CAPTURE_AUDIO_HOTWORD}.
+ * <p>
+ * Does not implement {@link #asBinder()} as it's intended to be wrapped by an
+ * {@link IVoiceInteractionSoundTriggerSession.Stub} object.
+ */
+final class SoundTriggerSessionPermissionsDecorator implements
+        IVoiceInteractionSoundTriggerSession {
+    static final String TAG = "SoundTriggerSessionPermissionsDecorator";
+
+    private final IVoiceInteractionSoundTriggerSession mDelegate;
+    private final Context mContext;
+    private final Identity mOriginatorIdentity;
+
+    SoundTriggerSessionPermissionsDecorator(IVoiceInteractionSoundTriggerSession delegate,
+            Context context, Identity originatorIdentity) {
+        mDelegate = delegate;
+        mContext = context;
+        mOriginatorIdentity = originatorIdentity;
+    }
+
+    @Override
+    public SoundTrigger.ModuleProperties getDspModuleProperties() throws RemoteException {
+        // No permission needed.
+        return mDelegate.getDspModuleProperties();
+    }
+
+    @Override
+    public int startRecognition(int i, String s,
+            IHotwordRecognitionStatusCallback iHotwordRecognitionStatusCallback,
+            SoundTrigger.RecognitionConfig recognitionConfig, boolean b) throws RemoteException {
+        if (DEBUG) {
+            Slog.d(TAG, "startRecognition");
+        }
+        enforcePermissions();
+        return mDelegate.startRecognition(i, s, iHotwordRecognitionStatusCallback,
+                recognitionConfig, b);
+    }
+
+    @Override
+    public int stopRecognition(int i,
+            IHotwordRecognitionStatusCallback iHotwordRecognitionStatusCallback)
+            throws RemoteException {
+        enforcePermissions();
+        return mDelegate.stopRecognition(i, iHotwordRecognitionStatusCallback);
+    }
+
+    @Override
+    public int setParameter(int i, int i1, int i2) throws RemoteException {
+        enforcePermissions();
+        return mDelegate.setParameter(i, i1, i2);
+    }
+
+    @Override
+    public int getParameter(int i, int i1) throws RemoteException {
+        enforcePermissions();
+        return mDelegate.getParameter(i, i1);
+    }
+
+    @Override
+    public SoundTrigger.ModelParamRange queryParameter(int i, int i1) throws RemoteException {
+        enforcePermissions();
+        return mDelegate.queryParameter(i, i1);
+    }
+
+    @Override
+    public IBinder asBinder() {
+        throw new UnsupportedOperationException(
+                "This object isn't intended to be used as a Binder.");
+    }
+
+    // TODO: Share this code with SoundTriggerMiddlewarePermission.
+    private void enforcePermissions() {
+        enforcePermissionForPreflight(mContext, mOriginatorIdentity, RECORD_AUDIO);
+        enforcePermissionForPreflight(mContext, mOriginatorIdentity, CAPTURE_AUDIO_HOTWORD);
+    }
+
+    /**
+     * Throws a {@link SecurityException} if originator permanently doesn't have the given
+     * permission, or a {@link ServiceSpecificException} with a {@link
+     * #TEMPORARY_PERMISSION_DENIED} if caller originator doesn't have the given permission.
+     *
+     * @param context    A {@link Context}, used for permission checks.
+     * @param identity   The identity to check.
+     * @param permission The identifier of the permission we want to check.
+     */
+    private static void enforcePermissionForPreflight(@NonNull Context context,
+            @NonNull Identity identity, @NonNull String permission) {
+        final int status = PermissionUtil.checkPermissionForPreflight(context, identity,
+                permission);
+        switch (status) {
+            case PermissionChecker.PERMISSION_GRANTED:
+                return;
+            case PermissionChecker.PERMISSION_HARD_DENIED:
+                throw new SecurityException(
+                        TextUtils.formatSimple("Failed to obtain permission %s for identity %s",
+                                permission, toString(identity)));
+            case PermissionChecker.PERMISSION_SOFT_DENIED:
+                throw new ServiceSpecificException(TEMPORARY_PERMISSION_DENIED,
+                        TextUtils.formatSimple("Failed to obtain permission %s for identity %s",
+                                permission, toString(identity)));
+            default:
+                throw new RuntimeException("Unexpected permission check result.");
+        }
+    }
+
+    private static String toString(Identity identity) {
+        return "{uid=" + identity.uid
+                + " pid=" + identity.pid
+                + " packageName=" + identity.packageName
+                + " attributionTag=" + identity.attributionTag
+                + "}";
+    }
+
+    // Temporary hack for using the same status code as SoundTrigger, so we don't change behavior.
+    // TODO: Reuse SoundTrigger code so we don't need to do this.
+    private static final int TEMPORARY_PERMISSION_DENIED = 3;
+}
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index 162acba..91d17f7 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -23,6 +23,7 @@
 import android.annotation.UserIdInt;
 import android.app.ActivityManager;
 import android.app.ActivityManagerInternal;
+import android.app.ActivityThread;
 import android.app.AppGlobals;
 import android.app.role.OnRoleHoldersChangedListener;
 import android.app.role.RoleManager;
@@ -50,6 +51,7 @@
 import android.hardware.soundtrigger.SoundTrigger.RecognitionConfig;
 import android.media.AudioFormat;
 import android.media.permission.Identity;
+import android.media.permission.IdentityContext;
 import android.media.permission.PermissionUtil;
 import android.media.permission.SafeCloseable;
 import android.os.Binder;
@@ -59,6 +61,7 @@
 import android.os.Parcel;
 import android.os.ParcelFileDescriptor;
 import android.os.PersistableBundle;
+import android.os.Process;
 import android.os.RemoteCallback;
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
@@ -104,11 +107,8 @@
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
-import java.lang.ref.WeakReference;
 import java.util.ArrayList;
-import java.util.LinkedList;
 import java.util.List;
-import java.util.ListIterator;
 import java.util.Locale;
 import java.util.Objects;
 import java.util.concurrent.Executor;
@@ -288,7 +288,6 @@
         private boolean mTemporarilyDisabled;
 
         private final boolean mEnableService;
-        private final List<WeakReference<SoundTriggerSession>> mSessions = new LinkedList<>();
 
         VoiceInteractionManagerServiceStub() {
             mEnableService = shouldEnableService(mContext);
@@ -299,15 +298,49 @@
         public @NonNull IVoiceInteractionSoundTriggerSession createSoundTriggerSessionAsOriginator(
                 @NonNull Identity originatorIdentity, IBinder client) {
             Objects.requireNonNull(originatorIdentity);
-            try (SafeCloseable ignored = PermissionUtil.establishIdentityDirect(
-                    originatorIdentity)) {
-                SoundTriggerSession session = new SoundTriggerSession(
-                        mSoundTriggerInternal.attach(client));
-                synchronized (mSessions) {
-                    mSessions.add(new WeakReference<>(session));
-                }
-                return session;
+            boolean forHotwordDetectionService;
+            synchronized (VoiceInteractionManagerServiceStub.this) {
+                enforceIsCurrentVoiceInteractionService();
+                forHotwordDetectionService =
+                        mImpl != null && mImpl.mHotwordDetectionConnection != null;
             }
+            IVoiceInteractionSoundTriggerSession session;
+            if (forHotwordDetectionService) {
+                // Use our own identity and handle the permission checks ourselves. This allows
+                // properly checking/noting against the voice interactor or hotword detection
+                // service as needed.
+                if (HotwordDetectionConnection.DEBUG) {
+                    Slog.d(TAG, "Creating a SoundTriggerSession for a HotwordDetectionService");
+                }
+                originatorIdentity.uid = Binder.getCallingUid();
+                originatorIdentity.pid = Binder.getCallingPid();
+                session = new SoundTriggerSessionPermissionsDecorator(
+                        createSoundTriggerSessionForSelfIdentity(client),
+                        mContext,
+                        originatorIdentity);
+            } else {
+                if (HotwordDetectionConnection.DEBUG) {
+                    Slog.d(TAG, "Creating a SoundTriggerSession");
+                }
+                try (SafeCloseable ignored = PermissionUtil.establishIdentityDirect(
+                        originatorIdentity)) {
+                    session = new SoundTriggerSession(mSoundTriggerInternal.attach(client));
+                }
+            }
+            return new SoundTriggerSessionBinderProxy(session);
+        }
+
+        private IVoiceInteractionSoundTriggerSession createSoundTriggerSessionForSelfIdentity(
+                IBinder client) {
+            Identity identity = new Identity();
+            identity.uid = Process.myUid();
+            identity.pid = Process.myPid();
+            identity.packageName = ActivityThread.currentOpPackageName();
+            return Binder.withCleanCallingIdentity(() -> {
+                try (SafeCloseable ignored = IdentityContext.create(identity)) {
+                    return new SoundTriggerSession(mSoundTriggerInternal.attach(client));
+                }
+            });
         }
 
         // TODO: VI Make sure the caller is the current user or profile
@@ -1334,7 +1367,11 @@
             return null;
         }
 
-        class SoundTriggerSession extends IVoiceInteractionSoundTriggerSession.Stub {
+        /**
+         * Implementation of SoundTriggerSession. Does not implement {@link #asBinder()} as it's
+         * intended to be wrapped by an {@link IVoiceInteractionSoundTriggerSession.Stub} object.
+         */
+        private class SoundTriggerSession implements IVoiceInteractionSoundTriggerSession {
             final SoundTriggerInternal.Session mSession;
             private IHotwordRecognitionStatusCallback mSessionExternalCallback;
             private IRecognitionStatusCallback mSessionInternalCallback;
@@ -1481,6 +1518,12 @@
                 }
             }
 
+            @Override
+            public IBinder asBinder() {
+                throw new UnsupportedOperationException(
+                        "This object isn't intended to be used as a Binder.");
+            }
+
             private int unloadKeyphraseModel(int keyphraseId) {
                 final long caller = Binder.clearCallingIdentity();
                 try {
@@ -1709,22 +1752,6 @@
             }
 
             mSoundTriggerInternal.dump(fd, pw, args);
-
-            // Dump all sessions.
-            synchronized (mSessions) {
-                ListIterator<WeakReference<SoundTriggerSession>> iter =
-                        mSessions.listIterator();
-                while (iter.hasNext()) {
-                    SoundTriggerSession session = iter.next().get();
-                    if (session != null) {
-                        session.dump(fd, args);
-                    } else {
-                        // Session is obsolete, now is a good chance to remove it from the list.
-                        iter.remove();
-                    }
-                }
-            }
-
         }
 
         @Override
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 7f1ea8f..e03e74c 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -4370,7 +4370,7 @@
                     new String[] {});
             defaults.putBoolean(KEY_ENABLE_PRESENCE_CAPABILITY_EXCHANGE_BOOL, false);
             defaults.putBoolean(KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL, false);
-            defaults.putBoolean(KEY_ENABLE_PRESENCE_GROUP_SUBSCRIBE_BOOL, true);
+            defaults.putBoolean(KEY_ENABLE_PRESENCE_GROUP_SUBSCRIBE_BOOL, false);
             defaults.putInt(KEY_NON_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC_INT, 30 * 24 * 60 * 60);
             defaults.putBoolean(KEY_RCS_REQUEST_FORBIDDEN_BY_SIP_489_BOOL, false);
             defaults.putLong(KEY_RCS_REQUEST_RETRY_INTERVAL_MILLIS_LONG, 20 * 60 * 1000);
diff --git a/telephony/java/android/telephony/NetworkRegistrationInfo.java b/telephony/java/android/telephony/NetworkRegistrationInfo.java
index 5fb60d7..6a80766 100644
--- a/telephony/java/android/telephony/NetworkRegistrationInfo.java
+++ b/telephony/java/android/telephony/NetworkRegistrationInfo.java
@@ -506,6 +506,8 @@
     }
 
     /**
+     * Require {@link android.Manifest.permission#ACCESS_FINE_LOCATION}, otherwise return null.
+     *
      * @return The cell information.
      */
     @Nullable
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index 6da61b7..d745dc2 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -758,6 +758,11 @@
      * In GSM/UMTS, long format can be up to 16 characters long.
      * In CDMA, returns the ERI text, if set. Otherwise, returns the ONS.
      *
+     * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+     * caller does not hold neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+     *
      * @return long name of operator, null if unregistered or unknown
      */
     public String getOperatorAlphaLong() {
@@ -766,6 +771,12 @@
 
     /**
      * Get current registered voice network operator name in long alphanumeric format.
+     *
+     * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+     * caller does not hold neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+     *
      * @return long name of operator
      * @hide
      */
@@ -780,6 +791,11 @@
      *
      * In GSM/UMTS, short format can be up to 8 characters long.
      *
+     * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+     * caller does not hold neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+     *
      * @return short name of operator, null if unregistered or unknown
      */
     public String getOperatorAlphaShort() {
@@ -788,6 +804,12 @@
 
     /**
      * Get current registered voice network operator name in short alphanumeric format.
+     *
+     * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+     * caller does not have neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+     *
      * @return short name of operator, null if unregistered or unknown
      * @hide
      */
@@ -799,6 +821,12 @@
 
     /**
      * Get current registered data network operator name in short alphanumeric format.
+     *
+     * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+     * caller does not have neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+     *
      * @return short name of operator, null if unregistered or unknown
      * @hide
      */
@@ -812,6 +840,11 @@
      * Get current registered operator name in long alphanumeric format if
      * available or short otherwise.
      *
+     * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+     * caller does not hold neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+     *
      * @see #getOperatorAlphaLong
      * @see #getOperatorAlphaShort
      *
@@ -832,6 +865,11 @@
      * In GSM/UMTS, numeric format is 3 digit country code plus 2 or 3 digit
      * network code.
      *
+     * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+     * caller does not hold neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+     *
      * @return numeric format of operator, null if unregistered or unknown
      */
     /*
@@ -844,6 +882,12 @@
 
     /**
      * Get current registered voice network operator numeric id.
+     *
+     * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+     * caller does not hold neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+     *
      * @return numeric format of operator, null if unregistered or unknown
      * @hide
      */
@@ -854,6 +898,12 @@
 
     /**
      * Get current registered data network operator numeric id.
+     *
+     * Require at least {@link android.Manifest.permission#ACCESS_FINE_LOCATION} or
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Otherwise return null if the
+     * caller does not hold neither {@link android.Manifest.permission#ACCESS_FINE_LOCATION} nor
+     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
+     *
      * @return numeric format of operator, null if unregistered or unknown
      * @hide
      */
diff --git a/telephony/java/android/telephony/data/QosBearerFilter.java b/telephony/java/android/telephony/data/QosBearerFilter.java
index 5642549..54930d0 100644
--- a/telephony/java/android/telephony/data/QosBearerFilter.java
+++ b/telephony/java/android/telephony/data/QosBearerFilter.java
@@ -57,6 +57,12 @@
     public static final int QOS_PROTOCOL_UDP = android.hardware.radio.V1_6.QosProtocol.UDP;
     public static final int QOS_PROTOCOL_ESP = android.hardware.radio.V1_6.QosProtocol.ESP;
     public static final int QOS_PROTOCOL_AH = android.hardware.radio.V1_6.QosProtocol.AH;
+    public static final int QOS_MIN_PORT = android.hardware.radio.V1_6.QosPortRange.MIN;
+    /**
+     * Hardcoded inplace of android.hardware.radio.V1_6.QosPortRange.MAX as it
+     * returns -1 due to uint16_t to int conversion in java. (TODO: Fix the HAL)
+     */
+    public static final int QOS_MAX_PORT = 65535; // android.hardware.radio.V1_6.QosPortRange.MIN;
 
     @QosProtocol
     private int protocol;
@@ -229,6 +235,12 @@
             return end;
         }
 
+        public boolean isValid() {
+            return start >= QOS_MIN_PORT && start <= QOS_MAX_PORT
+                    && end >= QOS_MIN_PORT && end <= QOS_MAX_PORT
+                    && start <= end;
+        }
+
         @Override
         public void writeToParcel(@NonNull Parcel dest, int flags) {
             dest.writeInt(start);
diff --git a/telephony/java/android/telephony/ims/RcsContactUceCapability.java b/telephony/java/android/telephony/ims/RcsContactUceCapability.java
index 530003d..9112118 100644
--- a/telephony/java/android/telephony/ims/RcsContactUceCapability.java
+++ b/telephony/java/android/telephony/ims/RcsContactUceCapability.java
@@ -331,7 +331,7 @@
             return null;
         }
         for (RcsContactPresenceTuple tuple : mPresenceTuples) {
-            if (tuple.getServiceId().equals(serviceId)) {
+            if (tuple.getServiceId() != null && tuple.getServiceId().equals(serviceId)) {
                 return tuple;
             }
         }
diff --git a/tests/PlatformCompatGating/test-rules/src/android/compat/testing/PlatformCompatChangeRule.java b/tests/PlatformCompatGating/test-rules/src/android/compat/testing/PlatformCompatChangeRule.java
index 039ba51..0c5205c 100644
--- a/tests/PlatformCompatGating/test-rules/src/android/compat/testing/PlatformCompatChangeRule.java
+++ b/tests/PlatformCompatGating/test-rules/src/android/compat/testing/PlatformCompatChangeRule.java
@@ -118,7 +118,8 @@
                     Manifest.permission.LOG_COMPAT_CHANGE,
                     Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG,
                     Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD,
-                    Manifest.permission.READ_COMPAT_CHANGE_CONFIG);
+                    Manifest.permission.READ_COMPAT_CHANGE_CONFIG,
+                    Manifest.permission.INTERACT_ACROSS_USERS_FULL);
         }
     }
 }